javacc添加操作导致问题

时间:2013-01-07 18:06:51

标签: parsing conflict choice lookahead javacc

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

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

e.g。 [ - ] 5 + 3 - 4

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

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

我目前正在进行选择冲突,并建议使用LOOKAHEAD()但是javacc在使用LOOKAHEAD()时没有选择冲突

提前致谢!

2 个答案:

答案 0 :(得分:1)

我认为需要进一步澄清。我与以下

没有冲突
void sum() : {}
{
  [ addOp() ]
  term()
  ( addOp()  term() )*
}

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

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

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

答案 1 :(得分: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(...)