我有以下 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}文本/语法规则,似乎应该忽略空格,但事实并非如此。
我做错了什么?
最佳答案
我知道您已经找到了答案,但让我解释一下为什么将 ASSIGNMENT
更改为 assignment
解决了这个问题。
因为以大写字母开头的规则是词法分析器规则(即标记)。并且 {skip();}
或 {$channel=HIDDEN;}
导致词法分析器规则从解析器规则中跳过(或隐藏),而不是从词法分析器规则中。
这就是为什么 ASSIGNMENT
(词法分析器规则)不接受任何空格,而 assignment
(解析器规则)忽略它们的原因。
关于antlr - 忽略 ANTLRworks 中的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897494/