1

後で解析するために特定のチャンクを保存できるように、入力を部分的に解析しようとしています。

void start():{}
{
    stmt()*
}

void stmt():{}
{
    "parse:" expr_later() ";"
}

void expr_later():{}
{
    (
    expr();
    // store tokens from expr() in a list for later processing....
    )*
}

void expr():{}
{
    "{" expr() "}"
|    <ANY:~[]>
}

この場合、「ANY」トークンは、前のトークンが他に一致しなかった場合にのみ有効になりますが、さらに多くのトークン定義があると仮定すると、上記の文法は機能しません。

トークンではなく~[]、任意の文字に一致することを私は知っています。

さらに、代わりにトークンの状態 (javadoc、プラグマなどで行うもの) を使用するとします。特別なトークンの状態を設定するためのトークンがないため、チャンクのキャプチャにまだ問題があります。また、パーサーを介してトークンの状態を設定することは、JavaCC の FAQ によると、不適切な方法のようです。これは、TokenManager のキューに既にいくつかのトークンが含まれている可能性があるためです。

だから、トークンに関してANYと同等のものがあるかどうか疑問に思っています。または、誰かが少なくとも私の問題に別の方法でアプローチする方法を知っていますか?

4

1 に答える 1

2

もちろん、「{」と「}」を除くすべての種類のトークンをリストする大きなプロダクションを作成する方法もあります。

Token any() :{Token t;}{ (t=<NUMBER> | t=<IDENTIFIER> | t="(" | ... | ) {return t;} }

しかし、それはまったくエレガントではありません。

JAVACODE代わりに、最後の閉じ括弧が見つかるまでトークンを消費するプロダクションを作成できます。同様の例については、https://javacc.java.net/doc/javaccgrm.html#JAVACODEを参照してください。

于 2013-06-21T23:19:32.283 に答える