2017-08-23 22 views
1

私は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

+0

@BartKiersその答えは問題を認めているに過ぎません。注文トークンの特定の規則は何ですか?私はなぜ簡単な代入になるのか(なぜならMODULE - > "module")は宣言の順序に従わなければならないのか分からない。可能であれば、文書に引用を引用してください。 – mdeazley

+0

@BartKiersまず、newbの質問に答えようと努力してくれてありがとう!私は "レクサーはできるだけ多くの文字をマッチさせようとする"という部分を得る。しかし、なぜ「そして2つ(またはそれ以上)のルールが同じ量の文字にマッチするのか分からないと、最初に定義されたルールが勝つだろう」この状況でも適用されます...私は1つのMODULEトークン定義とその定義を使用する1つのルール "module_open"しか持っていません " – mdeazley

+0

@BartKiers私自身の質問に答える最も近いのは"​​トークン定義はそれらを構文解析ツリーで使用するように指示してください」というようなものですが、別の構文解析ルールで別の順序で使用するとどうなりますか? – mdeazley

答えて

2

テキスト 'モジュール' は、有効な 'ID' であるため、moduleID後であればそれは失敗します。 IDルールが最初に表示される場合は、そのルールが優先されます。これは、のレクサールールのが重要な場合、の場合、2つ以上のレクサールールが同じ入力に一致することができます。この場合、最初に現れたものは後続のものよりも優先されます。それが優先されます。

この優れたテストケースは、この動作を完全に例示的に示したものです。

ここでANTLR4のドキュメントにはこれを完全に説明したサム・ハーウェル以外の誰も素晴らしい記事がありましたが、私はもはやそれを見つけることができません。

+0

私は本を手元に置いていませんが、語彙的な議論に入っているはずです –

+1

間違った木の上にバークインしました(Punは意図しました)。 – mdeazley

関連する問題