作爲一個初學者,當我從The Definitive ANTLR 4 Reference書學習ANTLR4,我試圖從第7章運行我練習的修改後的版本:ANTLR的:初學者的不匹配輸入期待ID
/**
* to parse properties file
* this example demonstrates using embedded actions in code
*/
grammar PropFile;
@header {
import java.util.Properties;
}
@members {
Properties props = new Properties();
}
file
:
{
System.out.println("Loading file...");
}
prop+
{
System.out.println("finished:\n"+props);
}
;
prop
: ID '=' STRING NEWLINE
{
props.setProperty($ID.getText(),$STRING.getText());//add one property
}
;
ID : [a-zA-Z]+ ;
STRING :(~[\r\n])+; //if use STRING : '"' .*? '"' everything is fine
NEWLINE : '\r'?'\n' ;
由於Java性能只是鍵值對我使用STRING
來匹配除了NEWLINE
(我不希望它只支持雙引號中的字符串)。當運行下面的句子,我得到:
D:\Antlr\Ex\PropFile\Prop1>grun PropFile prop -tokens
driver=mysql
^Z
[@0,0:11='driver=mysql',<3>,1:0]
[@1,12:13='\r\n',<4>,1:12]
[@2,14:13='<EOF>',<-1>,2:14]
line 1:0 mismatched input 'driver=mysql' expecting ID
當我使用STRING : '"' .*? '"'
相反,它的工作原理。
我想知道我錯在哪裏,以便將來避免類似的錯誤。
請給我一些建議,謝謝!
因爲ID也會匹配字符串值,如果我想允許字符串作爲值,但不是在雙引號,如何做到這一點? – wangdq