我正在尝试在javacc上进行编译,但是不确定删除左递归时以下内容是否合法:
A = B AP APP
| C AP APP
AP = A AP | {}
APP = (D AP) APP | {}
答案 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无法正常工作,则会发出警告消息。