ANTLR4:为多个替代方法重用规则替代标签会导致规则元素不出现在上下文类中

时间:2014-01-19 20:50:45

标签: antlr4

我有一个表达式规则,如下所示:

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
       ;

BinaryNumericExpressionAssignmentExpression的规则标签按预期为侦听器创建了一组enterXXXexitXXX方法。但是,生成的关联上下文类(AssignmentExpressionContextBinaryNumericExpressionContext)仅包括每个相应标签的最后一个实例的规则组件的方法。例如,我的规则中BinaryNumericExpression标签的最后一次使用是expression (Plus|Minus) expression。因此,BinaryNumericExpressionContext类只有方法Plus()Minus()。明显缺少的是Caret()Times()DividedBy()ModuloDiv()。找到AssignmentExpressionContext类的类似场景,只找到ModuloEquals()方法。

我的问题是:1)这是一个错误还是“按设计工作”? 2)我是否必须为每个规则备选方案创建单独的标签,以便能够检查哪个运营商匹配?

1 个答案:

答案 0 :(得分:2)

这是一个错误。当我实现用于生成上下文访问器方法的分析算法时,我不知道这是一个支持的案例。您应该在项目问题跟踪器上提交错误报告。

https://github.com/antlr/antlr4/issues