1

私はJavaCCを使用して単純な言語のパーサーに取り組んでいます。

私のトークン宣言セクションには、次のようなものがあります

< CONSTANT: < INTEGER > | < FLOAT_NUMBER > | < BOOLEAN > >

< INTEGER: "0" | ("-")? ["1"-"9"](["0"-"9"])* | "0x" (["0"-"9"] | ["a"-"f"]  | ["A"-"F"])+ >
< FLOAT_NUMBER: ("-")? (["0"-"9"])+ "." (["0"-"9"])+ ("E" ("-")? (["0"-"9"])+)? ("D")? >
< BOOLEAN: "true" | "false">

CONSTANT、その順序により、。よりも優先されINTEGERます。ただし、特に、が必要な文法の部分がありINTEGERます。INTEGERこのような場合、はとして解析されたため、パーサーは例外をスローしますCONSTANT

簡単な解決策は、トークンを削除し、CONSTANTそれを検索して置換することです (< INTEGER > | < FLOAT_NUMBER > | < BOOLEAN >)。しかし、これはかなり不格好に感じます。

それ自体はトークンではなく、略記であるCONSTANTような、他のトークンの単なるグループとして定義する方法はありますか?CONSTANT(< INTEGER > | < FLOAT_NUMBER > | < BOOLEAN >)

お時間をいただきありがとうございます。

4

1 に答える 1

2

ここでの簡単な答えは、トークナイザーでこれを行うべきではないということだと思います。

これを次のようなプロダクションルールに入れることをお勧めします。

Token parseConstant() :
{
    Token t;    
}

{
    (
      t = < INTEGER > | t = < FLOAT_NUMBER > | t = < BOOLEAN >
    )
    {
      return t;
    }

}
于 2012-05-15T20:09:17.350 に答える