4

JavaCC を使用してパーサーを作成する方法を学ぼうとしています。

JFlex を使用してすでにレクサーを生成しており、トークンのリストが返されます。各トークンは独自のクラスです。

制作規則を書いているのですが、例えば「;」が書けません。セミコロンを受け取るのではなく、代わりに TokenSemicolon のインスタンスを受け取るのでしょうか?

私に何ができる?

さらに、TokenMangager などについて混乱しています。レクサーと、互換性のあるトークン クラスの独自のリストを既に持っています。これは何ですか?

とても困っているので助けてください。

4

1 に答える 1

3

次の 2 つの関連する質問をします。

"これは何ですか?" つまり、「トークン マネージャーとは何ですか?」という意味だと思います。

トークン マネージャは、トークン オブジェクトのソースです。すべての JavaCC パーサーには、トークンのソースが必要です。ところで、トークンは class のオブジェクトによって表されますToken。トークン マネージャーを作成するには、2 つの方法があります。

  1. JavaCC に生成させてください。JavaCC は、ファイルに入力した一連の規則に基づいて語彙アナライザーを生成し.jjます。この点では、JFlex によく似ています。これがデフォルトです。
  2. 自分で書いてください。これを行うには、オプションを設定しますUSER_TOKEN_MANAGER=true。次に、JavaCC は という Java インターフェイスを生成しますTokenManager。必要なのは、独自のクラスでそのインターフェイスを実装することだけです。もちろん、そのクラスのオブジェクトを使用してパーサーを構築する必要があります。

"私に何ができる?"

いくつかの可能性があります。

  1. JFlex コードを JavaCC で書き直します。次に、JavaCC によって生成されたトークン マネージャーは、基本的に JFlex lexer と同じことを行いますが、適切なインターフェイスを実装し、適切な型 (つまりToken.)のトークンを生成します。
  2. アダプター クラスを記述します。JavaCC のUSER_TOKEN_MANAGER=trueオプションを使用して、JFlex をラップし、TokenManagerインターフェースを実装するアダプター クラスを作成します。
  3. JavaCC で使用できるレクサーを生成するように JFlex を説得します。これが可能かどうかはわかりませんが、可能であれば、それが最良の選択肢かもしれません。この場合、 を使用しますUSER_TOKEN_MANAGER=true。次に、クラスを作成します。 class FooLexer extends FooJLexLexer implements TokenManager { ...put constructors here... }

オプション 3 の場合、生成されたレクサーが実際に必要なすべてのメソッドを実装していることを確認する必要がありTokenManagerます。独自のすべてのトークン クラスが本当に必要な場合は、生成されたTokenクラスを拡張することができます。

オプション 2 を使用する場合、パーサーを構築するコードは次のようになります。

TokenManager tm = new AdaptJFlexLexerToJavaCC( jflexLexer ) ;
FooParser p = new FooParser( tm ) ;

オプション 3 は試してみたくなる魅力があります。うまくいけば一番楽かもしれません。

オプション 3 がうまくいかず、JFlex lexer を維持するやむを得ない理由がない限り、オプション 1 を選択します。JFlex から JavaCC への変換は、ほとんどが機械的なものになる可能性が高いため、迅速かつ簡単です。JFlex で JavaCC が適切な解決策を持っていない唯一のものは、A / B構造です。

どちらのオプションを使用する場合でも、JavaCC はすべてToken.kindフィールドがあることを想定していることに注意してください。これは整数ですが、生成されたインターフェイスで整数の記号名を見つけることができますFooConstants

于 2015-10-22T16:20:36.890 に答える