ANTLR4 - 分配给不是集合的块的标签
ANTLR4 - label assigned to a block which is not a set
我收到错误 label assigned to a block which is not a set
。我的标签出现此错误:child
、left
、right
、first
和 last
。我正在做的是为一组备选方案分配一个标签;不应该支持这个吗?
我的语法片段:
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
;
问题在于替代元素可以是不同类型:TerminalNodes、各种规则上下文以及两者的列表。 NUMBER
和 expr
显然是不同的类型。因此通常不可能分配给单个标签(单个变量类型)。
将备选方案提取为子规则:
....
| multipleExpr '(' first=altExpr (',' rest+=altExpr)+ ')'
;
altExpr : stat | expr | constant ;
在这种特殊情况下,您不一定需要标签,因为 altExpr 将被捕获在 multipleExpr 上下文中的列表中 class -- 列表的第一个元素将始终是第一个遇到的altExpr。
查看生成的解析器中的相关上下文class,了解标签是如何实现为变量的。
并且,在构建标记列表时,需要 +=
赋值操作。
更新:
监听器会有一个方法
enterMultipleExpr(YourParser.MultipleExprContext ctx);
嵌入的 YourParser class MultipleExprContext 将有一个方法
public List<AltExprContext> altExpr() {
return getRuleContexts(AltExpr.class);
}
所以ctx.altExpr()
returns列表。如果您实施标签,上下文也将具有 public 个变量:
public AltExprContext first;
public List<AltExprContext> rest;
再次查看生成的解析器中的相关上下文 class 以了解您必须使用哪些生成的访问器。
我收到错误 label assigned to a block which is not a set
。我的标签出现此错误:child
、left
、right
、first
和 last
。我正在做的是为一组备选方案分配一个标签;不应该支持这个吗?
我的语法片段:
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
;
问题在于替代元素可以是不同类型:TerminalNodes、各种规则上下文以及两者的列表。 NUMBER
和 expr
显然是不同的类型。因此通常不可能分配给单个标签(单个变量类型)。
将备选方案提取为子规则:
....
| multipleExpr '(' first=altExpr (',' rest+=altExpr)+ ')'
;
altExpr : stat | expr | constant ;
在这种特殊情况下,您不一定需要标签,因为 altExpr 将被捕获在 multipleExpr 上下文中的列表中 class -- 列表的第一个元素将始终是第一个遇到的altExpr。
查看生成的解析器中的相关上下文class,了解标签是如何实现为变量的。
并且,在构建标记列表时,需要 +=
赋值操作。
更新:
监听器会有一个方法
enterMultipleExpr(YourParser.MultipleExprContext ctx);
嵌入的 YourParser class MultipleExprContext 将有一个方法
public List<AltExprContext> altExpr() {
return getRuleContexts(AltExpr.class);
}
所以ctx.altExpr()
returns列表。如果您实施标签,上下文也将具有 public 个变量:
public AltExprContext first;
public List<AltExprContext> rest;
再次查看生成的解析器中的相关上下文 class 以了解您必须使用哪些生成的访问器。