【问题标题】:Lemon Parser-Generator: Are nonterminals not evaluated?Lemon Parser-Generator:不评估非终结符吗?
【发布时间】:2010-10-23 08:36:45
【问题描述】:

我尝试学习解析器。因为我的 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”。柠檬不关心评价吗?我必须以某种方式自己做吗?但是,如果我在这一点上一无所获呢?

【问题讨论】:

    标签: php parser-generator lemon


    【解决方案1】:

    你不想要类似的东西:

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

    【讨论】:

    • 啊,所以即使在简单的情况下,你也必须清楚地说明应该发生什么,否则他什么都不做。好的。谢谢!
    • 很奇怪不是吗?它与主要设计目标之一是一致的:使编写语法更不容易出错。从某种意义上说,这种设计选择似乎适得其反,当你告诉它什么都不做时,它什么也不做,当你很少真的什么都不想要时,你想要一个隐含的 A = B(如果你知道我的意思的话)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    相关资源
    最近更新 更多