Antlr: несоответствующий ввод начальный ожидающий идентификатор
Как начинающий, когда я изучал ANTLR4 изОкончательный справочник ANTLR 4 книгу, я попытался запустить мою модифицированную версию упражнения из главы 7:
/**
* 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 : '"' .*? '"'
вместо этого это работает.
Я хотел бы знать, где я был неправ, чтобы я мог избежать подобных ошибок в будущем.
Пожалуйста, дайте мне предложение, спасибо!