ANTLRWorks警告'无启动规则'

时间:2013-06-11 14:09:42

标签: antlr antlr3 antlrworks

请帮助新手了解这一点 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'+;

非常感谢!

2 个答案:

答案 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引用结尾的规则,如果您打算解析完整文件,这可能会有问题。