1

私は単純なパーサーを作成しようとしていますが、最初の要素の前にオプションの記号を考慮しようとすると少し問題があります:

    void expr5() : {}
    {
        [addop()] expr6() (addop() expr6())*
    }

例 [-] 5 + 3 - 4

ここでの問題は、次のように定義されている最初のオプションの [addop()] にあります。

    void addop() : {}
    {
        <PLUS> | <MINUS>
    }

現在、選択の競合が発生しており、LOOKAHEAD() を使用することをお勧めしますが、LOOKAHEAD() の使用時に javacc が認識する選択の競合はありません。

前もって感謝します!

4

2 に答える 2

1

もっと明確にする必要があると思います。私は以下と衝突しません

void sum() : {}
{
  [ addOp() ]
  term()
  ( addOp()  term() )*
}

void addOp() : {}
{     < PLUS > | < MINUS > }

void term() : {}
{
  element()
  ( ( < MULTIPLY > | < DIVIDE > ) element() )*
}

void element() : {}
{
    < CONSTANT > | "(" sum() ")"
}
于 2013-01-28T02:57:41.170 に答える
0

通常、unary-minus と -plus は、対応するバイナリよりも高い優先度を与えたいと考えています。したがって、次のようなものが必要になると思います。

// ...

void add() : {}
{
  mul() ( <PLUS> mul() | <MINUS> mul() )*
}

void mul() : {}
{
  unary() ( <MULTIPLY> unary() | <DIVIDE> unary() )*
}

void unary() : {}
{
  <PLUS> atom() | <MINUS> atom() | atom()
}

// ...

は必要ありませんLOOKAHEAD(...)

于 2013-01-07T18:57:46.217 に答える