【问题标题】:Javacc conflicting productionsJavacc 冲突产生式
【发布时间】:2015-03-29 17:22:16
【问题描述】:

我有两个输入

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

【问题讨论】:

    标签: javacc


    【解决方案1】:

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

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

    【讨论】:

    • 您好,我无法更改语法。请再看一看。
    【解决方案2】:

    你可以试试

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

    如果不了解更多语法,很难知道这是否可行。由于使用前瞻规范会抑制来自 JavaCC 的任何警告——JavaCC“假定”你知道自己在做什么——你必须自己进行分析。

    我的另一个答案更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多