antlr4解析与未引用的规则

时间:2016-04-14 20:58:59

标签: parsing antlr4

如果我使用这个语法:

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)*;

未引用,导致解析更改?

1 个答案:

答案 0 :(得分:0)

这条规则:

idWithSpace : ID (' ' ID)*;

由于嵌入字符串&#39; &#39;,隐式创建匹配单个空格字符的词法分析器规则,并放置在所有其他词法分析器规则之前。因此,只要遇到单个空格字符,它就会有效地屏蔽您的WS规则。因此,不能再跳过单个空格并将其标记化并传递给解析器。但是没有解析器规则允许在:之前允许单个空格,因此它会抱怨额外的&#39; &#39;输入:

line 2:1 extraneous input ' ' expecting ':'

当我第一次使用ANTLR时,我被这种错误所困扰。