问题 标签x分配给不是一组的块


尝试升级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'
    ;

这究竟意味着什么 - 成为“未设置的块”并且是否有一般解决方案?


5113
2018-01-17 14:25


起源

我想出来了,基本上我认为ANTLR暗示我没有使用令牌。在一个案例中,我刚删除了“tok =”。在第二种情况下,我删除了一组不需要的parens。所以(IP4_ADDRESS)只是:IP4_ADDRESS所以现在生成器工具产生代码,但是词法分析器和解析器有编译错误。将在新线程上报告单独的问题。 - joehitt


答案:


不正确的标签如下:

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')

11
2018-01-17 14:53



集合中的所有项目是否必须是同一类型?我收到这个错误,我的块最多产生一个项目,但它从3个不同类型的替代项中选择。 - ehdv