13

このコードをどのようにトークン化する必要があるかについて、 Java 仕様に混乱しています。

ArrayList<ArrayList<Integer>> i;

仕様は次のように述べています。

結果が最終的に正しいプログラムを作成し、別の字句変換が作成される場合でも、各ステップで可能な限り長い翻訳が使用されます。

私が理解しているように、「最長一致」ルールを適用すると、トークンが次のようになります。

  • 配列リスト
  • <
  • 配列リスト
  • <
  • 整数
  • >>
  • ;

これは解析されません。もちろん、このコードは問題なく解析されます。

この場合の正しい仕様は何ですか?

正しいレクサーはコンテキストフリーでなければならないということですか? 通常のレクサーでは不可能のようです。

4

2 に答える 2

4

@sm4 によってリンクされたコードを読むことに基づいて、戦略は次のようになります。

  • 入力を通常どおりにトークン化します。そのため、9 ではなく 8 トークンA<B<C>> i;としてトークン化されます。A, <, B, <, C, >>, i, ;

  • 階層解析中、ジェネリクスの解析に取り組んでおり>、次のトークンが>-- >>>>>>=>>=、または>>>=-- で始まる場合は、 をノックオフして>、短縮されたトークンをトークン ストリームにプッシュします。例: パーサーが>>, i, ;typeArguments ルールの処理中に に到達すると、typeArguments が正常に解析され>, i, ;、最初>>>が typeArguments に一致するように引き出されたため、残りのトークン ストリームはわずかに異なる になります。

そのため、トークン化は正常に行われますが、必要に応じて階層解析フェーズで再トークン化が行われます。

于 2013-05-29T01:26:59.123 に答える