parsing - 左因式分解的自动语法转换;和左递归移除

标签 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) 解析器的等效语法?

最佳答案

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

关于parsing - 左因式分解的自动语法转换;和左递归移除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17265798/

相关文章:

python - 使用biopython解析Fasta文件描述

c - 循环解析器

regex - 在 Perl 中使用正则表达式模式生成语法?

haskell - 解析一个列表,其分隔符也可能出现在末尾

c++ - C++ 函数的 parsec 解析器?

使用 boost-spirit 解析超过 15 个字符的字符串

c - BNF C 文法中的函数定义

Swift 语法显式成员表达式

haskell - 不支持 Parsec.Expr 重复前缀/后缀运算符

android - 使用 jsoup 解析获取 href 那些有 title 的人