在本文中,我们将研究各种类型的解析。从GATE的角度来看,它是Compiler中最重要的主题之一。将从GATE问题解决的角度解释各种解析器的工作。
先决条件–语法,语法分析树,模棱两可的基本知识。
解析器的作用:
在语法分析阶段,编译器将根据语言的语法规则验证是否由词法分析器生成的标记被分组。这是由解析器完成的。解析器从词法分析器获取一个令牌字符串,并验证该字符串是否可以作为源语言的语法。它检测并报告任何语法错误,并生成一个可从中生成中间代码的解析树。
在进入解析器类型之前,我们将讨论一些有关理解解析所需的重要事项的想法。
上下文无关文法:
编程语言的语法由上下文无关文法(CFG)描述。 CFG由一组端子,一组非端子,一个起始符号和一组产品组成。
记号–? ? ?在哪里 ?是一个是单个变量[V]
? ? (V + T)*
含糊不清
可以为某个句子产生多个解析树的语法被认为是模棱两可的。
例如,考虑语法
S-> aS |萨|一种
现在对于字符串aaa,我们将有4个解析树,因此模棱两可
有关更多信息,请参阅quiz.geeksforgeeks.org/ambiguous-grammar/
删除左递归:
如果语法具有非终止(变量)S,则语法是递归的
S->Sα| β
其中α?(V + T)*和β?(V + T)*(不以S开头的端子和非端子的顺序)
由于存在左递归,一些自上而下的解析器进入了无限循环,因此我们必须消除左递归。
让作品是形式为A – >Aα1 | Aα2 | Aα3 | ….. | AαM | β1 | β2 | …。 | n
其中没有βi以A开头。然后我们将A产品替换为
A – >β1 A” | β2 A” | ….. | βN A”
A ‘ – >α1 A’ | α2 A” | α3 A’| ….. | αM A” | ε
非终结符A生成与以前相同的字符串,但是不再递归。
让我们看一些例子以更好地理解
删除左因子:
语法的形式被认为是左因子–
A – >αβ1 | αβ2 | αβ3 | ……| αβN | γ,即生产从相同的端子(或一组端子)开始。在看到输入α时,我们无法立即知道选择哪个产品来扩展A。
左因子分解是一种语法转换,可用于产生适用于预测或自上而下解析的语法。当两个备选A作品之间的选择不清楚时,我们也许可以重写作品以推迟决策,直到看到足够的输入做出正确的选择为止。
对于语法A – >αβ1 | αβ2 | αβ3 | ……| αβN | γ
等效的因式分解语法为–
A->αA’| γ
A” – >β1 | β2 | β3 | ……| n
从给定的语法派生字符串的过程称为派生(解析)。
根据推导的完成方式,我们有两种解析器:
- 自上而下的解析器
- 自下而上的解析器
我们将从GATE的角度研究解析器。
自上而下的解析器
自上而下的解析尝试从根到叶构建解析树。自上而下的解析器将从开始符号开始,然后进行到字符串。它遵循最左边的推导。在最左边的推导中,总是选择每个句子中最左边的非终结符。
递归下降解析
S()
{ Choose any S production, S ->X1X2…..Xk;
for (i = 1 to k)
{
If ( Xi is a non-terminal)
Call procedure Xi();
else if ( Xi equals the current input, increment input)
Else /* error has occurred, backtrack and try another possibility */
}
}
让我们通过一个例子更好地了解它
递归下降解析程序由一组过程组成,每个非终端过程一个。执行从起始符号的过程开始,如果它的过程主体扫描了整个输入字符串,它将停止。
非递归预测解析:
如果解析不需要回溯,则为此类型。可以为LL(1)语法构建预测解析器,第一个“ L”代表从左到右扫描输入,第二个“ L”代表最左派生,“ 1”表示在每个步骤中使用一个输入符号超前做出解析操作决策。
在继续进行LL(1)解析器之前,请先进行以下操作
http://quiz.geeksforgeeks.org/compiler-design-first-in-syntax-analysis/
http://quiz.geeksforgeeks.org/compiler-design-follow-set-in-syntax-analysis/
LL(1)预测分析表的构造
对于每个产品A->α,重复以下步骤–
为FIRST(α)中的所有b在M [A,b]下添加A->α
如果FIRST(α)包含ε,则对FOLLOW(A)中的所有c在M [A,c]下添加A->α。
解析表的大小=(端子数+ 1)*#变量
例如-考虑语法
S->(L)|一种
L-> SL’
L’->ε| SL’
对于任何语法,如果M具有多个条目而不是非LL(1)语法
例如–
S-> iEtSS’/ a
S’-> eS /ε
E-> b
重要笔记
1. If a grammar contain left factoring then it can not be LL(1)
Eg - S -> aS | a ---- both productions go in a
2. If a grammar contain left recursion it can not be LL(1)
Eg - S -> Sa | b
S -> Sa goes to FIRST(S) = b
S -> b goes to b, thus b has 2 entries hence not LL(1)
3. If a grammar is ambiguous then it can not be LL(1)
4. Every regular grammar need not be LL(1) because
regular grammar may contain left factoring, left recursion or ambiguity.
我们将在下一篇文章(第2集)中讨论自下而上的解析器。