2010-02-20 131 views
0

我正在構建一個模板解析器。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不能處理直接遞歸?或者是別的什麼?

+0

你有遞歸函數調用嗎?如果不是分段錯誤可能表明您已遇到PHP錯誤。 – e4c5 2010-02-20 06:33:03

+0

@ e4c5 如上所述,是的,我有遞歸函數調用。爲什麼PHP會在遞歸時崩潰?口譯員很難嗎? – VDVLeon 2010-02-20 14:58:03

+1

遞歸本身對於PHP來說並不難。但是,如果出於某種原因不符合退出條件,遞歸將無限期地繼續,吸收所有可用內存和CPU,直到程序或腳本崩潰。幾乎所有的編程語言都是如此。 – e4c5 2010-02-20 15:11:42

回答

0

我敢肯定,這是您的代碼清理過程中的疏忽,但您有額外的{這是不關閉。

+0

你說得對。格式化郵件的代碼時,我做錯了什麼。但是這在實際的代碼中是錯誤的。 – VDVLeon 2010-02-20 03:18:13

+0

您是否在parseRecursive()中嘗試過die()以確保該bug沒有更深入?也許傾銷你的參數,以確保你得到你所期望的? – 2010-02-20 03:22:52

+0

當我把死()在parseRecursive是得到死的輸出。 – VDVLeon 2010-02-20 03:27:48