次の 2 つの関連する質問をします。
"これは何ですか?" つまり、「トークン マネージャーとは何ですか?」という意味だと思います。
トークン マネージャは、トークン オブジェクトのソースです。すべての JavaCC パーサーには、トークンのソースが必要です。ところで、トークンは class のオブジェクトによって表されますToken
。トークン マネージャーを作成するには、2 つの方法があります。
- JavaCC に生成させてください。JavaCC は、ファイルに入力した一連の規則に基づいて語彙アナライザーを生成し
.jj
ます。この点では、JFlex によく似ています。これがデフォルトです。
- 自分で書いてください。これを行うには、オプションを設定します
USER_TOKEN_MANAGER=true
。次に、JavaCC は という Java インターフェイスを生成しますTokenManager
。必要なのは、独自のクラスでそのインターフェイスを実装することだけです。もちろん、そのクラスのオブジェクトを使用してパーサーを構築する必要があります。
"私に何ができる?"
いくつかの可能性があります。
- JFlex コードを JavaCC で書き直します。次に、JavaCC によって生成されたトークン マネージャーは、基本的に JFlex lexer と同じことを行いますが、適切なインターフェイスを実装し、適切な型 (つまり
Token
.)のトークンを生成します。
- アダプター クラスを記述します。JavaCC の
USER_TOKEN_MANAGER=true
オプションを使用して、JFlex をラップし、TokenManager
インターフェースを実装するアダプター クラスを作成します。
- 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
。