Parsing 是否在Yacc中定义了还原顺序?

Parsing 是否在Yacc中定义了还原顺序?,parsing,bison,yacc,parser-generator,lalr,Parsing,Bison,Yacc,Parser Generator,Lalr,这与其说是一个实际问题,不如说是一个“原则”问题。是Yacc减少生产并从定义的lexer读取新标记的顺序。也就是说,如果我有以下一组令牌: INTEGER_BEGIN INTEGER_VALUE LESS_THAN INTEGER_BEGIN INTEGER_VALUE Yacc是否可以在语义范围内从lexer中读取LESS\u THAN标记,然后将INTEGER BEGIN INTEGER\u值减少为一个值,给定一组产品,如: expr : expr LESS_THAN expr

这与其说是一个实际问题,不如说是一个“原则”问题。是Yacc减少生产并从定义的lexer读取新标记的顺序。也就是说,如果我有以下一组令牌:

INTEGER_BEGIN
INTEGER_VALUE
LESS_THAN
INTEGER_BEGIN
INTEGER_VALUE
Yacc是否可以在语义范围内从lexer中读取
LESS\u THAN
标记,然后将
INTEGER BEGIN INTEGER\u值
减少为一个值,给定一组产品,如:

expr : expr LESS_THAN expr
     | integer

integer : INTEGER_BEGIN INTEGER_VALUE

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

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

请注意,不能保证它总是提前读取令牌。yacc或bison创建的解析器有时使用“默认缩减”——在这种情况下,它可以缩减规则,而不必首先读取下一个令牌。每当规则的缩减独立于下一个标记时,就会发生这种情况


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

是否有办法知道是否发生了这种情况?包含默认缩减语义的完整描述,并且,正如您所指出的,会导致lexer调用延迟。在某些版本的bison中,您可以在操作中检查
if(yychar==yymempty)
,以查看您是否处于默认缩减中(因此没有读取前瞻),但这不是非常可移植的。