标准方法可用于将不具有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)解析器的等效语法?