先决条件–递归下降解析器
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. |