6

这更像是一个“原则上”的问题,而不是一个实际的问题。是 Yacc 减少产生式并从定义的词法分析器中读取新标记的顺序。也就是说,如果我有以下一组令牌:

INTEGER_BEGIN
INTEGER_VALUE
LESS_THAN
INTEGER_BEGIN
INTEGER_VALUE

Yacc 是否可以在其语义范围内LESS_THAN从词法分析器中读取标记,然后再将其简化INTEGER BEGIN INTEGER_VALUE为单个事物,给定一组产生式,例如:

expr : expr LESS_THAN expr
     | integer

integer : INTEGER_BEGIN INTEGER_VALUE

如果这些规则是用语义动作定义的,这些规则会改变吗?

4

1 回答 1

4

是的,它可以。Yacc 创建了一个 LALR(1) 解析器——(1) 表示前瞻的 1 个标记——因此它可以在减少规则之前提前读取 1 个标记超出规则的标记末尾。语义动作的存在是无关紧要的,因为语义动作只是在减少规则之前运行的一些 C 代码。

请注意,不能保证它总是会提前读取令牌。由 yacc 或 bison 创建的解析器有时会使用“默认归约”——表明它可以归约规则而不必先读取下一个标记。只要规则的减少与下一个标记无关,就会发生这种情况。

在这个特定的例子中,可以对integer规则使用默认缩减,因此它可能会在没有前瞻的情况下缩减它,但同样不能保证——默认缩减是 yacc 的某些(但不是全部)实现使用的优化。

于 2012-09-08T20:48:33.273 回答