3

我有以下 ANTLR 语法:

grammar mygrammar;

ASSIGNMENT 
    :   ID '=' INT
    ;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

INT :   '0'..'9'+
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

只有 ASSIGNMENT 规则实际上是我的,其余的是 ANTLRWorks 1.4.3 添加的默认值。

当我在解释器中尝试语法时,“a=5”之类的字符串成功,但“b[space]=[space]6”之类的字符串失败:由于空格,我得到一个 MismatchedTokenException:

带有 MismatchedTokenException 的界面图片

通过阅读 ANTLR 网站,以及

忽略规则:WS
{$频道=隐藏}
文本/语法规则,似乎应该忽略空格,但事实并非如此。

我究竟做错了什么?

4

1 回答 1

6

我知道您已经找到了答案,但让我解释一下为什么要更改ASSIGNMENTassignment解决它。

因为以大写字母开头的规则是词法分析器规则(即标记)。并且{skip();}{$channel=HIDDEN;}导致词法分析器规则从解析器规则中跳过(或隐藏),而不是从词法分析器规则中。

这就是为什么ASSIGNMENT(lexer rule) 不接受任何空格,并且assignment(parser rule) 确实忽略它们。

于 2011-10-26T04:52:12.987 回答