请帮助新手了解这一点 ANTLWorks中的警告:
[11:10:15] warning(138):BooleanExpr.g:0:1:语法BooleanExpr:没有启动规则(EOF后面没有明显的规则)
这就是我的语法定义的样子:
grammar BooleanExpr;
booleanExpr
: andExpr ('OR' andExpr)*;
andExpr : notExpr (('AND' | ' ' ) notExpr)*;
notExpr : kppExpr ('NOT' kppExpr);
kppExpr : keywordExpr|phraseExpr|proximityExpr|'(' booleanExpr ')';
keywordExpr
:CHAR+;
phraseExpr
: '"' keywordExpr '"';
proximityExpr
: keywordExpr|phraseExpr '~' INT;
CHAR : ('A'..'Z') | ('a'..'z');
INT : '0'..'9'+;
非常感谢!
答案 0 :(得分:4)
任何语法都需要所谓的启动规则。启动规则是另一个规则未引用的规则。如果您的语法没有这样的规则,ANTLR生成器将发出警告:
no start rule (no rule can obviously be followed by EOF)
要避免这种情况,请在语法中添加虚拟启动规则:
start_rule: someOtherRule;
答案 1 :(得分:2)
通常编写解析器来解析整个输入(从文件的开头到结尾)。用于此任务的语法通常包括如下规则。
compilationUnit : someElement* EOF;
此规则表示编译单元是在文件末尾结束的零个或多个元素的序列。如果省略EOF
引用,则可以使用如下规则。
compilationUnit : someElement*;
这种形式的问题在于其错误处理能力。如果输入包含语法错误,那么该规则将返回(空序列是对此compilationUnit
规则的有效解释,而不是尝试更正和/或从中恢复),因此优先考虑更长包含无效元素的序列。)
ANTLRWorks通知您语法不包含以明确EOF
引用结尾的规则,如果您打算解析完整文件,这可能会有问题。