3

标准方法很容易将不是 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) 解析器的等效语法?

4

1 回答 1

1

这里的 Haskell 语法组合库允许将语法转换为非左递归形式。输入文法必须是解析表达式文法

于 2013-06-27T20:39:07.363 回答