2017-04-14 6 views
0

すべての関数名を含むマップを作成しようとしています。私はスキャンフェーズや解析フェーズでこれを行うことができますが、両方にアクセスできるように同じ変数を得ることはできません。Javaccスキャナとパーサーが変数にアクセスできるようにする方法

私が必要とするのは、関数が呼び出されたポイントの下で宣言できるため、すべての関数名を解析する前にマップに保存することです。だから私はその機能が存在することを確認する必要があります。

トークンmgr宣言を使用してみましたが、トークンを表示するたびにマップにトークンを追加できました。しかし、関数が存在するかどうかを調べるためには、パーサーが見るためにfuncs変数が必要です。

TOKEN_MGR_DECLS : { 
     public static Map funcs = new HashMap(); 
    } 
    TOKEN : { 
     <FNAME: (["A"-"Z"])+ > { funcs.put(matchedToken.image, "..");} 
    } 

これは私が持っている最も近いですが、私はちょうどPARSER_BEGIN(..)の下に、.jjファイルでグローバル変数を試みたが、メイン関数内でそれを宣言しました。関数名をマップに追加しようとすると、両方とも 'シンボルが見つかりません'というエラーにつながります。

ありがとうございました。

+0

スキャンと解析は同じパスで行われます。 –

答えて

1

まず、パーサーとレクサーの間で変数を共有することをお勧めします。変数はレクサーによって書かれ、パーサによって読み取られ

  • 場合、情報が時間によって(すなわち上書き)期限切れのかもしれません:レクサーはかなり前という意味パーサのことができるからですパーサーがそれを読み取ります。

  • 変数がパーサーによって書き込まれ、レクサーによって読み取られる場合、レクサーが必要とする情報は、レクサーが必要とするときにパーサによって書き込まれていない可能性があります。

と言われています。あなたがそれをする必要がある場合。ここには一つの方法があります。そして、この

TOKEN_MGR_DECLS : { 
    Map funcs = new HashMap(); 
} 

のようなトークンマネージャで、あなたの変数を宣言し、パーサに、あなたはtoken_source.funcsとして変数にアクセスすることができます。

STATIC=trueオプションを使用する場合、変数はstaticである必要があります。

0

makeは、javaccパーサーのフローを知りたいと思っていると思います。

実際のJavaCCプロセスは、getNextToken()メソッドを呼び出すことによって処理するトークンを返すためにTokenManagerを呼び出すparserセクションから始まります。どの人が文字キャラクタストリーム(SimpleCharStreamまたはJavaCharStream)を呼び出して文字ごとにTokenManagerに返すか。

Parser 
    /|\ 
    | getNextToken() 
    \|/ 
TokenManager 
    /|\ 
    | readChar() 
    \|/ 
SimpleCharStream 
関連する問題