标准方法很容易将不是 LL(1) 的上下文无关文法转换为等价的文法。是否有任何可用的工具可以自动执行此过程?
在下面的示例中,我对非终端使用大写字母,对终端使用小写。
以下左递归非终结符:
A -> A a | b
可以转化为右递归形式:
A -> b A'
A' -> NIL | a A'
请注意,左递归产生式规则确保表达式与左相关联,右递归产生式也是如此;因此语法修改也会改变表达式的关联性。
另一个问题是间接左递归,例如:
A -> B a
B -> A b
左因子也用于确保解析器只需要一个前瞻标记。以下产生式必须向前看两个标记:
A -> a b | a c
这也可以重构;至:
A -> a (b | c)
是否有任何软件工具可以自动化这些语法转换?从而产生适用于 LL(1) 解析器的等效语法?