ANTLR4 - 分配给非集合块的标签

时间:2015-06-09 23:19:34

标签: antlr antlr4

我收到错误label assigned to a block which is not a set。我的标签出现此错误:childleftrightfirstlast。我正在做的是为一组替代品分配标签;不应该支持吗?

我的语法碎片:

expr:
      unaryExpr '(' child=(stat | expr | NUMBER) ')'                                                #labelUnaryExpr
    | binaryExpr '(' left=(stat | expr | constant) ',' right=(stat | expr | constant) ')'           #labelBinaryExpr
    | multipleExpr '(' first=(stat | expr | constant) (',' rest=(stat | expr | constant))+ ')'      #labelMultipleExpr
    ;   

1 个答案:

答案 0 :(得分:3)

问题在于备用元素可以是不同类型:TerminalNodes,各种规则上下文和两者的列表。 NUMBERexpr明显不同。因此,通常不可能分配给单个标签(单变量类型)。

将替代品作为子规则提取出来:

....
| multipleExpr '(' first=altExpr (',' rest+=altExpr)+ ')'
;

altExpr   : stat | expr | constant ;

在这种特殊情况下,您不一定需要标签,因为altExpr将被捕获在multipleExpr上下文类的List中 - 列表的第一个元素将始终是第一个遇到的altExpr。

查看生成的解析器中的相关上下文类,以查看标签如何实现为变量。

并且,在构建带标签的列表时,需要+=赋值操作。

<强>更新

监听器将有一个方法

enterMultipleExpr(YourParser.MultipleExprContext ctx);

YourParser嵌入式类MultipleExprContext将有一个方法

    public List<AltExprContext> altExpr() {
        return getRuleContexts(AltExpr.class);
    }

所以ctx.altExpr()返回列表。如果实现标签,则上下文也将具有公共变量:

public AltExprContext first;
public List<AltExprContext> rest;

再次,查看生成的解析器中的相关上下文类,以查看您必须使用的生成的访问器。