2016-04-20 2 views
2

私は、ANTLRルールのどの選択肢が複数のものがマッチするかを理解しようとしています。 this answerによれば、非欲張りパターン(*?,+?,??)の後を除いて、レクサールールの選択肢は順序付けられていない。 Xでの選択肢が順序付けられているので、X "foo" とBAR "バー":たとえば、この文法:ANTLR:パターンの貪欲さと代替の順序

lexer grammar Test; 

X : 'z'*? (FOO | FOOBAR); 
fragment FOO: 'foo'; 
BAR: 'bar'; 
fragment FOOBAR: 'foobar'; 

与えられた入力 "foobarには、" 2つのトークンと一致します。 'z'*?を削除したり、貪欲な'z'*に変更したりすると、代替案は再び順序付けされなくなり、唯一の一致したトークンはX "foobar"になります。しかし

、私はパーサールールにルールを変更した場合:'z'

grammar Test; 

x : 'z'*? (foo | foobar); 
foo: 'foo'; 
bar: 'bar'; 
foobar: 'foobar'; 

貪欲は全く問題ではしていないようです。入力「foobarに」考えると、ルールxは第二の別に従い、入力全体を消費し、生産ツリー(x (foobar "foobar"))

質問です:はレクサーとパーサルールが入力を消費したときに、いくつかの彼らが好む一致する方法についての明確なドキュメントがあります可能ですか?

答えて

1

が入力を消費し、いくつかは、可能な場合、彼らが好む一致するかレクサーとパーサルール上の決定的なドキュメントはありますか?

決定的なドキュメント(離れて、ソースコードを読んでから):

1)サムハーウェルさん(著者)stackoverflowの

2のコメント)ANTLR4

ためのそしてあなたのためのテレンス・パーの本その場合、解析ルールの完全な解釈は、Terence Parrの本で見つけることができます。

第15.6項Wi ldcardオペレータと最短一致Subrules->最短一致レクサーサブルール

字句 ルール内最短一致サブルールを通じて渡り、その後、上から行うすべての決定は、「最初の試合は勝った。」である たとえば、代わりの「AB」のルールで右側 。*? ( 'a' | 'ab')は デッドコードであり、決してマッチできません。入力がabの場合、最初の 代替文字 'a'は最初の文字と一致し、したがって成功します。ルールの右側にある ( 'a' | 'ab')は、入力abの 第2の代替案と正しく一致します。この奇妙な点は、ここに入るにはあまりにも複雑すぎる設計の決定ではなく、 です。このような完全な文法のための

ので:zfooなどの入力のために

grammar TestGrammar; 
test:XXX EOF; 
WS: [ \t\f]+ -> channel(1); 
CRLF: '\r'? '\n' -> channel(1); 
XXX : 'z'*? (FOO | FOOBAR) {System.out.println(getText());}; 

fragment FOO: 'foo'; 
fragment BAR: 'bar'; 
fragment FOOBAR: 'foobar'; 

XXXルールでトークン化され、レクサーのアクション出力によってこれが確認されます。入力の場合はzfoobarです。最初の4文字のzfooは、上記の「最初の試合の勝利」ルールのために、まだXXXのトークンでbarを未確認のトークンとして残しています。

と非欲張りパーサーサブルールのため

最短一致パーササブルール

最短一致サブルールとワイルドカードがゴールから 抽出情報にある「ファジー構文解析」を行うには、パーサーの中にも 便利です完全な文法を指定しなくても入力ファイルを作成できます。ノンリディ・レクサーの意思決定とは対照的に、パーサー は常にグローバルに正しい決定を行います。パーサーは、 の決定を最終的に行い、最終的に有効な入力が遅れて、後で構文解析の間に の間に失敗します。 nongreedyパーサーサブルールは、 の有効な入力文に対して成功した構文解析を保持するトークンの最短シーケンスと一致します( )。

サブルールに順序付けを行わないもの。