4

请帮助新手理解 ANTLWorks 中的此警告:

[11:10:15] 警告(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'+;

非常感谢!

4

2 回答 2

3

任何语法都需要所谓的开始规则。起始规则是未被其他规则引用的规则。如果你的语法没有这样的规则,ANTLR 生成器会发出警告:

no start rule (no rule can obviously be followed by EOF)

为避免这种情况,请在语法中添加一个虚拟开始规则:

start_rule: someOtherRule; 
于 2014-12-12T11:39:17.043 回答
2

通常编写解析器来解析整个输入(从文件的开头到结尾)。用于此任务的语法通常包括如下规则。

compilationUnit : someElement* EOF;

该规则说编译单元是在文件末尾结束的零个或多个元素的序列。如果EOF省略了引用,则可以有如下规则。

compilationUnit : someElement*;

这种形式的问题在于它的错误处理能力。如果输入包含语法错误,那么规则将简单地返回而不是尝试纠正和/或从中恢复(空序列是此compilationUnit规则的有效解释,因此优先于包含无效元素的较长序列)。

ANTLRWorks 通知您该语法不包含以显式EOF引用结尾的规则,如果您打算解析完整的文件,这可能会出现问题。

于 2013-06-11T14:56:14.837 回答