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

例1:文法:
SaAcBe
A b A Ab
B d 输入串abbcde#分析 最右推导:
SaAcBe aAcde aAbcde abbcde
规约分析过程如下:
5
步骤 1 2 3 4 5 6 7 8 9 10 11
符号栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
11
步骤 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11)
符号栈 输入符号串 # i+i*i# #i +i*i# #E +i*i# #E+ i*i# #E+i *i# #E+E *i# #E+E* i# #E+E*i # #E+E*E # #E+E # #E #
12
优先关系 #<i #<i>+ #<+ +<i +<i>* +<* *<i *<i># +<*># #<+>#
教学总结
算符优先关系表是指用表格形式来表示各终结 符号的优先关系的表。 为分析算符之间的优先关系,引入两个概念: firstVT集合和lastVT集合:对于非终结符B,有 firstVT (B)={b|Bb… 或 BCb…} lastVT(B)={a|B…a 或 B…aC} 为解决在算符优先分析过程中如何寻找句柄,引 进最左素短语的概念。 算符优先分析法只适用于对表达式的分析,其特 点是分析速度快。
对输入符号串自左向右进行扫描并将输入符自底向上分析方法的基本思想4逐个移入一个后进先出栈中边移入边分析一旦栈顶符号串形成某个句型的句柄时就用该产生式的左部非终结符代替相应右部的文法符号串称为归约
编译原理第5章-自底向上的语法分析

– 规范前缀:ABd, AB
(1) Z ABd (2) A a (3) B d (4) B c (5) B bB
• Z +rm AbBd
– 符号串AbBd的前缀:AbBd, AbB, Ab, A,
– 规范前缀:AbBd, AbB 规范前缀
或者终极符串
规范句型
Compiler Construction Principles & Implementation Techniques
短语(A +)
规范前缀
应用
简单短语(A ) 句柄(最左)
包含0 规范活前缀 或1个 最右包 可归约规范活前缀 含1个
自底向上 分析
Compiler Construction Principles & Implementation Techniques
5.1 自底向上语法分析概述
College of Computer Science & Technology
-2-
自顶向下语法分析方法回顾
College of Computer Science & Technology
自顶向下分析过程是从文法开始符出发,为所给输入串构造
最左推导的过程。
输入
句型
动作
P: (1) Z aBd
abcd
Z
推导(1)
(2) B d
abcd
aBd
匹配(a)
(3) B c (4) B bB
• 主要思想:
– 从输入串出发; – 尽可能地找到可归约子串并将其归约成一个非终极符; – 直到归约成文法的开始符或发现语法错误;
• 分析动作:移入(shift),归约(reduce) • 包含以下方法:
编译原理-清华大学-第5章-自底向上优先分析法(2+1)

第六章自底向上优先分析方法•教学要求:了解简单优先分折法,掌握算符优先分析法的关系表的构造以及分析过程。
•教学重点:算符优先表构造及算符优先分析法。
1自底向上分析法的基本思想•从输入串开始,朝着文法的开始符号进行最左归约,直到到达文法的开始符号为止。
•工作方式:“移进-归约”方式。
2分析程序模型1)初态时栈内仅有栈底符“#”,读头指针在最左单词符号上。
2)语法分析程序执行的动作:a)移进读入一个单词并压入栈内,读头后移;b)归约检查栈顶若干个符号能否进行归约,若能,就以产生式左部替代该符号串,同时输出产生式编号;c)识别成功移进-归约的结局是栈内只剩下栈底符号和文法开始符号,读头也指向语句的结束符;d)识别失败语法分析程序语法表a+b……#输出带#3例如:有文法如下(1)S→aAcBe(2)A→b(3)A→Ab(4)B→d问:语句abbcde是不是该文法的合法语句?4•例:设文法G(S):(1) S aAcBe(2) A b(3) A Ab(4) B d 试对abbcde进行“移进-归约”分析。
bbcde bbcde b cde de deabbcde eB cA a SB A a 5成功11接受2,3,4,1##S 10归约##aAcBe 9移进2,3,4e ##aAcB 8归约e ##aAc d 7移进de ##aAc 6移进2,3cde ##aA 5归约cde ##a Ab 4移进2bcde ##aA 3归约bcde ##a b 2移进bbcde ##a 1移进abbcde ##0动作输出带输入串栈步骤移进归约的分析过程G[S]:(1)S →aAcBe(2)A →b(3)A →Ab(4)B →d 6遇到的问题:(1)如何找出进行直接归约的简单短语?(2)找出的简单短语应直接归约到哪一个非终结符?关键:确定句柄.常用的分析方法:(1)优先分析法(2)LR分析法7b db ac eSA B A d b a c e S A B A d a c eSA B a c e A B S 没有语法树如何确定句柄?86.1 自底向上优先分析法概述•基本思想:利用文法符号中相邻符号之间的优先关系(谁先规约的优先关系)找出句柄。
编译原理自底向上优先分析法

其他领域中的应用实例
形式语言理论
自底向上优先分析法在形式语言理论中可用于研究语言的性质和结构,如文法分类、自动机理论等。
人工智能
自底向上优先分析法在人工智能领域中可用于知识表示、推理和问题求解等方面,如专家系统、智能 规划等。
06 总结与展望
总结
01
优先分析法是一种编译原理中的语法分析方法,它按照一 定的优先级规则,从左到右、从底向上地构建语法树。这 种方法在编译器设计中具有广泛的应用,能够有效地处理 表达式的语法和语义问题。
其他领域
除了编译器设计和自然语言处理领域,自底向上 优先分析法还可以应用于其他需要处理和分析语 法结构的领域。
03 自底向上优先分析法实现
构建抽象语法树(AST)
抽象语法树(AST)是源代码的抽象 语法结构的树状表现形式,树上的每 个节点都表示源代码中的一种结构。
在构建AST时,需要遵循源代码的语 法规则,将源代码中的各个元素(如 变量、操作符、语句等)按照其语法 关系组织成树状结构。
02
自底向上优先分析法是优先分析法的一种,它从输入的字 符串开始,逐步向上构建语法树,直到达到抽象语法树的 根节点。这种方法在处理复杂的表达式时具有较高的效率 和准确性。
03
优先分析法在编译原理中具有重要的地位,它不仅能够帮 助编译器正确地处理表达式的语法和语义问题,还能够提 高编译器的性能和可维护性。
语义分析
对AST进行语义检查,确保代码符合 语言的语义规则。
中间代码生成
将AST转换成中间代码,通常是三地 址码。 Nhomakorabea代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换成机器码,生成可 执行文件。
编译原理大题

五、语法分析——自底向上分析法已知文法G:EE+TE TTT*FTFF(E)Fi(1)求文法G中每个非终结符的First集和Follow集。
(2)构造文法G的SLR(1)预测分析表。
(20分)首先构造增广文法:SEEE+TE TTT*FTFF(E)FiFirst(S)=First(E)=First(T)=First(F)={(,I)Follow(S)={#} Follow(E)={+,#,}}Follow(T)={+,},#,*} Follow(F)={+,},#,*}状态Action Gotoi + * ( ) # E T F0 S5 S4 1 2 31 S6 Acc2 r 2 S7 r 2 r 23 r4 r 4 r 4 r44 S5 S4 8 2 35 r6 r 66 S5 9 37 S5 108 S6 S119 r 1 S7 r 1 r 110 r 3 r 3 r 3 r 311 r 5 r 5 r 5 r 5注:识别可归前缀的DFA共12项。
词法分析——确定性有穷自动机为以下字符集编写正规表达式,并构造与之等价的最简DFA(写出详细的具体过程):在字母表{a,b}上的包含偶数个a且含有任意数目b的所有字符串。
(15分)(b*ab*ab*)*b a b1a状态Action GOTOa b d e f $ S R T0 S3 11 acc2 r2 S3 r2 r2 53 S6 S4 24 r4 r4 r4 r45 S10 96 77 S88 r3 r3 r3 r39 r1 r1 r110 r6 S6 S4 r6 r6 1111 S1212 r5 r5 r5五、语法分析——自底向上分析法已知文法G:S’SS bRSTS bRRdSaR eTfRaTf(1)求文法G中每个非终结符的First集和Follow集。
(2)构造文法G的SLR(1)预测分析表。
(20分)frist(s’)={b} follow(s’)={$}frist(s)={b} follow(s)={f,a, $}frist(R) ={d,e} follow( R )={a,b,f, $}frist(T)={t} follow (T)={a,f,#}五、对下面的文法(15分)S->UTa|TbT->S|Sc|dU->US|e判断是否为LR(0),SLR(1),说明理由,并构造相应的分析表。
编译原理自底向上优先分析法

学习目标: • 掌握:构造算符优先关系表,进行算符
优先分析,构造优先函数 • 理解:算符优先文法,最左素短语 • 了解:简单优先分析法
2020/12/4
1 自底向上分析方法概述 2 自底向上优先分析方法概述 3 算符优先分析法
2020/12/4
1 自底向上分析方法概述
1. 基本思想 ➢ 从输入符号串开始,利用文法的产生式逐步进行
其中a∈VT, B,C∈VN ➢ 直观上说LASTVT(B)是由B推导出的最右终
结符(允许右边有一非终结符)的集合。 ➢例文法:
E→E+T|T T→T×F|F F→(E)|i
LASTVT(F)={),i} LASTVT(T)={×,),i} LASTVT(E)={+,×,),i}
2020/12/4
构造LASTVT(A)的算法与构造FIRSTVT(A)算 法相似 根据下面两条规则 a) 若产生式A→…a,或A→…aB,则 a∈LASTVT(A) b) 若有产生式A→…B,且a∈LASTVT(B),则 a∈LASTVT(A)
包含优先级和结合性的表达式文法是算符优先文法
E→E+T|T T→T×F|F F→(E)|i
2020/12/4
3.3 算符优先关系表的构造
1. 最左终结符集FIRSTVT ➢ FIRSTVT(B)={b|B=>+ b… 或 B=>+ Cb… }
其中b∈VT, B,C∈VN ➢ 直观上说FIRSTVT(B)是由B推导出的最左终结
自底向上分析的过程为:
abbcde|-aAbcde|-aAcde|-aAcBe|-S
2020/12/4
例 文法: (1) S→aAcBe (2) A→b
编译原理:第五章-语法分析——自下而上分析

• a、b代表任意终结符; • P、Q、R代表任意非终结符; • ‘…’代表由终结符和非终结符组成的任意序列,包括空字。
• 假定G是一个不含-产生式的算符文法。对于任 何一对终结符a、b,我们说: 1. a b 当且仅当文法G中含有形如P→…ab…
或P→…aQb…的产生式
2. a b 当且仅当G中含有形如P→…aR…的产
栈 输入 #S #
考虑文法G(E): E T | E+T T F | T*F F (E) | I
输入串为i1*i2+i3 ,分析步骤为:
步骤 符号栈
0
#
1
#i1
2
#F
3
#T
4
#T*
输入串 i1*i2+i3# *i2+i3# *i2+i3# *i2+i3# i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
(1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i
• 由第(4)条规则,有 ‘(’ ‘)’; • 由规则E→E+T和TT*F, 有 + *; • 由(2) T→T*F 和(3) F→P F ,可得* ↑; • 由(1)E→E+T和E E+T,可得+ +; • 由(3)F→PF和F PF,可得↑ ↑。 • 由(4)P→(E)和 EE+TT+TT*F+TF*F+T
编译原理
第五章 语法分析—自下而上分析
• 自下而上分析法(Bottom-up)
• 基本思想:
• 从输入串开始,逐步进行“归约”,直到文法的开始符 号。所谓归约,是指根据文法的产生式规则,把产 生式的右部替换成左部符号。
编译原理第三版 第五章 自下而上语法分析

a
b a
A a
b A A a a
c A a
d c A a
e B B c c A A a a
S
(2) 分析树: 用树表示“移进 - 归约 ”过程
A A B S
b
A
b
b
d
a
A
直接短语
T i F
句柄
T
T * F F ( E ) i
E + T T F
规范归约
设α是文法G的一个句子, 若序列αn, αn-1, …, α0,满足: (1)αn = α; (2) α0 = S; (3)对任 意i , 0< i ≤n , αi-1 是从αi 将句柄替换成 相应产生左部符号而得到的;则称该序列是一个 规范归约。
1、归约与分析树
(1)移进-归约法: 使用符号栈, 把输入符号逐一移 进栈, 栈顶出现某个产生式右部时归约为左部。
例 :给定文法 G: (1) S→aAcBe (2) A→b (3) A→Ab (4) B→d 输入串 abbcde是否为句子? 归约过程如下: 步骤: 1. 2. 进 进 动作: a b
例:文法G: G[E]: E→E+E|E*E |(E) |i (1) E→E+T│T (2) T→T*F│F (3) F→P↑F│P (4) P→(E)│i 算符优先关系为: 由(4): P→(E) ∴( =) 由(1) (2): E→E+T, T => T*F ∴+<* 由(2) (3): T→T*F, F => P↑F ∴ *<↑ 由(1): E→E+T, E => E+T ∴ +>+ 由(3): F→P↑F, F=> P↑F ∴ ↑ <↑ 由(4): P→(E), E => E+T ∴ ( < +, +>) ... ∴ G为算符优先文法(优先关系表如表5.1所示,P90) #看作终结符号
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文法优先关系的确定
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 ⊳ # ∈ , , 优先关系矩阵 一个文法的全部优先关系可以用矩阵 来表示,称作优先关系矩阵。 来表示,称作优先关系矩阵。
第五章 自底向上分析方法
主要内容 自底向上分析的基本思想 简单优先分析方法 LR类分析方法 LR类分析方法
自底向上语法分析方法介绍
从待分析的符号串开始, 从待分析的符号串开始,自左向右进 行扫描,自下而上进行分析, 行扫描,自下而上进行分析,通过反复查找当前句 型的句柄, 型的句柄,并使用产生式规则将找到的句柄归约为 相应产生式的左部非终极符, 相应产生式的左部非终极符,直到将输入串归约为 文法的开始符。(移入-归约分析) 文法的开始符。 移入-归约分析)
设文法开始符的产生式是: 设文法开始符的产生式是: →α 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
活前缀的描述性定义: 活前缀的描述性定义:形成可归前缀之 前,包括可归前缀在内所有规范句型的 前缀都称为活前缀。 前缀都称为活前缀。 为一个或若干规范句型的前缀。 活前缀 为一个或若干规范句型的前缀。 在规范归约过程中的任何时刻已分析过 的部分,即在分析栈(符号栈) 的部分,即在分析栈(符号栈)中的符 号串均为规范句型的活前缀,表明输入 号串均为规范句型的活前缀, 串的已被分析过的部分是该文法某规范 句型的一个正确部分。 句型的一个正确部分。
逆过程: 符号栈,输入流) 逆过程:(符号栈,输入流)
( -, 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,-
例: 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类分析方法 简单优先和LR类分析方法 LR
例:S → aAcBe [1] A→b [2] A → Ab [3] B→d [4] 输入流: 输入流:abbcde。 。 规范推导过程为: 规范推导过程为: S ⇒ aAcBe[1] ⇒ aAcd aAcd[4]e[1]
⇒ 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,至多成立一种 优先关系; 优先关系; 任意两个产生式都具有不同的右部。 • 任意两个产生式都具有不同的右部。
简单优先分析算法要点
找第一个使S 找第一个使 j⊳Sj+1的Sj 从Sj开始往前(左)找第一个使 i-1⊲Si的Si 开始往前 左 找第一个使S 找第一个使 去查产生式的右部, 用SiSi+1…Sj去查产生式的右部,并用相应 的左部符号代替句柄S 归约) 的左部符号代替句柄 iSi+1…Sj (归约 。 归约 重复上述过程,直至输入符结束。 重复上述过程,直至输入符结束。如果归 约出文法的开始符号则成功。否则失败。 约出文法的开始符号则成功。否则失败。
例:构造LR(0)状态机 构造 状态机 S→E$ E→E+T E→T T → id T→ ( E ) →
0
S→• E $ • E→• E+T • E→• T • T→• id • T→• ( E9
T
6
E→T •
5
T→id •
id (
T→(• E) • E→• E+T • E→• T • T→• id • T→• ( E ) •
简单优先分析实例
符号栈 # #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类分析方法
•规范句型:用最右推导导出的句型 也称右句 规范句型:用最右推导导出的句型(也称右句
构造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 的状态结点为止
形如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)移入/归约后的转向状态信息
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→π是产生式 }