2

ANTLRにはMismatchedTokenException、次の定義があります。

type : IDENTIFIER ('<' (type (',' type)*) '>')?;

そして、次のテスト:

A<B,C<D>>

例外は、最初のを解析するときに発生します>。ANTLRは両方の「>>」を一度に解析しようとしますが失敗します。

サイレントホワイトスペースチャネルでは、次のテスト機能します。

A<B,C<D> >

ANTLRは各トークンを別々に扱うように明確に指示されています。

どうすれば修正できますか?

4

1 に答える 1

2

私はそれを再現できませんでした。によって生成されたパーサー:

grammar T;

type       : IDENTIFIER ('<' (type (',' type)*) '>')?;
IDENTIFIER : 'A'..'Z';

入力A<B,C<D>>(スペースなし)を次の解析ツリーに解析します。

ここに画像の説明を入力してください

この入力で。を生成する文法を提供する必要がありますMismatchedTokenException

おそらく、ANTLRWorksのインタープリター(または同じインタープリターを使用するEclipseのANTLR-IDE)を使用していますか?その場合、それはおそらく問題です:それは悪名高いバグです。使用しないでください。ただし、ANTLRWorksのデバッガーを使用してください。すばらしいです(上記の画像はデバッガーからのものです)。

LazloBoninは次のように書いています。

とった。<<トークンを定義しました。すぐに、トークン認識を別のトークン認識よりも優先する方法はありますか?

いいえ、レクサーは可能な限り一致させようとします。したがって、<<(または)に一致するトークンを作成できる場合は、2つの単一(または)トークン>>を優先して作成します。2つ(またはそれ以上)のレクサールールが同じ量の文字に一致する場合にのみ、優先順位が付けられます。最初に定義されたルールが、文法の後半で定義されたルールよりも「優先」されます。<>

于 2012-04-29T17:08:51.313 に答える