编译原理第五章 语法分析-自底向上分析方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单优先分析算法要点
找第一个使S 找第一个使 j⊳Sj+1的Sj 从Sj开始往前(左)找第一个使 i-1⊲Si的Si 开始往前 左 找第一个使S 找第一个使 去查产生式的右部, 用SiSi+1…Sj去查产生式的右部,并用相应 的左部符号代替句柄S 归约) 的左部符号代替句柄 iSi+1…Sj (归约 。 归约 重复上述过程,直至输入符结束。 重复上述过程,直至输入符结束。如果归 约出文法的开始符号则成功。否则失败。 约出文法的开始符号则成功。否则失败。
活前缀的描述性定义: 活前缀的描述性定义:形成可归前缀之 前,包括可归前缀在内所有规范句型的 前缀都称为活前缀。 前缀都称为活前缀。 为一个或若干规范句型的前缀。 活前缀 为一个或若干规范句型的前缀。 在规范归约过程中的任何时刻已分析过 的部分,即在分析栈(符号栈) 的部分,即在分析栈(符号栈)中的符 号串均为规范句型的活前缀,表明输入 号串均为规范句型的活前缀, 串的已被分析过的部分是该文法某规范 句型的一个正确部分。 句型的一个正确部分。
⇒ aAb[3]cd[4]e[1] ⇒ ab[2]b[3]cd[4]e[1]
源自文库
简单优先分析
一种shift-reduce分析方法 分析方法 一种
根据文法符号的优先关系确定句柄
文法符号的优先关系的确定
简单优先分析中的三种关系
当且仅当存在一个产生式A→ XY… A→…XY X ≅ Y :当且仅当存在一个产生式A→ XY 当且仅当存在一个产生式A→ XB… A→…XB X ⊲ Y :当且仅当存在一个产生式A→ XB 并有B 并有B⇒+Y…。 。 当且仅当存在一个产生式A→ BC… A→…BC X ⊳ Y :当且仅当存在一个产生式A→ BC 并有B 并有B⇒+…X,C⇒*Y…。 X 。 文法G 简单优先文法如果满足: 文法G为简单优先文法如果满足: 如果满足 对于任意两个语法符号X • 对于任意两个语法符号X和Y,至多成立一种 优先关系; 优先关系; 任意两个产生式都具有不同的右部。 • 任意两个产生式都具有不同的右部。
第五章 自底向上分析方法
主要内容 自底向上分析的基本思想 简单优先分析方法 LR类分析方法 LR类分析方法
自底向上语法分析方法介绍
从待分析的符号串开始, 从待分析的符号串开始,自左向右进 行扫描,自下而上进行分析, 行扫描,自下而上进行分析,通过反复查找当前句 型的句柄, 型的句柄,并使用产生式规则将找到的句柄归约为 相应产生式的左部非终极符, 相应产生式的左部非终极符,直到将输入串归约为 文法的开始符。(移入-归约分析) 文法的开始符。 移入-归约分析)
识别规约活前缀的LRSM的构造 识别规约活前缀的LRSM的构造 LRSM
派生定理
开始符产生式的右部是归约活前缀。 开始符产生式的右部是归约活前缀。 如果αAβ是归约活前缀,且A→π是产生式, 如果α 是归约活前缀, A→π是产生式, απ也是归约活前缀 也是归约活前缀。 则απ也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 任何归约活前缀,都可按上述方式被派生。
例: Z → bMb Z M→a Z M → (L L → Ma) M
L b ( a ) #
Z FIRST b LAST b M L
M a( aL) b ≅ ≅ ( a ≅
L M( a ) ) #

⊲ ≅

⊳ ⊲ ⊲ ⊲ ⊲ ⊳ ⊳ ⊳ ⊳ ⊲ ⊳


定理: 定理: 是一个句型, 设X1…XiXi+1…Xj…Xn是一个句型,若有 Xi ⊲Xi+1 ≅Xi+2 ≅… ≅Xj-1 ≅Xj ⊳Xj+1 一定是该句型的简单短语。 则Xi+1Xi+2…Xj-1Xj一定是该句型的简单短语。 结论: 用来确定句柄的头; 结论: ⊲用来确定句柄的头; ≅用来确定句柄 的内部; 用来确定句柄的结束。 的内部; ⊳用来确定句柄的结束。
例:构造LR(0)状态机 构造 状态机 S→E$ E→E+T E→T T → id T→ ( E ) →
0
S→• E $ • E→• E+T • E→• T • T→• id • T→• ( E ) •
T ( id +
9
T
6
E→T •
5
T→id •
id (
T→(• E) • E→• E+T • E→• T • T→• id • T→• ( E ) •
基本思想
两种分析方法
简单优先和LR类分析方法 简单优先和LR类分析方法 LR
例:S → aAcBe [1] A→b [2] A → Ab [3] B→d [4] 输入流: 输入流:abbcde。 。 规范推导过程为: 规范推导过程为: S ⇒ aAcBe[1] ⇒ aAcd aAcd[4]e[1]
设当前格局是: 设当前格局是:
# X1 X2 … Xk … Xt Si0 Si1 Si2 … Sik … Sit # X1 X2 … Xk … Xt ai Si0 Si1 Si2 … Sik … Sit S*
aiai+1…an #
移入动作: 输入边所指向的状态为S* 移入动作:设Sit的ai输入边所指向的状态为
简单优先分析实例
符号栈 # #b #b( #b(a #b(M #b(Ma #b(Ma) #b(L #bM #bMb #Z 关系 输入流 b(aa)b# (aa)b# aa)b# a)b# a)b# )b# b# b# b# # #
⊲ ⊲ ⊲ ⊳
≅ ≅

⊳ ⊳
⊳ ⊳
LR类分析方法 LR类分析方法
•规范句型:用最右推导导出的句型 也称右句 规范句型:用最右推导导出的句型(也称右句
型)。 •规范前缀:若存在规范句型αη,且η是终极符 规范前缀:若存在规范句型αη αη, 串或空串,则称α为规范前缀。 串或空串,则称α为规范前缀。 •规范活前缀:若规范前缀α不含句柄或含一个 规范活前缀:若规范前缀α 句柄并且具有形式α α′π 是句柄), α′π(π 句柄并且具有形式α=α′π π是句柄 ,则称规范前 为规范活前缀(简称活前缀 简称活前缀)。 缀α为规范活前缀 简称活前缀)。 •归约规范活前缀:若活前缀α是含句柄的活前 归约规范活前缀:若活前缀α 即有α α′π α′π, 是句柄,则称活前缀α 缀,即有α=α′π,且π是句柄,则称活前缀α为归 约规范活前缀(简称归约活前缀)。 约规范活前缀(简称归约活前缀)。
形如A P]的项目称为 的项目称为归约型项目 形如A→π• [P]的项目称为归约型项目 形如A→ β [P]的项目称为 A→α 的项目称为移入型项目 形如A→α•β [P]的项目称为移入型项目 移入- 移入-归约冲突 归约- 归约-归约冲突 LRSM不能直接用于LR分析 LRSM不能直接用于LR分析 不能直接用于LR LRSM提供的信息 提供的信息: LRSM提供的信息: 合法性检查信息[A→α• α•a (1)合法性检查信息[A→α•aβ] 移入/ A→α• α•a (2)移入/归约信息 [A→α•aβ] A→π• π•] [A→π•] 移入/ (3)移入/归约后的转向状态信息
(
E
1 3
id
E→E+ • T T→• id • T→• (E) •
E
7
S→E• $ • E→E• +T •
+
T→(E• ) • E→E• +T •
$
2 4
T
8
)
T→(E) •
S→E $• •
E→E+T •
GE的LRSM
LRSM给出了所有的可归活前缀 LRSM给出了所有的可归活前缀
LRSM中的每个状态将对应一个饱和项目集: LRSM中的每个状态将对应一个饱和项目集: 中的每个状态将对应一个饱和项目集 (1)其中一部分是由先驱状态分出来 称为基本项目) (称为基本项目); (2)一部分则是由基本项目扩展出来的 称为扩展项目或派生项目) (称为扩展项目或派生项目)。派生部 分项目的特点是其中的“ 分项目的特点是其中的“•”出现在 产 生式右部的最左侧。 生式右部的最左侧。
文法优先关系的确定
FIRST(W) ={S | W ⇒+ S…,S∈(VN∪VT)} , ∈ LAST(W) ={S | W ⇒+ …S,S∈(VN ∪VT)} , ∈ 若有U→ 则有S 若有 →…SiSj…: 则有 i ≅ Sj ; 若有U→ 若有 →…SiW…:任Sj∈FIRST(W),有Si ⊲ Sj 任 有 若有U→ 若有 →…VW…:任Si∈LAST(V), 任 Sj∈(FIRST(W) ∪{W})则有 i ⊳ Sj 则有S 则有 文法的开始符为Z, 输入流的开始和结束标志 ‘#’,文法的开始符为 , S∈FIRST(Z),有# ⊲ S,; 且# ⊲ Z ∈ 有 , S∈LAST(Z),有S ⊳ #,; 且Z ⊳ # ∈ , , 优先关系矩阵 一个文法的全部优先关系可以用矩阵 来表示,称作优先关系矩阵。 来表示,称作优先关系矩阵。
逆过程: 符号栈,输入流) 逆过程:(符号栈,输入流)
( -, abbcde) ⇒(a,bbcde) ⇒(ab,bcde) (ab ⇒(aA,bcde) ⇒(aAb,cde) (aAb,cde) Ab ⇒(aA,cde) ⇒(aAc,de) ⇒(aAcd,e) (aAcd ⇒(aAcB,e) aAcBe, ⇒(aAcBe,-) ⇒(S,-) (S,-
LR(0)项目: A→αβ是产生式, LR(0)项目:若A→αβ是产生式, 项目 αβ是产生式 则称A→α•β为LR(0)项目 简称项目), A→α•β 项目( ),也 则称A→α•β为LR(0)项目(简称项目),也 写作α•β p]形式 α•β[ 形式。 写作α•β[p]形式。 项目集的投影:假设IS LR(0)项目集 IS是 项目集, 项目集的投影:假设IS是LR(0)项目集,则 IS关于 的投影集: 关于X 称下面IS 称下面IS(X) 为IS关于X的投影集: {A→α |A→α• β∈IS, α•X IS(X) = {A→αX•β |A→α•Xβ∈IS, X∈(VT∪VN)}. 项目集的闭包:假设IS LR(0)项目集 IS是 项目集, 项目集的闭包:假设IS是LR(0)项目集,则 称下面CLOSURE(IS) IS的闭包集 CLOSURE(IS)为 的闭包集: 称下面CLOSURE(IS)为IS的闭包集: CLOSURE(IS)= IS ∪ {A→•π Y→β• η∈CLOSURE(IS) β•A {A→•π | Y→β•Aη∈CLOSURE(IS) A→π A→π是产生式 }
构造LR(0)活前缀状态机 构造LR(0)活前缀状态机LRSM的算法要点 活前缀状态机LRSM的算法要点
构造初始状态IS =CLOSURE({Z→•S}),并给IS 构造初始状态IS0:IS0=CLOSURE({Z→•S}),并给IS0标 NO。 上NO。 从已构造的LRSM 部分图选择被标为NO 的任一状态IS LRSM部分图选择被标为 NO的任一状态 IS, 从已构造的 LRSM 部分图选择被标为 NO 的任一状态 IS, 并做 对每个符号X 做下面动作: [1] 对每个符号X∈VT∪VN,做下面动作: 1) 令ISj = CLOSURE( IS(X))。 若在LRSM部分图中已有IS LRSM部分图中已有 2) 若在LRSM部分图中已有ISk与ISj有相同项目 则令m=k 否则构造IS 的状态点IS m=k; 集,则令m=k;否则构造ISj的状态点ISj, 并给IS 标上NO 同时令m=j NO, m=j。 并给ISj标上NO,同时令m=j。 x IS和 之间画有向X 3) 在IS和ISm之间画有向X边:IS ISm 。 [2] 给IS标上OK。 IS标上OK。 标上OK 重复上一步骤, 直至没有被标记为NO 的状态结点为止。 重复上一步骤, 直至没有被标记为NO的状态结点为止 。 NO 的状态结点为止
设文法开始符的产生式是: 设文法开始符的产生式是: →α S →α1|α2|…|αn | RPSG={α1,…,αn}∪{απ|αAβ∈RPSG,A→π∈P} ={α , απ| β∈RPS ,A→π∈P
例有文法G[S]: 例有文法 S → aAc [1] A → Abb [2] A → b [3] 可归前缀集: 可归前缀集: aAc aAbb ab
相关文档
最新文档