PHP失败,没有错误

时间:2010-02-20 03:07:10

标签: php parsing templates recursion

我正在构建模板解析器。

模板解析器的工作方式如下:

  • Tokenize(为模板代码的每个部分制作一个标记)
  • 解析
    • 使用我的ParserHelper类。您可以为此系统添加规则,然后检查令牌列表中的有效语法。
    • 添加/更改一些令牌以获得额外功能
  • 编译(转换为php(用于快速转换为html))

解析器助手是具有以下结构的类:

  • protected function parseRecursive(& $ offset,$ ruleName)
  • 受保护的功能tryOption(& $ offset,vdParserHelperRuleOption& $ option)
  • 受保护的函数tryItem(& $ offset,vdParserHelperRuleOptionItem& $ item,$ count)

Offset代表令牌偏移量(因此offset = 0表示要解析的第一个令牌等)

我的解析器帮助程序规则具有以下结构:

  • 规则
    • 选项
      • 产品

对于人们来说,如何知道无上下文语法是什么:

规则 - > < option1> | < option2> | ...... | < optionN>

带有optionX的

是labda(空选项)或列表:

  • “规则链接”(指向其他规则的链接(可以是递归))或
  • '令牌'

所以函数parseRecursive调用tryOption,tryOption调用tryItem,tryItem可以调用parseRecursive agian。

错误在函数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){
    ...
}
...

当我删除(替换为if(true){或者替换它''''注释之间的行时,执行php代码。但是,当我不删除该行时,php不执行我的代码并输出任何内容,我根本没有得到任何错误。当我查看apache日志文件时,我收到此错误:

[notice] child pid 11957 exit signal Segmentation fault (11)

这是php中的错误,还是php无法处理直接递归?还是别的什么?

1 个答案:

答案 0 :(得分:0)

我确信这是对你的代码清理过程中的疏忽,但是你有一个额外的{没有关闭。