我有一个表达式规则,如下所示:
expression : '(' expression ')' # ParenthesizedExpression
| literal # LiteralExpression
| identifier # IdentifierExpression
| functionCall # FunctionCallExpression
| Minus expression # UnaryNumericExpression
| Not expression # LogicalNotExpression
| expression Caret<assoc=right> expression # BinaryNumericExpression
| expression (Times|DividedBy|ModuloDiv) expression # BinaryNumericExpression
| expression (Plus|Minus) expression # BinaryNumericExpression
| expression '='<assoc=right> expression # AssignmentExpression
| expression PlusEquals<assoc=right> expression # AssignmentExpression
| expression MinusEquals<assoc=right> expression # AssignmentExpression
| expression TimesEquals<assoc=right> expression # AssignmentExpression
| expression DivdedByEquals<assoc=right> expression # AssignmentExpression
| expression ModuloEquals<assoc=right> expression # AssignmentExpression
;
BinaryNumericExpression
和AssignmentExpression
的规则标签仅为侦听器创建一组enterXXX
和exitXXX
方法,如预期的那样。 但是,生成的关联上下文类(AssignmentExpressionContext
和BinaryNumericExpressionContext
)仅包括每个相应标签的最后一个实例的规则组件的方法。 例如,我的规则中BinaryNumericExpression
标签的最后一次用法是用于expression (Plus|Minus) expression
。因此,BinaryNumericExpressionContext
类只有方法Plus()
和Minus()
。明显缺失的是Caret()
、Times()
、DividedBy()
和ModuloDiv()
。在AssignmentExpressionContext
类中找到类似的方案,仅找到一个ModuloEquals()
方法。
我的问题是:1)这是一个错误还是"按设计工作"?2) 我是否必须为每个规则备选方案创建一个单独的标签,以便能够检查匹配的运算符?
这是一个错误。当我实现用于生成上下文访问器方法的分析算法时,我不知道这是一个受支持的案例。您应该在项目问题跟踪器上提交错误报告。
https://github.com/antlr/antlr4/issues