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;

このルールは、コンパイル単位が、ファイルの最後で終わる 0 個以上の要素のシーケンスであることを示しています。参照を省略した場合はEOF、次のようなルールが考えられます。

compilationUnit : someElement*;

このフォームの問題は、エラー処理能力にあります。入力に構文エラーが含まれている場合、それを修正および/または回復しようとするのではなく、ルールは単に戻ります(空のシーケンスはこのcompilationUnitルールの有効な解釈であるため、無効な要素を含む長いシーケンスよりも優先されます) )。

ANTLRWorks は、文法に明示的なEOF参照で終わる規則が含まれていないことを通知しています。これは、完全なファイルを解析しようとしている場合に問題になる可能性があります。

于 2013-06-11T14:56:14.837 に答える