0

仲間の ANTLR 専門家の皆さん、この警告が ANTLWorks に表示される理由を説明していただけますか? このメッセージを理解する方法と、この特定のケースでそれを取り除く方法は?

有効な入力の例: abc "xyz def" abc は keywordExpr トークンとして認識され、"xyz def" は phraseExpr として認識されます。

[14:32:24] 警告 (200): TestExpr.g:12:4: 決定は、複数の選択肢を使用して「CHAR」などの入力と一致する可能性があります: 1、2

その結果、代替手段 2 はその入力に対して無効になりました [14:32:24] 警告 (200): /Users/imochurad/ Development /antlr3/Grammars/TestExpr.g:12:4: Decision can match input such複数の選択肢を使用して「CHAR」として: 1、2

その結果、その入力に対して代替案 2 が無効になりました

grammar TestExpr;

options {
output=AST;
    ASTLabelType=CommonTree; 
}

expr
    :   kpExpr*;
kpExpr  :   keywordExpr|phraseExpr; 
keywordExpr
    :   CHAR+;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
phraseExpr
    :   '"' CHAR+ (' ' CHAR+)* '"';
CHAR    :   ('A'..'Z') | ('a'..'z');
INT :   '0'..'9'+;
NEWLINE :   '\r'? '\n';
WS  :   (' '|'\t'|'\n'|'\r')+ {skip();};

どうもありがとう!

4

1 に答える 1

1

書かれているように、引用符で囲まれていない文字列を解析するときの文法はあいまいです。keywordExprabc は、1 つ(abc) または 3 つ (a、b、および c)、さらには 2 つとして解析できます。キーワードが空白で区切られていることを期待していると思います。ただし、レクサーで空白をスキップしているため、パーサーは と の違いを認識できませabca b c

私はそれを疑ってkeywordExprおり、phraseExprレクサールールであるべきです:

KeywordExpr: CHAR+;
PhraseExpr:  '"' CHAR+ (' ' CHAR+)* '"';

CHARCHAR単一文字のキーワードがある場合に誤って生成されたトークンを避けるために、おそらくフラグメントにもなるはずです。

この変更により、レクサーは可能な限り最長の一致を使用するため、abc はレクサーで明確になります。

スペースを別の方法で処理することに関しては、レクサーで行うと最も効果的です。上記の PhraseExpr のルールは、スペースを正しく処理します。これは、レクサーがスペースに遭遇すると、WSルールに一致しないためです。パーサーでの処理は、はるかに複雑です。

于 2013-07-10T16:46:54.633 に答える