JavaCC留下了有关分解语法合法性的递归解析问题

时间:2018-11-08 17:12:19

标签: compiler-construction javacc left-recursion

我正在尝试在javacc上进行编译,但是不确定删除左递归时以下内容是否合法:

A = B AP APP
      | C AP APP

AP = A AP | {}

APP = (D AP) APP | {}

1 个答案:

答案 0 :(得分:0)

我将假设B,C和D是终端。我将再添加一个非终结符

START --> A <EOF>

A --> <B> AP APP
     | <C> AP APP

AP --> A AP | {}

APP --> <D> AP APP | {}

显而易见,第一个选择可以解决。对于第二种选择,我们需要第一组A AP与后面的AP组不相交;前者是{<B>, <C>},后者是{<EOF>,<D>}。对于第三种选择,我们需要<D>不在APP的跟随集合{<EOF>}中。

我们现在知道语法是LL(1),因此它应该与JavaCC一起使用。

注意:确定语法是否适用于JavaCC有点复杂,因为JavaCC并不完全按照理论所说的那样计算跟随集,并且因为JavaCC有许多机制可以使它与非LL(1)一起使用)语法。但是通常,如果您的语法是LL(1),JavaCC会很好地处理它。另外,如果JavaCC无法正常工作,则会发出警告消息。