我正在構建一個模板解析器。PHP失敗,沒有錯誤
模板解析器是這樣的:
- 記號化(使爲模板代碼的每個部分令牌)
- 解析
- 用我ParserHelper類。您可以爲此係統添加規則,然後它會檢查令牌列表以獲取有效的語法。
- 添加/更改一些令牌額外的功能
- 編譯(翻譯爲PHP(用於快速轉換爲HTML))
分析器助手是這個結構的類:
- protected function parseRecursive(& $ offset,$ ruleName)
- protected function tryOption(& $偏移,vdParserHelperRuleOption & $選項)
- 保護的函數tryItem(& $偏移,vdParserHelperRuleOptionItem & $項目,$計數)
偏移代表所述令牌偏移(因此偏移量= 0表示第一令牌解析等)
我的解析器幫手規則有這樣的結構:
- 規則
-
個
- 選項
- 項目
- 選項
對於人們如何知道一個上下文無關文法是什麼:
規則 - > <選項1> | < option2> | ... | < optionN>
與選項X是labda(空選項)或的列表:
- 一個 '規則鏈接'(一個鏈接到其它規則(可以是遞歸))或
- 一個'令牌'
所以函數parseRecursive調用tryOption,tryOption調用tryItem和tryItem可以調用parseRecursive方法。
的錯誤是在功能tryItem:
...
// Try item
if($item->getType()==vdParserHelperRuleOptionItem::RuleLink){
///// The next line !!!!!!!!!!!!!
if(!$this->parseRecursive($currentOffset, $item->getData())){
///// The previous line !!!!!!!!!
return $item->isOptional();
}
}else if($item->getType()==vdParserHelperRuleOptionItem::Type){
...
}
...
當我刪除(替換它,如果(真){左右)執行PHP代碼「的」註釋之間線。但是當我不刪除該行php不執行我的代碼和輸出什麼都沒有,我沒有得到任何錯誤。當我看到在Apache日誌文件,我得到這個錯誤:
[notice] child pid 11957 exit signal Segmentation fault (11)
這是PHP的一個故障,或者可以在PHP不能處理直接遞歸?或者是別的什麼?
你有遞歸函數調用嗎?如果不是分段錯誤可能表明您已遇到PHP錯誤。 – e4c5 2010-02-20 06:33:03
@ e4c5 如上所述,是的,我有遞歸函數調用。爲什麼PHP會在遞歸時崩潰?口譯員很難嗎? – VDVLeon 2010-02-20 14:58:03
遞歸本身對於PHP來說並不難。但是,如果出於某種原因不符合退出條件,遞歸將無限期地繼續,吸收所有可用內存和CPU,直到程序或腳本崩潰。幾乎所有的編程語言都是如此。 – e4c5 2010-02-20 15:11:42