是否在Yacc中定义了减少的顺序?

时间:2012-09-08 13:20:43

标签: parsing bison yacc parser-generator lalr

这更像是一个“原则上”问题,而不是一个实际问题。是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

如果使用语义操作定义了此更改的规则吗?

1 个答案:

答案 0 :(得分:4)

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

请注意,无法保证它始终会提前读取令牌。由yacc或bison创建的解析器有时会使用“默认缩减” - 可以减少规则的状态,而不必先读取下一个令牌。只要规则的减少与下一个令牌无关,就会发生这种情况。

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