14

尝试升级 antlr4,我在语法中有 2 行产生错误消息:

标签 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'
    ;

这究竟意味着什么 - 成为“未设置的块”并且有通用解决方案吗?

4

1 回答 1

16

不正确的标签如下:

tok=('radius' 'change-authorize-nas-ip')

在这种情况下,ANTLR 不知道是将令牌'radius'还是令牌分配'change-authorize-nas-ip'给 label 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')
于 2013-01-17T14:53:47.710 回答