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(...)
,