这更像是一个“原则上”问题,而不是一个实际问题。是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
如果使用语义操作定义了此更改的规则吗?
答案 0 :(得分:4)
是的,它可以。 Yacc创建一个LALR(1)解析器 - (1)表示前瞻的1个令牌 - 因此它可以在减少该规则之前读取令牌的末尾之前的1个令牌。语义动作的存在是无关紧要的,因为语义动作只是在减少规则之前运行的一些C代码。
请注意,无法保证它始终会提前读取令牌。由yacc或bison创建的解析器有时会使用“默认缩减” - 可以减少规则的状态,而不必先读取下一个令牌。只要规则的减少与下一个令牌无关,就会发生这种情况。
在这个具体的例子中,默认缩减可以用于integer
规则,因此它可以在没有前瞻的情况下减少它,但同样不能保证 - 默认缩减是某些人使用的优化(但不是全部) )yacc的实现。