标准方法可以很容易地将不属于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)解析器的等价语法?
发布于 2013-06-27 12:39:07
Haskell语法组合器库这里允许将语法转换为非左递归形式。但是,输入语法必须是https://en.wikipedia.org/wiki/Parsing_expression_grammar。
https://stackoverflow.com/questions/17265798
复制相似问题