2016-04-14 72 views
1

解析,如果我用這個語法: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)*; 

,導致解析改變?

+0

我猜測問題是空間在idWithSpace規則中被跳過和使用。爲什麼你甚至需要ID之前的空間? – Divisadero

回答

0

這條規則:

idWithSpace : ID (' ' ID)*; 

由於嵌入式字符串「」,暗中創建匹配單個空格字符,並置於其他一切詞法規則詞法規則。因此,只要遇到單個空格字符,它就會有效地屏蔽您的WS規則。因此,單個空間不能再被跳過並被標記並傳遞給解析器。但沒有解析器規則,允許前的一個空格:,所以它抱怨額外「」輸入:

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

我被這種蟲子咬過的很多,當我第一次使用ANTLR。