Javacc 冲突产生式

Javacc conflicting productions

我有两个输入

  1. a - b
  2. a += b

我有一个选择的作品

void AssignmentExpression() : {}
{
  LOOKAHEAD(3) ConditionalExpression()
| LOOKAHEAD(3) UnaryExpression() AssignmentOperator() AssignmentExpression()
}

使用此生产输入 (1) 有效,但输入 (2) 无效。

如果我在生产中交换选择,那么它就变成了

void AssignmentExpression() : {}
{
  LOOKAHEAD(3) UnaryExpression() AssignmentOperator() AssignmentExpression()
| LOOKAHEAD(3) ConditionalExpression()
}

然后输入(2)有效,但输入(1)无效。

我该如何解决这个问题?增加 LOOKAHEAD 参数没有帮助。

参见Expression Parsing by Recursive Descent。关注"classic solution".

由于您使用的是 JJTree,Make a calculator's grammar that make a binary tree with javacc 问题的答案将会有所帮助。

你可以试试

void AssignmentExpression() : {}
{
  LOOKAHEAD(UnaryExpression() AssignmentOperator() )
  UnaryExpression() AssignmentOperator() AssignmentExpression()
| ConditionalExpression()
}

如果不了解更多语法,很难知道这是否有效。由于使用前瞻规范将抑制来自 JavaCC 的任何警告 --JavaCC "assumes" 你知道你在做什么 -- 你必须自己进行分析。

我的另一个答案更好。