Antlr4 指定给非集合块的标签x

Antlr4 指定给非集合块的标签x,antlr4,Antlr4,尝试升级antlr4时,语法中有两行代码生成错误消息: 指定给非集合块的标签tok 特别是对于如下所示的语法行: contextRadius: tok=('radius' 'change-authorize-nas-ip') (IP4_ADDRESS|IP6_ADDRESS) 'encrypted' 'key' ID 'port' INT_TOK 'event-timestamp-window' INT_TOK 'no-reverse-path-forward-check' ; 这到底

尝试升级antlr4时,语法中有两行代码生成错误消息:

指定给非集合块的标签tok

特别是对于如下所示的语法行:

contextRadius: tok=('radius' 'change-authorize-nas-ip') (IP4_ADDRESS|IP6_ADDRESS) 'encrypted' 'key' ID 'port' INT_TOK 'event-timestamp-window' INT_TOK 'no-reverse-path-forward-check'
    ;

这到底意味着什么——成为一个“未设置的块”,有一个普遍的解决方案吗

不正确的标签如下:

tok=('radius' 'change-authorize-nas-ip')
在这种情况下,ANTLR不知道是将令牌
'radius'
还是将令牌
'change-authorize-nas-ip'
分配给标签
tok
。从ANTLR 4开始,生成错误,而不是生成语义不清楚的代码。您需要删除标签
tok
,或将其移动到所需项目。换句话说,使用以下三种形式之一

('radius' 'change-authorize-nas-ip')
(tok='radius' 'change-authorize-nas-ip')
('radius' tok='change-authorize-nas-ip')
语法中允许在块上使用标签的原因是支持如下项。此块是一个集合,这意味着内容可以折叠为正好匹配一组固定的允许令牌中的一个令牌。然后将集合匹配的特定项目分配给
x

x=('a' | 'b')

我发现了这一点,基本上我认为ANTLR是在暗示我没有使用令牌。在一个例子中,我刚刚删除了“tok=”。在第二种情况下,我删除了一组不需要的参数。所以(IP4_地址)变成了:IP4_地址,所以现在生成器工具生成代码,但是lexer和解析器有编译错误。将在新线程上报告单独的问题。集合中的所有项目都必须是相同的类型吗?我得到了这个错误,我的块最多产生一个项目,但它从3个不同类型的替代品中进行选择。