私はYANGソースを最終的に解析する簡単な文法を持っています。私が任意の変更のように見える場合、IntelliJ ANTLR4 PluginはMODULEトークンの場所を入力して解析することはできません。ANTLR4トークンの順序が重要なのはなぜですか?
入力文字列解析される:ここでは
module x { }
がエラーなしで動作する文法である:ここでは
grammar Yang ;
yang: module_open module_close;
module_open : MODULE ID BRACKET_OPEN ;
module_close: BRACKET_CLOSE ;
MODULE: 'module' ;
ID: ([A-Za-z][A-Za-z0-9_-]*) ;
BRACKET_OPEN: '{' ;
BRACKET_CLOSE: '}' ;
WS: [ \t\r\n]+ -> skip ;
は失敗した文法である:
grammar Yang ;
yang: module_open module_close;
module_open : MODULE ID BRACKET_OPEN ;
module_close: BRACKET_CLOSE ;
ID: ([A-Za-z][A-Za-z0-9_-]*) ;
MODULE: 'module' ;
BRACKET_OPEN: '{' ;
BRACKET_CLOSE: '}' ;
WS: [ \t\r\n]+ -> skip ;
すべて私は、IDトークンの前後にMODULEトークン定義をカッティング・ペーストしていますが、MODULE d efinitionはID定義の後にあります。
私には何が欠けていますか?私はドキュメントのトークンの順序の議論を参照してください!
EDIT:@BartKiers関連のポスト... ANTLR4 lexer rules don't work as expected
@BartKiersその答えは問題を認めているに過ぎません。注文トークンの特定の規則は何ですか?私はなぜ簡単な代入になるのか(なぜならMODULE - > "module")は宣言の順序に従わなければならないのか分からない。可能であれば、文書に引用を引用してください。 – mdeazley
@BartKiersまず、newbの質問に答えようと努力してくれてありがとう!私は "レクサーはできるだけ多くの文字をマッチさせようとする"という部分を得る。しかし、なぜ「そして2つ(またはそれ以上)のルールが同じ量の文字にマッチするのか分からないと、最初に定義されたルールが勝つだろう」この状況でも適用されます...私は1つのMODULEトークン定義とその定義を使用する1つのルール "module_open"しか持っていません " – mdeazley
@BartKiers私自身の質問に答える最も近いのは"トークン定義はそれらを構文解析ツリーで使用するように指示してください」というようなものですが、別の構文解析ルールで別の順序で使用するとどうなりますか? – mdeazley