ANTLR4中奇怪的语义谓词行为可能是一个错误



这是我的C解析语法的一个工作子集。它只能解析下面显示的输入,但足以说明我的完整语法遇到的问题。请注意,它遵循传统方法来定义运算符优先级:

grammar CPPProcessor;
translation_unit:    expression;
primary_expression:
'1'
//|  {false}? '(' expression ')'
| 'a'
| 'b'
;
postfix_expression:
primary_expression
| postfix_expression '(' expression ')'
;
unary_expression:
postfix_expression
| '-' cast_expression
;
cast_expression:
unary_expression
| '(' 'a' ')' cast_expression
;
additive_expression:
cast_expression
| additive_expression '-' cast_expression
;
expression :  additive_expression;
WS: [ tf]+    -> channel(1);
CRLF: 'r'? 'n' -> channel(1);

调用规则是translation_unit的,输入是包含以下内容的单行:

(a)-b

请注意,primary_expression中的语义谓词已被注释掉。 (解释语法的方法是,当启用第二个primary_expression规则时,输入被解析为减法。当子规则不存在时,它将成为 C 样式类型转换-ba)。

问题:真正的问题是,我认为拥有{false}?相当于一无所有,因此删除评论应该没有区别。但是,当我删除注释时解析失败,即

primary_expression:
'1'
|  {false}? '(' expression ')'
| 'a'
| 'b'
;

并得到此错误:

line 1:0 no viable alternative at input '('

为什么具有{false}?语义谓词会导致解析失败?可能是ANLTR4中的错误吗? 看起来postfix_expression中的第二个子规则导致了左递归的问题。删除左递归后,问题消失

我想出了问题所在。

语义谓词不能导致上层规则回溯并尝试另一个子规则。因此,当primary_expression的第二个子规则未注释时,它会公开另一个"("匹配规则,并允许为输入选择cast_expression的第一个子规则。但是一旦做出这个选择,即使进一步子规则中的某些语义谓词返回 false,也无法撤消。语义谓词只能导致选择primary_expression的其他一些子规则。但是由于primary_expression中没有任何其他子规则可以匹配"("。解析失败。

相关内容

  • 没有找到相关文章

最新更新