Antlr 在AntlWorks中忽略空白
我有以下ANTLR语法:Antlr 在AntlWorks中忽略空白,antlr,antlrworks,Antlr,Antlrworks,我有以下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=HI
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;}
;
只有分配规则实际上是我的,其余是ANTLRWorks 1.4.3添加的默认值
当我在解释器中尝试语法时,诸如“a=5”之类的字符串成功,但是诸如“b[space]=[space]6”之类的字符串失败:由于空格,我得到了一个不匹配的TokenException:
通过阅读ANTLR网站和Ignore规则:WS和{$channel=HIDDEN}text/语法规则,似乎应该忽略空白,但事实并非如此
Ignore rules: WS
我做错了什么?我知道你已经找到了答案,但让我解释一下为什么将
作业
更改为作业
解决了这个问题
因为以大写字母开头的规则是lexer规则(即代币)。和{skip();}
或{$channel=HIDDEN;}
导致从解析器规则而不是从lexer规则中跳过(或隐藏)lexer规则
这就是为什么ASSIGNMENT
(lexer规则)不接受任何空格,并且ASSIGNMENT
(解析器规则)会忽略它们。指定“ASSIGNMENT”而不是“ASSIGNMENT”修复了它。
{$channel=HIDDEN}