📜  递归预测下降解析器与非递归预测下降解析器之间的区别

📅  最后修改于: 2021-06-28 06:53:33             🧑  作者: Mango

先决条件–递归下降解析器
1.递归预测下降解析器:
递归下降解析器是一种语法分析的自上而下的方法,其中使用了一组递归过程来处理输入。一个过程与语法的每个非终结符相关联。在这里,我们考虑一种称为“递归递归下降解析器”的递归下降解析的简单形式,其中,超前符号明确确定了每个非终端通过程序主体的控制流。在分析输入字符串期间,过程调用的顺序隐式定义了用于输入的解析树,并且可以根据需要用于构建显式解析树。在递归下降解析中,对于单个输入实例,解析器可能有多个产品可供选择,回溯的概念开始发挥作用。

回溯–
这意味着,如果生产的一种派生失败,则语法分析器将使用同一生产的不同规则重新启动过程。此技术可能会多次处理输入字符串以确定正确的生产。自上而下的解析器从根节点(起始符号)开始,并根据生产规则匹配输入字符串以替换它们(如果匹配)。

要了解这一点,请考虑以下CFG示例:

S -> aAb | aBb
A -> cx | dx
B -> xe 

对于输入字符串–读取,自上而下的解析器将具有以下行为。

它将从生产规则中以S开头,并将其收益与输入的最左字母(即“ a”)匹配。 S的极高产量(S-> aAb)与之匹配。因此,自上而下的解析器将前进到下一个输入字母(即“ d”)。解析器尝试扩展非终结符“ A”,并从左开始检查其产生(A-> cx)。它与下一个输入符号不匹配。因此,自上而下的解析器将回溯以获得A的下一个生成规则(A-> dx)。

现在,解析器以有序方式匹配所有输入字母。该字符串被接受。

2.非递归预测下降解析器:
不需要任何回溯的递归下降解析形式称为预测解析。它也被称为LL(1)解析表技术,因为我们将为要解析的字符串构建一个表。它具有预测要替换输入字符串的生产方式的功能。为了完成其任务,预测分析器使用一个前向指针,该指针指向下一个输入符号。为了使解析器免费回溯,预测解析器对语法施加了一些约束,并且仅接受称为LL(k)语法的一类语法。

预测解析使用堆栈和解析表来解析输入并生成解析树。堆栈和输入都包含一个结束符号$,以表示堆栈为空并且消耗了输入。解析器引用解析表对输入和堆栈元素的组合做出任何决定。在某些情况下,可能没有与生产匹配的输入字符串,从而使解析过程失败。

递归预测下降分析器与非递归预测下降分析器之间的区别:

Recursive Predictive Descent Parser Non-Recursive Predictive Descent Parser
It is a technique which may or may not require backtracking process. It is a technique that does not require any kind of back tracking.
It uses procedures for every non terminal entity to parse strings. It finds out productions to use by replacing input string.
It is a type of top-down parsing built from a set of mutually recursive procedures where each procedure implements one of non-terminal s of grammar. It is a type of top-down approach, which is also a type of recursive parsing that does not uses technique of backtracking.
It contains several small small functions one for each non- terminals in grammar. The predictive parser uses a look ahead pointer which points to next input symbols to make it parser back tracking free, predictive parser puts some constraints on grammar.
It accepts all kinds of grammars. It accepts only a class of grammar known as LL(k) grammar.