我有以下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:
通过阅读ANTLR网站以及
Ignore rules: WS和
{$channel=HIDDEN}文本/语法规则,似乎应该忽略空格,但事实并非如此。
< / p>
我做错了什么?
答案 0 :(得分:6)
我知道您已找到答案,但让我解释为什么将ASSIGNMENT
更改为assignment
解决了这个问题。
因为以资本开头的规则是词法规则(即令牌)。并且{skip();}
或{$channel=HIDDEN;}
会导致词法分析器规则从解析器规则中跳过(或隐藏),而不是从词法分析器规则中跳过(或隐藏)。
这就是ASSIGNMENT
(词法规则)不接受任何空格的原因,assignment
(解析器规则)会忽略它们。