1

ほとんど 1 つの語彙状態のみを使用して記述された JavaCC DSL パーサーをリファクタリングしようとしています。

私の目標は、古い DSL を使用して古い構成を無効にしないように、コンテキストに依存する新しいキーワードを導入することです。

アイデアは、字句状態を変更し、新しいキーワードを導入して、非常に特定のコンテキストでのみ有効になるようにすることでした。以前のリリースとの下位互換性を確保します。

問題: コメントの語彙状態が既に変更されており、コメントの終了後に DEFAULT に戻ります。DEFAULT に戻すことは「ハードコーディング」されていますが、代わりに最後のアクティブな字句状態に戻すにはコメントが必要です。

私が理解していることから、状態をスタックに保持し、それらをプッシュおよびポップすると、これを達成するのに役立ちます(これはDPDAと呼ばれると思います)。これはJavaCCで可能ですか?

[編集、さらに検索した後、これが私が得た人です:]

TOKEN_MGR_DECLS : {
    Stack lexicalStateStack = new Stack();
}

SKIP : {
   " "
|  "\t"
|  "\n"
|  "\r"
}

MORE :
{
  "/*" { lexicalStateStack.push(curLexState); } : IN_COMMENT
}

SPECIAL_TOKEN :
{
  <IN_COMMENT : "*/" > { SwitchTo((int)lexicalStateStack.pop()); }
}

私がやりたいことをやっているようですが、それは正しいですか?(ここで先読みを考えます)

4

1 に答える 1

3

絶対。字句状態を積み重ねることができます。ただし、パーサーではなく、トークン マネージャーから遷移を行います。

質問3.17 を参照してください。ネストされたコメントをトークン化するにはどうすればよいですか? 3.12 パーサーは強制的に新しい字句状態に切り替えることができますか? FAQ http://www.engr.mun.ca/~theo/JavaCC-FAQ/で。

于 2013-10-16T15:47:51.627 に答える