1

私はこのように大まかに定義された文法を持っています。

TOKEN:{
        <T_INT: "int"> |
        <T_STRING: ["a"-"z"](["a"-"z"])*>
}

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

/** Main production. */
SimpleNode Start() : {}
{
        (LOOKAHEAD(Declaration()) Declaration() | Function())
  { return jjtThis; }
}

void Declaration() #Decl: {}
{
        <T_INT> <T_STRING> ";"
}

void Function() #Func: {}
{
        <T_STRING> "();"
}

これは、次のような場合に正常に機能します。

int a;
foo();

しかし、私が試してみるとint();、これは私にとって合法であり、Function()によって解析される必要がありますが、代わりに宣言になります。この「競合」を修正するにはどうすればよいですか?いろいろ組み合わせてみました。

4

1 に答える 1

1

これに関する JavaCC FAQ のセクションは、「予約されていないキーワードをどのように処理しますか?」というタイトルです。

私がすることは、識別子の代わりにキーワードを許可することです。つまり、

(<T_STRING> | <T_INT>) "();"

多くのキーワードがある場合Identifier、一般的な識別子トークンとともに、それらすべてを許可するプロダクションを作成すると有益な場合があります。

ちなみに、"(" ")" ";"代わりに"();".

于 2012-06-05T08:45:50.793 に答える