Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 左因子分解的自动语法转换;左递归移除_Parsing_Grammar_Parsec_Left Recursion - Fatal编程技术网

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

Parsing 左因子分解的自动语法转换;左递归移除,parsing,grammar,parsec,left-recursion,Parsing,Grammar,Parsec,Left Recursion,标准方法可以很容易地将非LL(1)的上下文无关语法转换为等价的LL(1)语法。是否有任何工具可以自动执行此过程 在下面的示例中,我使用大写字母表示非端子,小写字母表示端子 以下为左递归非终结符: A -> A a | b 可以转换为正确的递归形式: A -> b A' A' -> NIL | a A' 注意,尽管左递归产生式规则确保表达式与左关联,与右递归产生式类似;因此,语法修改也会改变表达式的关联性 另一个问题是间接左递归,例如: A -> B a B -&g

标准方法可以很容易地将非LL(1)的上下文无关语法转换为等价的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语法组合器库允许将语法转换为非左递归形式。但输入语法必须是一个