我尝试学习解析器。因为我的 C 技能相当低,我用谷歌搜索了一个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
评估为VALUE
“13”。柠檬不关心评价吗?我必须以某种方式自己做吗?但是,如果我在这一点上一无所获呢?