左因子分解的自动语法转换;和左递归删除

时间:2013-06-23 22:08:53

标签: parsing grammar parsec left-recursion

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

1 个答案:

答案 0 :(得分:1)

Haskell语法 - 组合器库here允许将语法转换为非左递归形式。输入语法必须是 parsing expression grammar