如果我使用这个语法:
grammar NameValue;
nameValue: (name=ID ':' value=ID)+ EOF;
//idWithSpace : ID (' ' ID)*;
ID : [a-zA-Z]+ ;
WS : [ \t\r\n]+ -> skip ; // Define whitespace rule, toss it out
和这个输入:
a:b
a : b
A : B
我得到这个解析:
(nameValue a : b a : b A : B <EOF>)
但如果我取消注释idWithSpace行,我得到这个解析:
line 2:1 extraneous input ' ' expecting ':'
line 2:3 extraneous input ' ' expecting ID
(nameValue a : b a : b A : B <EOF>)
为什么添加规则idWithSpace
idWithSpace : ID (' ' ID)*;
未引用,导致解析更改?
答案 0 :(得分:0)
这条规则:
idWithSpace : ID (' ' ID)*;
由于嵌入字符串&#39; &#39;,隐式创建匹配单个空格字符的词法分析器规则,并放置在所有其他词法分析器规则之前。因此,只要遇到单个空格字符,它就会有效地屏蔽您的WS规则。因此,不能再跳过单个空格并将其标记化并传递给解析器。但是没有解析器规则允许在:之前允许单个空格,因此它会抱怨额外的&#39; &#39;输入:
line 2:1 extraneous input ' ' expecting ':'
当我第一次使用ANTLR时,我被这种错误所困扰。