Lemon Parser-Generator:非终端未评估?

时间:2010-10-23 08:36:46

标签: php parser-generator lemon

我尝试学习解析器。因为我的C技能非常低,所以我用Google搜索PHP Lemon来学习解析器生成器。无论如何,这里的代码对于普通的柠檬朋友来说也应该是可读的。

与处理解析问题一样,我首先尝试生成一个简单的计算器。

所以我的第一步就是:

start(A)   ::= expr(B). {echo "======RESULT:".A.":".B.":=========".PHP_EOL;}

解析第一个测试:

include "mysimple.php"; //include the generated Parser
$P = new ParseParser(); //create a Parser object
$P->Parse(ParseParser::VALUE,"13"); // here is the simple test, just understand the Number 13, pls
$P->Parse(0,0); //input is finished, parse!
echo "finished. yeah!".PHP_EOL;

...结果:

======RESULT:13:=========
finished. yeah!

所以,一切都如预期的那样。现在我们尝试准备一个最终将允许我们处理操作的步骤expression

start ::= expr(B).  {echo "======RESULT:".B.":=========".PHP_EOL;}
expr  ::= VALUE(B). {echo "got a value:".B.PHP_EOL;}

当我现在运行相同的测试时,我希望看到相同的输出,加上一行got a value: 13。但我得到了这个:

got a value:13
======RESULT::=========
finished. yeah!

嗯,发生了什么?为什么结果行为空?显然expr评估为{13}的VALUE。 Lemon不关心评估吗?我必须以某种方式做到这一点吗?但是,如果我在这一点上什么也得不到呢?

1 个答案:

答案 0 :(得分:2)

你不想要这样的东西:

expr(A) ::= VALUE(B). {A = B; echo "got a value:".B.PHP_EOL;}