Javacc冲突的制作

时间:2015-03-29 17:22:16

标签: javacc

我有两个输入

  1. a - b
  2. a += b
  3. 我有一个选择的作品

    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参数没有帮助。

2 个答案:

答案 0 :(得分:0)

Expression Parsing by Recursive Descent。遵循“经典解决方案”。

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

答案 1 :(得分:0)

您可以尝试

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

如果没有看到更多的语法,很难知道这是否有效。由于使用先行规范将抑制来自JavaCC的任何警告--JavaCC"假设"你知道自己在做什么 - 你必须自己做分析。

我的其他答案更好。