我正在尝试创建一个简单的解析器,但在尝试考虑第一个元素之前的可选符号时遇到了一些麻烦:
void expr5() : {}
{
[addop()] expr6() (addop() expr6())*
}
e.g。 [ - ] 5 + 3 - 4
这里的问题是第一个可选的[addop()] 其定义为:
void addop() : {}
{
<PLUS> | <MINUS>
}
我目前正在进行选择冲突,并建议使用LOOKAHEAD()但是javacc在使用LOOKAHEAD()时没有选择冲突
提前致谢!
答案 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(...)
。