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)\)文法的判别

image

image
image
image

image

image

image

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

image

image

image

image

image

递归
设文法\(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集的元素;
  • 由于文法中含有左递归。

算法:递归子程序法

递归子程序法是将每个非终结符编写成一个递归子程序,即语法分析程序的每个递归子程序完成选择规则、推导和匹配的功能。

image

算法:预测分析法

image

预测分析中的出错处理

第六章 \(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)\)自动机

image

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

image

\(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)\)定义为:

  1. \(I⊂closure(I)\)
  2. \({B→·γ︱A→α·Bβ∈closure(I)}⊂closure(I)\)
  3. 重复 2,直到\(closure(I)\)不再扩大为止。

文法\(G\)的识别活前缀DFA \(M\)的状态集称为文法\(G\)\(LR(0)\)项目集规范族。

算法:\(LR(0)\)识别活前缀DFA \(M\)构造

image

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

image

移进-归约冲突和归约-归约冲突。

如果文法\(G\)\(LR(0)\)项目集规范族不存在移进-归约冲突或归约-归约冲突的项目集,则文法G称为\(LR(0)\)文法。

  1. 如果文法\(G\)\(LR(0)\)文法,则\(G\)可采用\(LR(0)\)分析法。
  2. 如果文法\(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)\)分析表的构造

image

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运算的新定义
image

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

算法:LR(1)$识别活前缀DFA \(M\)构造

image

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

image

设文法\(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)\)文法。

  1. 如果文法\(G\)\(LR(1)\)文法,则\(G\)可采用\(LR(1)\)分析法。
  2. 如果文法\(G\)\(LR(1)\)文法,则\(G\)是无二义性的。
  3. 如果文法\(G\)\(SLR(1)\)文法,则\(G\)一定是\(LR(1)\)

算法示例:\(LR(1)\)分析步骤

image

6.4 \(LALR(1)\)分析

如果采用同心项目集合并方法,进行合并后的文法\(G\)\(LR(1)\)项目集规范族,没有\(LR(1)\)项目冲突,则称文法\(G\)\(LALR(1)\)文法。

  1. 如果文法\(G\)\(LALR(1)\)文法,则\(G\)可采用\(LALR(1)\)分析法。
  2. 如果文法\(G\)\(LALR(1)\)文法,则\(G\)是无二义性的。
  3. 如果文法\(G\)\(LALR(1)\)文法,则\(G\)一定是\(LR(1)\)的。
  4. \(LALR(1)\)文法形式上与\(LR(1)\)相同,大小上与\(LR(0)/SLR\)相当,分析能力介于\(SLR\)\(LR(1)\)二者之间,合并后的向前搜索符集合仍为\(FOLLOW\)集的子集。
    分析能力:\(LR(0) < SLR(1) < LALR(1) < LR(1)\)

不同语法分析方法及其文法之间的关系
image

二义性文法的应用

posted on 2026-06-26 17:32  汐寻  阅读(9)  评论(0)    收藏  举报