Ale*_*nor 6 parsing yacc lalr bison parser-generator
这更像是一个"原则上"问题,而不是一个实际问题.是Yacc减少产生的顺序,并从定义的词法分析器中读取新的标记.也就是说,如果我有以下一组令牌:
INTEGER_BEGIN
INTEGER_VALUE
LESS_THAN
INTEGER_BEGIN
INTEGER_VALUE
Run Code Online (Sandbox Code Playgroud)
Yacc可以在其语义中读取LESS_THAN词法分析器中的令牌,然后将其缩减INTEGER BEGIN INTEGER_VALUE为单个内容,给出一组产生,例如:
expr : expr LESS_THAN expr
| integer
integer : INTEGER_BEGIN INTEGER_VALUE
Run Code Online (Sandbox Code Playgroud)
如果使用语义操作定义了这些更改的规则吗?
是的,它可以。Yacc 创建一个 LALR(1) 解析器——(1) 意味着先行 1 个标记——因此它可以在减少该规则之前提前读取超过标记末尾的 1 个标记。语义动作的存在是无关紧要的,因为语义动作只是在减少规则之前运行的一些 C 代码。
请注意,不能保证它将始终预读令牌。由 yacc 或 bison 创建的解析器有时会使用“默认缩减”——说明它可以缩减规则而无需先读取下一个标记。只要规则的减少独立于下一个标记,就会发生这种情况。
在这个特定的示例中,默认减少可以用于规则integer,因此它可能会在没有前瞻的情况下减少它,但同样没有保证——默认减少是 yacc 的一些(但不是全部)实现使用的优化。
| 归档时间: |
|
| 查看次数: |
1173 次 |
| 最近记录: |