尝试升级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'
;
这意味着什么 - 确切地说 - 是一个“未设置的块”并且是否有一般解决方案?
答案 0 :(得分:12)
不正确的标签如下:
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')
在语法块中允许使用标签的原因是支持以下项目。此块是 set ,这意味着可以折叠内容以精确匹配来自固定的一组允许令牌的一个令牌。然后,该组匹配的特定项目将分配给x
。
x=('a' | 'b')