2026春《编译原理》笔记(第4、6章,语法分析)
第四章 语法分析——自顶向下分析方法(\(LL\)分析)
语法分析的方法有两种:
自下而上分析法(Bottom-up),基本思想是从输入串开始逐步进行归约(根据文法的产生式规则,把产生式的右部替换成左部符号),直到文法的开始符号,从树末端开始构造语法树。
- 算符优先分析法:按照终结符的优先关系和结合性质进行语法分析,适合分析表达式
- LR分析法:规范归约
自上而下分析法(Top-down):基本思想是它从文法的开始符号出发,反复使用各种产生式,寻找“匹配”的推导。
- 递归下降分析法:对每一语法变量(非终结符)构造一个相应的子程序,每个子程序识别一定的语法单位,通过子程序间的相互调用实现对输入串的识别
- 预测分析程序:非递归实现,直观、简单
为了满足唯一的推导过程,条件为:左部相同的产生式,其“右部的首符号集合”不相交。
FIRST集合:设文法\(G=(V_N,V_T,P,S)\),则\(FIRST(α)={a︱α =^*> aβ,a∈V_T,α,β∈V*}\),特别地,若\(α=^*>ε\),约定\(ε∈FIRST(α)\)。
FOLLOW集合:设文法\(G=(V_N, V_T, P, S)\)是上下文无关文法, \(A∈V_N\),则\(FOLLOW(A)={a|S=>αAβ, a∈FIRST(β), α∈V_T*, β∈V^+}\);若 \(S=>αAβ\),且\(β => ε\),则规定$ ∈FOLLOW(A)\(,\)#$作为输入串的结束符,也称为输入串括号。
SELECT集合:设文法\(G=(V_N, V_T, P, S)\),\(A∈V_N\) ,\(A→α∈P\),则\(SELECT(A→α)={FIRST(α),α≠>ε; (FIRST(α)-{ε})∪FOLLOW(A),α=>ε.}\)。
LL(1)文法:一个上下文无关文法是LL(1)文法的充要条件:对每个\(V_N\),\(A\)的两个不同产生式\(A→α\),\(A→β\),满足\(SELECT(A→α) ∩ SELECT(A→β) = Φ\)。
算法:\(LL(1)\)文法的判别







算法:某些非\(LL(1)\)文法到\(LL(1)\)文法的等价变换





递归
设文法\(G=(V_N,V_T,P,S\)),形如\(A→αAβ\)的规则称为文法\(G\)的直接递归规则。特别地,如果\(α=ε\)时,则称为文法\(G\)的直接左递归规则。如果\(β=ε\)时,则称为文法\(G\)的直接右递归规则。
设文法\(G=(V_N,V_T,P,S)\),如果存在推导\(A=>α=>λAμ\),则规则\(A→α\)称为文法\(G\)的间接递归规则。特别地,如果\(λ=ε\)时,则称为文法G的间接左递归规则。如果μ=ε时,则称为文法\(G\)的间接右递归规则。
通常,直接递归规则和间接递归规则统称递归规则,直接左递归规则和间接左递归规则统称左递归规则,直接右递归规则和间接右递归规则统称右递归规则。从定义可得到,直接递归规则可以认为是特殊的间接递归规则。
含有递归规则(直接递归规则或间接递归规则)的文法。称为递归文法。特别地,如果含有左递归规则的文法,则称为左递归文法。如果含有右递归规则的文法,则称为右递归文法。
引起回溯的原因
- 由于左部相同的产生式的右部First集交集不为空;
- 由于左部相同\(V_N\)的右部能推导出\(ε\),且该\(V_N\)的Follow集中含有其右部First集的元素;
- 由于文法中含有左递归。
算法:递归子程序法
递归子程序法是将每个非终结符编写成一个递归子程序,即语法分析程序的每个递归子程序完成选择规则、推导和匹配的功能。

算法:预测分析法

预测分析中的出错处理
第六章 \(LR\)分析
将符号串的任意含有头符号的子串称为前缀。特别地,空串ε为任意串的前缀。
设文法\(G[S]\),如果\(S (⇒∗R) αAω (⇒R) αβω\)是句型\(αβω\)的规范推导,则\(αβ\)称为可归前缀,\(αβ\)的前缀称为活前缀。可归前缀的后缀是句柄,句型的活前缀的右端不超过句柄末端。
增广文法:\(G[S]=(V_N,V_T,P,S)\),\(G[S']=(V_N∪{S'},V_T,P∪{S'→S}, S')\),\(V_N∩{S'}=Ф\),则\(G[S']\)是\(G[S]\)的增广文法。
6.1 \(LR(0)\)分析
算法:构造 NFA \(LR(0)\)自动机

算法:构造 DFA \(LR\)自动机

\(LR(0)\)项目分类
- 移进项目:\(A→α·aβ\)
- 待约项目:\(A→α·Xβ\)
- 归约项目:\(A→α·\)
- 接受项目:\(S′→S·\)
(其中\(α、β∈(V_N∪V_T)^*\), \(a∈V_T\) ,\(X∈V_N\)。)
MOVE运算
设\(I\)是文法\(G\)的\(LR(0)\)项目子集,则\(MOVE(I,X)\)定义为:\(MOVE(I,X) = {A→αX·β︱A→α·Xβ∈I}\)。
closure运算
设\(I\)是文法\(G\)的\(LR(0)\)项目子集,则\(closure(I)\)定义为:
- \(I⊂closure(I)\);
- \({B→·γ︱A→α·Bβ∈closure(I)}⊂closure(I)\);
- 重复 2,直到\(closure(I)\)不再扩大为止。
文法\(G\)的识别活前缀DFA \(M\)的状态集称为文法\(G\)的\(LR(0)\)项目集规范族。
算法:\(LR(0)\)识别活前缀DFA \(M\)构造

算法:\(LR(0)\)分析表的构造

移进-归约冲突和归约-归约冲突。
如果文法\(G\)的\(LR(0)\)项目集规范族不存在移进-归约冲突或归约-归约冲突的项目集,则文法G称为\(LR(0)\)文法。
- 如果文法\(G\)是\(LR(0)\)文法,则\(G\)可采用\(LR(0)\)分析法。
- 如果文法\(G\)是\(LR(0)\)文法,则\(G\)是无二义性的。
\(LR(0)\)分析表 \(ACTION\) 表中每格仅会是移进、归约和报错 3 种动作之一。
6.2 \(SLR(1)\)分析
设文法\(G\)的\(LR(0)\)项目集规范族\(C\)中任意含有\(m\)个移进项目和\(n\)个归约项目的冲突项目集\(I_k\) 的一般形式为 \(Ik={ A_1→α_1·a_1β_1 ,A_2→α_2·a_2β_2 ,··· ,A_m→α_m·a_mβ_m, B_1→γ_1· ,B_2→γ_2· ,··· ,B_n→γ_n· ,··· }\)
(其中,\(A_i、B_j ∈V_N, a_i ∈V_T, α_i 、β_j、γ_j∈(V_N∪V_T)*\), ···表示剩下的待约项目),
如果移进符号集\({ a_1 , a_2 ,··· ,α_m}\)和\(FOLLOW(B_1)、FOLLOW(B_2)、··· 、FOLLOW(B_n )\)两两相交均为空集 ,则文法G称为\(SLR(1)\)文法。
- \(SLR(1)\)文法可用\(SLR(1)\)分析法。
- \(SLR(1)\)文法是无二义性的。
- \(LR(0)\)文法一定也是\(SLR(1)\)文法。
算法:\(SLR(1)\)分析表的构造

6.3 \(LR(1)\)分析
\(LR(1)\)项目:\([A→α•β, a]\), \(a\)称为向前搜索符(展望符/前膽符),表示仅在下一个输入符号等于a时才可以按照\(A→α\)进行归约,这样的\(a\)的集合总是\(FOLLOW(A)\)的子集,通常是真子集。
搜索符的继承与传播:\([ A→α•Bβ, a ],B→γ∈P,[ B→•γ, b ]\) ,其中\(b∈FIRST(βa)\)。
MOVE运算和closure运算的新定义:

文法\(G\)的\(LR(1)\)识别活前缀DFA \(M\)的状态集称为文法\(G\)的\(LR(1)\)项目集规范族。
算法:LR(1)$识别活前缀DFA \(M\)构造

算法:\(LR(1)\)分析表的构造

设文法\(G\)的\(LR(1)\)项目集规范族\(C\)中任意含有\(m\)个移进项目和 \(n\)个归约项目的冲突项目集$ I_k \(的一般形式为\)I_k={[A_1→α_1·a_1β_1 ,S′_1],···,[A_m→α_m· a_mβ_m ,S′_m], [B_1→γ_2·,S_1],··· ,[B_n→γ_n·, S_n] ,··· }, A_i,B_j ∈V_N, a_i ∈V_T, α_i ,β_j、γ_j∈(V_N∪V_T)*, S′_i、 S_j为搜索集,最后的···表示剩下的待约项目)\(。 如果移进符号集\){ a_1 , a_2 ,··· ,α_m}\(和搜索集\)S_1、 S_2、··· 、S_n$ 两两相交均为空集,则文法\(G\)称为\(LR(1)\)文法。
- 如果文法\(G\)是\(LR(1)\)文法,则\(G\)可采用\(LR(1)\)分析法。
- 如果文法\(G\)是\(LR(1)\)文法,则\(G\)是无二义性的。
- 如果文法\(G\)是\(SLR(1)\)文法,则\(G\)一定是\(LR(1)\)。
算法示例:\(LR(1)\)分析步骤

6.4 \(LALR(1)\)分析
如果采用同心项目集合并方法,进行合并后的文法\(G\)的\(LR(1)\)项目集规范族,没有\(LR(1)\)项目冲突,则称文法\(G\)为\(LALR(1)\)文法。
- 如果文法\(G\)是\(LALR(1)\)文法,则\(G\)可采用\(LALR(1)\)分析法。
- 如果文法\(G\)是\(LALR(1)\)文法,则\(G\)是无二义性的。
- 如果文法\(G\)是\(LALR(1)\)文法,则\(G\)一定是\(LR(1)\)的。
- \(LALR(1)\)文法形式上与\(LR(1)\)相同,大小上与\(LR(0)/SLR\)相当,分析能力介于\(SLR\)和\(LR(1)\)二者之间,合并后的向前搜索符集合仍为\(FOLLOW\)集的子集。
分析能力:\(LR(0) < SLR(1) < LALR(1) < LR(1)\)。
不同语法分析方法及其文法之间的关系:

二义性文法的应用。
浙公网安备 33010602011771号