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