Javacc добавить операцию, вызывающую проблемы

Я пытаюсь создать простой синтаксический анализатор, но у меня возникли некоторые проблемы при попытке учесть необязательный знак перед первым элементом:

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

например, [-] 5 + 3 - 4

здесь проблема с первым необязательным [addop()], который определяется как:

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

В настоящее время я получаю конфликт выбора и рекомендую использовать LOOKAHEAD(), но нет конфликта выбора, который распознает javacc при использовании LOOKAHEAD()

Заранее спасибо!

2 ответа

Я думаю, что требуется больше разъяснений. Я не конфликтую со следующим

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

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

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

void element() : {}
{
    < CONSTANT > | "(" sum() ")"
}

Обычно вы хотите, чтобы унарный минус и -plus имели более высокий приоритет, чем их двоичные аналоги. Итак, я думаю, вы хотите что-то вроде этого:

// ...

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

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

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

// ...

который не понадобится LOOKAHEAD(...),

Другие вопросы по тегам