Parsing javacc add操作导致问题

Parsing javacc add操作导致问题,parsing,conflict,choice,lookahead,javacc,Parsing,Conflict,Choice,Lookahead,Javacc,我试图创建一个简单的解析器,但在考虑第一个元素之前的可选符号时遇到了一些麻烦: void expr5() : {} { [addop()] expr6() (addop() expr6())* } e、 g.[-]5+3-4 这里的问题是第一个可选的[addop()] 定义为: void addop() : {} { <PLUS> | <MINUS> } void addop():{} {

我试图创建一个简单的解析器,但在考虑第一个元素之前的可选符号时遇到了一些麻烦:

    void expr5() : {}
    {
        [addop()] expr6() (addop() expr6())*
    }
e、 g.[-]5+3-4

这里的问题是第一个可选的[addop()] 定义为:

    void addop() : {}
    {
        <PLUS> | <MINUS>
    }
void addop():{}
{
| 
}
我目前遇到了一个选择冲突,建议使用LOOKAHEAD(),但javacc在使用LOOKAHEAD()时无法识别选择冲突


提前谢谢

您通常希望给一元减和-加的优先级高于它们的二进制对应项。所以,我想你会想要这样的东西:

// ...

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

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

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

// ...
/。。。
void add():{}
{
mul()(mul()| mul())*
}
void mul():{}
{
一元()(一元()|一元())*
}
void一元():{}
{
原子()|原子()|原子()
}
// ...

它不需要任何
先行(…)

您通常希望给一元负号和-加号一个比二进制更高的优先级。所以,我想你会想要这样的东西:

// ...

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

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

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

// ...
/。。。
void add():{}
{
mul()(mul()| mul())*
}
void mul():{}
{
一元()(一元()|一元())*
}
void一元():{}
{
原子()|原子()|原子()
}
// ...

这将不需要任何
前瞻(…)

我认为需要更多的澄清。我与以下内容没有冲突

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

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

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

void element() : {}
{
    < CONSTANT > | "(" sum() ")"
}
void sum():{}
{
[addOp()]
术语()
(addOp()术语())*
}
void addOp():{}
{|}
无效项():{}
{
元素()
(((|)元素()*
}
void元素():{}
{
|“(“sum()”)
}

我认为需要更多的澄清。我与以下内容没有冲突

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

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

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

void element() : {}
{
    < CONSTANT > | "(" sum() ")"
}
void sum():{}
{
[addOp()]
术语()
(addOp()术语())*
}
void addOp():{}
{|}
无效项():{}
{
元素()
(((|)元素()*
}
void元素():{}
{
|“(“sum()”)
}