编译原理-清华大学-第5章-自底向上优先分析法(2+1)
编译原理自底向上优先分析法
其他领域中的应用实例
形式语言理论
自底向上优先分析法在形式语言理论中可用于研究语言的性质和结构,如文法分类、自动机理论等。
人工智能
自底向上优先分析法在人工智能领域中可用于知识表示、推理和问题求解等方面,如专家系统、智能 规划等。
06 总结与展望
总结
01
优先分析法是一种编译原理中的语法分析方法,它按照一 定的优先级规则,从左到右、从底向上地构建语法树。这 种方法在编译器设计中具有广泛的应用,能够有效地处理 表达式的语法和语义问题。
其他领域
除了编译器设计和自然语言处理领域,自底向上 优先分析法还可以应用于其他需要处理和分析语 法结构的领域。
03 自底向上优先分析法实现
构建抽象语法树(AST)
抽象语法树(AST)是源代码的抽象 语法结构的树状表现形式,树上的每 个节点都表示源代码中的一种结构。
在构建AST时,需要遵循源代码的语 法规则,将源代码中的各个元素(如 变量、操作符、语句等)按照其语法 关系组织成树状结构。
02
自底向上优先分析法是优先分析法的一种,它从输入的字 符串开始,逐步向上构建语法树,直到达到抽象语法树的 根节点。这种方法在处理复杂的表达式时具有较高的效率 和准确性。
03
优先分析法在编译原理中具有重要的地位,它不仅能够帮 助编译器正确地处理表达式的语法和语义问题,还能够提 高编译器的性能和可维护性。
语义分析
对AST进行语义检查,确保代码符合 语言的语义规则。
中间代码生成
将AST转换成中间代码,通常是三地 址码。 Nhomakorabea代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换成机器码,生成可 执行文件。
编译原理自底向上优先分析法
学习目标: • 掌握:构造算符优先关系表,进行算符
优先分析,构造优先函数 • 理解:算符优先文法,最左素短语 • 了解:简单优先分析法
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
编译原理第5章 LL(1)文法及其分析程序
}
else error( )
}
}
27
5.2 预测分析程序(Predictive
parser)无回溯的自顶向下分析程序
特征——根据下一个(几个)输入符号为当前要处理 的非终结符选择产生式
要求——文法是LL(1)的 第一个L 从左到右扫描输入串 第二个L 生成的是最左推导 1 向前看一个输入符号(lookahead)
第5章 LL(1)文法及其分析程序
5.1 自上而下的语法分析 5.2 预测分析程序
递归下降子程序 表驱动的预测分析程序 5.3 LL(1)分析程序的生成
LL(1)文法 FIRST和FOLLOW集 定义和计算 5.4 非LL(1)文法的改造
1
5.1自上而下的语法分析
1语法分析概念 2自上而下的语法分析的一般过程 3自上而下的语法分析面临的问题
到分析结束。
5
分析算法分类
分析算法可分为:
自上而下分析法:
从文法的开始符号出发,寻找与输入符号 串匹配的推导,或者说,为输入串寻找一 个最左推导。
自下而上分析法:
从输入符号串开始,逐步进行归约,直至 归约到文法的开始符号。
6
两种方法反映了语法树的两种构 造过程。
自上而下方法是从文法符号开始,将它做为语法
SaASaSbASaabASaabbaSaabbaa
SaASaSbASaSbAaaabAaaabbaa
4
语法分析
在语言的编译实现中,把句子分析的过程称
为语法分析,即完成这个任务的程序称为 语法分析程序或称为识别程序。分析算法 又称识别算法。 从左到右的分析算法,即总是从左到右地识 别输入符号串,首先识别符号串中的最左 符号,进而依次识别右边的一个符号,直
编译原理:第五章-语法分析——自下而上分析
• 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)
• 基本思想:
• 从输入串开始,逐步进行“归约”,直到文法的开始符 号。所谓归约,是指根据文法的产生式规则,把产 生式的右部替换成左部符号。
《编译原理》教学大纲
《编译原理》教学大纲大纲说明课程代码: 3225003总学时: 64 学时(讲课 48 学时,实验16 学时)总学分: 4课程类别:学科基础课适用专业 : 计算机科学与技术(专业)预修要求: C 语言程序设计、 C++ 程序设计、数据结构课程的性质、任务及地位:《编译原理》是计算机科学与技术专业的一门重要基础课。
通过对该课程的学习,使学生掌握编译过程中的相关原理和编译技术,让学生能初步进行编译程序的开发和维护,同时促进提高学生开发软件的能力。
教学目的与基本要求:本课程的目的,通过向学生讲述编译系统的结构、工作流程及编译程序各部分的设计原理和实现技术,使学生既掌握编译技术理论的基础与基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。
本课程理论性较强。
因授课对象为工科学生,所以在强调编译系统的构造原理和实现方法的同时,为培养学生的实际工作能力,通过上机实践进一步加深学生对课堂教学内容的理解。
目的是要使学生牢固掌握相关的基本理论和基本方法,并能初步利用上述理论和方法解决简单实际问题。
教学方法和教学手段的建议:在教学方法上,贯彻理论联系实际、“精讲、多练”的原则,进行案例式、启发式的教学,对于一些实际性较强的问题要多采用课堂讨论等方式,以提高学生的思辨能力和学习的主动性;引导学生读书、理解、体悟、运用相结合;提高学生的学习兴趣与热情,培养与发挥学生的提出、分析及解决问题的能力。
教学手段:运用多媒体教学手段 +黑板 +上机实验的手段。
采取课堂讲授、课堂讨论、课后练习与自学等形式。
大纲的使用说明:大纲对课程性质、目的等作简单说明,同时列出各章节要学习的知识点、重点、难点,便于教学时教授重点的安排和学生自学安排。
大纲正文第一章引论学时: 4 学时(讲课 4 学时,实验 0 学时)了解编译的概念;理解编译程序的各组成部分及功能。
本章讲授要点:介绍程序设计语言与编译程序间的关系,主要内容包括:各级程序设计语言的定义、源程序的执行、编译程序的构造、编译程序的分类、形式语言理论与编译实现技术的联系。
编译原理_第5章(清华大学)
学习目标: ➢掌握:LL(1)文法的判别,预测分析
法,递归子程序的构造方法 ➢理解:LL(1)文法 ➢了解:不确定的自顶向下分析
语法分析的作用是识别由词法分析给出的单词序 列是否是给定文法的正确句子
分类:
语法分析
自顶向下分析 自底向上分析
确定的
不确定的 算法优先分析(第六章)
进行推导,类似地LL(k)文法需要向前看K个符号才 可以确定选用哪个产生式。
例 有文法G[S]为:
S→aAS
SELECT(S→aAS)= {a}
S→b
SELECT(S→b)= {b}
A→bA
SELECT(A→bA)= {b}
A→ε
SELECT(A→ε)=Follow(A)= {a,b}
Hale Waihona Puke 由于SELECT(A→bA)∩SELECT(A→ε)={b}≠Φ,
此外若可能导出空串,A自动获得匹配,输入符a 有可能与A后的一个符号匹配,所以当a应属于 Follow(A)时,选择产生式A→也是可以的。
直观上说某产生式A→α的选择集合是指遇到哪些输 入符号(包括#)时选用该产生式向下推导。
例 G3[S]: 若α≠>*ε,则SELECT(A→α)=FIRST(α) S→aA 若α=>*ε, 则SELECT(A→α)
例文法G2[S]: S→Ap FIRST(Ap)={a,c}
S→Bq FIRST(Bq)={b,d}
A→a
FIRST(a)={a }
A→cA FIRST(cA)={c}
B→b
FIRST(b)={b}
B→dB FIRST(dB)={d}
由于同一非终结符的两个产生式的右部推导出来的 开始符号集不相交,因此可根据当前输入符属于哪 个产生式右部的开始符号集而决定选哪个产生式进 行推导,可以进行确定的自顶向下分析
编译原理讲义(第五章语法分析--自底向上分析技术)
优先关系
• 和书上的写法不一样,凑合用。 SiSj Si Sj Si Sj • 注意: , , 之间不同于=,>和<。 由Si Sj不能导出Sj Si。
优先关系的例子
• 文法:Z::=bMb M::=(L|a L::=Ma) • 语言:{bab, b(aa)b, b((aa)a)b, …} • 可以从语法树里面导出部分优先关系。
关系闭包和Warshall算法
• Warshall算法是利用矩阵计算关系传递闭包的方法。计 算B的传递闭包的算法伪代码如下: 对于外层循环,当 A = B; i=K的循环结束的时 for (i = 1; i<=n; i++) 候,满足:如果Si和 for (j=1; j<=n; j++) Sj满足Si R Si1, Si1 R { Si2, … Sin R Sj, 并 if (A[j,i]==1) 且im<K, 那么现在 for(k=1; k<=n; k++) A[i,j] = 1; A[j,k] = A[j,k]+A[i,k] }
基本方法(续)
• 归约中的动作有4类
– 移入:读入一个符号并把它归约入栈。 – 归约:当栈中的部分形成一个句柄(栈顶的 符号序列)时,对句柄进行归约。 – 接受:当栈中的符号仅有#和识别符号的时 候,输入符号也到达结尾的时候,执行接受 动作。 – 当识别程序觉察出错误的时候,表明输入符 号串不是句子。进行错误处理。
计算优先关系的例子P136
• 文法:S::=Wa W::=Wb W::=a • 将文法中的符号按照S,W,a,b排列。
0100 BHEAD= 0110 0000 0000
0010 0011 0000 0000
编译原理-05自底向上的语法分析方法
算符优先关系的定义
教学课时:2 教学方法:多媒体教学 教学内容和步骤 :(如下)
3
自底向上分析方法的基本思想
自底向上分析方法,也称移进归约分析法
实现思想(是推导的逆过程):
对输入符号串自左向右进行扫描,并将输入符 逐个移入一个后进先出栈中,边移入边分析, 一旦栈顶符号串形成某个句型的句柄时,就用 该产生式的左部非终结符代替相应右部的文法 符号串,称为归约。重复这一过程,直到归约 到栈中只剩下文法的开始符号时,则分析成功。
11
步骤
1) 2) 3) 4)
5) 6)
7)
8) 9) 10) 11)
符号栈
# #i #E #E+ #E+i #E+E #E+E* #E+E*i #E+E*E #E+E #E
输入符号串
i+i*i# +i*i# +i*i# i*i#
*i# *i#
i# # # # #
优先关系
#<i #<i>+ #<+ +<i +<i>* +<* *<i *<i># +<*># #<+>#
9
6.3 算符优先分析法
• 算符优先优先分析法 只规定算符(终结符)之间的优先关系。在 归约过程中只要找到句柄就归约,不必考虑 归约到哪个非终结符,因此不是规范归约。 特点:速度快,特别适合于表达式的分析
• 通过算符之间的优先关系来确定句柄
10
先看一个例题: 例. 已知文法G[E]:
E→E+E E→ E*E E→ i 输入串i+i*i ,归约过程如下
编译原理自底向上优先分析课件
CHAPTER 02
自底向上优先分析基础
文法和语言
定义
文法是描述语言的语法结构的形式化工具,由一组产生式构成。语言是文法产生的所有句 子的集合。
上下文无关文法
在编译原理中,常用上下文无关文法来描述程序设计语言的语法结构。这种文法的产生式 形式为A→β,其中A是非终结符,β是终结符和非终结符组成的字符串。
随着量子计算的快速发展, 如何设计适用于量子计算环 境的编译器成为一项迫切需 求。自底向上的优先分析方 法有望在量子计算环境下的 编译器设计中发挥重要作用。
跨平台和跨语言 支持
为了满足不同平台和语言的 需求,未来研究可以关注如 何使自底向上优先分析方法 更好地支持跨平台和跨语言 编译。
THANKS
CHAPTER 04
LALR分析算法
LALR分析表的构建
01
02
03
步骤一
步骤二
步骤三
构造文法的LR(1)分析表。LALR分析 算法首先会为给定的上下文无关文法 构造LR(1)分析表。该分析表包含了所 有可能的状态和对应的动作(移进、 规约或接受)。
合并同心集。在LR(1)分析表的基础上, LALR分析算法会识别并合并所谓的“ 同心集”(即具有相同闭包和goto函 数的项集)。这一步骤有效地减少了 状态的数量,从而使得分析表更小、 更简洁。
结构。该表根据当前分析状态和输入符号,指导归约操作的进行,提高
了分析效率。
本课件的内容和结构
主要内容
本课件将详细介绍自底向上优先分析方法的基本原理、归约过程、分析表的使用 以及相关的优化技术。通过实例和案例,展示这种方法在编译器设计中的应用。
结构安排
首先介绍编译原理概述和自底向上优先分析方法的基本原理,然后深入讲解归约 过程和分析表的使用,最后探讨相关的优化技术和应用案例。课件将结合理论和 实践,使读者更好地理解和掌握自底向上优先分析方法。
编译原理 第5章
例:有文法G(S):
S→bAb A→( B | a B→Aa ) 解:文法符号优先关系推导如下: (1) 求=· 关系: 由S→bAb , A→( B, B→Aa ) b =· A, A =· b, (=· B , A =· a, a =· )
自底向上的语法分析
• 核心问题
– 寻找可归约串。对“可归约串”概念的不同定义, 就形成了不同的自底向上的分析方法。在算符优 先分析法中我们用“最左素短语”来刻画“可归 约串”,在“规范归约”中,则用“句柄”来刻 画“可归约串”
分析方法
• 输入串:
abbcde
S → a A c B e A → A b|b B → d
S
b
>·
=· <·
>·
A
(
=·
<· <· =·
=·
<·
B
a
>·
>·
>·
>· =· =·
)
#
寻找句柄
>·
<· <·
>·
简单优先文法的定义: (1)在文法符号集中,任意两个符号之间最多只有 一种优先关系; (2)在文法中任意两个产生式没有相同的右部。
语法树结构如下:
S S S b S b
b
A b
B
b
U S0…Sj-1SjSj+1Sj+2… …Si-1SiSi+1…Sn
算符优先分析
• 我们要通过两个相邻符号SiSi+1之间的关系来找到句 柄: – SiSi+1在句柄内:必然有规则U …SiSi+1… – Si在句柄内部,但是Si+1在句柄之后:必然有规则 U …Si,且存在规范句型…USi+1…。 – 如果Si+1在句柄内,而Si在句柄外,那么必然存在 规范句型…SiU…,且U Si+1…。
编译原理作业集-第五章-修订
第五章语法分析—自下而上分析本章要点1. 自下而上语法分析法的基本概念:2. 算符优先分析法;3. LR分析法分析过程;4. 语法分析器自动产生工具Y ACC;5. LR分析过程中的出错处理。
本章目标掌握和理解自下而上分析的基本问题、算符优先分析、LR分析法及语法分析器的自动产生工具YACC等内容。
本章重点1.自下而上语法分析的基本概念:归约、句柄、最左素短语;2.算符优先分析方法:FirstVT, LastVT集的计算,算符优先表的构造,工作原理;3.LR分析器:(1)LR(0)项目集族,LR(1)项目集簇;(2)LR(0)、SLR、LR(1)和LALR(1)分析表的构造;(3)LR分析的基本原理,分析过程;4.LR方法如何用于二义文法;本章难点1. 句柄的概念;2. 算符优先分析法;3. LR分析器基本;作业题一、单项选择题:1. LR语法分析栈中存放的状态是识别________的DFA状态。
a. 前缀;b. 可归前缀;c. 项目;d. 句柄;2. 算符优先分析法每次都是对________进行归约:(a)句柄(b)最左素短语(c)素短语(d)简单短语3. 有文法G=({S},{a},{S→SaS,S→ε},S),该文法是________。
a. LL(1)文法;b.二义性文法;c.算符优先文法;d.SLR(1)文法;4. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LL(1)分析法属于自顶向下分析;a. 深度分析法b. 宽度优先分析法c. 算符优先分析法d. 递归下降子程序分析法5. 自底向上语法分析采用分析法,常用的是自底向上语法分析有算符优先分析法和LR分析法。
a. 递归b. 回溯c. 枚举d. 移进-归约6. 一个LR(k)文法,无论k取多大,。
a. 都是无二义性的;b. 都是二义性的;c. 一部分是二义性的;d. 无法判定二义性;7. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LR分析法属于自底向上分析。
编译原理 第五章自底向上优先分析法
第五章自底向上优先分析法自底向上优先分析法,其基本思想是采用自左向右扫描,向下而上分析。
该类分析方法是从输入符号串开始,查找句柄,并使用规则把它归约成相应的非终结符号。
任何自底向上分析的关键,就是要找出这种句柄。
本章首先介绍自底向上分析一般过程,然后介绍算符优先分析法。
本章重点:句柄、算符优先分析法第一节自底向上分析一般过程。
先举例说明例1有一文法G[S]S→aAcBeA→bA→AbB→d对输入串abbcde#进行分析,检查该符号串是否是G[S]的句子。
它的最右推导是:S⇒aAcBe⇒aAcde⇒aAbcde⇒abbcde 由此我们可以构造它的逆过程即归约过程。
先设一个先进后出符号栈,并且把句子左括号“#”号放入栈底,其分析过程如下所示上述归约过程,是从输入符号串开始,自底向上地通过归约当前句型的句柄来建立语法树的。
我们不难画出上述分析过程的语法树,下图。
在图中,我们仅画出与生成语法树有关的几步。
从所建立的语法树,可以清楚看出,上述每一步确实都是归约当前句型的句柄。
且句柄出现在符号栈栈顶,不会在栈中间,其实上述分析过程并未真正解决句柄的识别问题。
例如,对于上面的例子,分析进行到第(5)步,当时栈内符号串为aAb。
根据该符号串,我们有规则A→Ab。
和规则A→b。
那么,符号串Ab和b都是某条规则的右部,故都有可能被判别是句型的句柄。
假如我们选择b作为句柄,并把b归约为A,那么,最终就达不到归约到S的目的。
因而,我们也就无从得知输入串abbcde是一个句子了。
在自底向上分析中,如何寻找确定一个句型的句柄是构造一个自左向右扫描,自底向上分析方法必须要解决的一个问题。
第二节算符优先分析法众所周知,作算术式的四则运算时,为了保证计算过程和结果的唯一性,必须要规定一个统一四则运算法则。
这种法则的主要方面,就是规定运算之间的优先顺序。
现在人们所遵循的统一法则是:乘除运算优先于加减运算,故在算术中要先作乘除运算后作加减运算;同优先级的运算符是先左后右(即左结合),先作左边的运算符的运算,后作右边运算符的运算。
编译原理自底向上的语法分析
规范前缀
或者终极符串
规范句型
一些相关概念
规范活前缀:满足如下条件之一的规范前缀称为规范 活前缀:
该规范前缀不包含简单短语;
该规范前缀只包含一个简单短语,而且是在该规范前缀的最 后(这个简单短语就是句柄);
Z ABb 规范活前缀:
规范前缀为 AB, ABb AB(不包含简单短语) , ABb(包含一个简单短语且在最后)
自顶向下语法分析回顾 自底向上语法分析的例子 自底向上语法分析的主要思想 自底向上语法分析的关键问题 一些相关概念
自顶向下分析例
自顶向下分析过程是从文法开始符出发,为所给输入串构造
最左推导的过程。
输入
句型
动作
P: (1) Z aBeA (2) A Bc (3) B d (4) B bB (5) B
移入型规范活前缀
归约:规范活前缀只包含一个简单短语,而且是在该规范
活前缀的最后;
可归约规范活前缀 :归约规范活前缀
Z ABb
规范前缀为 AB, ABb
规范活前缀: AB(不包含简单短语) --- 移入型规范活前缀
ABb(包含一个简单短语) --- 归约规范活前缀
自底向上分析知识关系图
推导(*)
句型(S *)
( E) E +T
每棵简单子树(只有一层的子树)的叶子节 点构成简单短语:T、E+T、i
最左简单子树的叶子节点构成句柄: T
一些相关概念
自顶向下的语法分析方法中曾介绍过: 推导:对句型中的非终极符用产生式右部替换
推导的逆过程称为归约
规范推导:一个句型的最右推导称为该句型的 规范推导; 规范推导的逆过程称为规范归约(最左归约)
分析动作:移入(shift),归约(reduce) 包含以下方法:
第5章自底向上优先分析技术
自顶向下分析法是从文法的识别符开始,试图推导出输入符号串;自底向上分析方法与自顶向下的分析方法完全相反,它从输入符号串出发,试图归约到文法的识别符。本章要点: 自底向上分析法的基本原理 简单优先分析技术 算符优先分析法 优先函数
自底向上分析方法
从语法分析的角度考虑,自底向上的语法分析过程就是以输入符号串为语法树的末端结点符号串,试图向着根结点方向向上构造语法树,使识别符号正是语法树的根结点。 基本思想:从输入串开始,朝着文法的开始符号进行最左归约,直到到达文法的开始符号为止。主要是进行移进或归约操作,采用最左归约。 注意:输入串在这里是指从词法分析器送来的单词符号组成的二元式的有限序列。
‘#’用来表示句子括号‘#’的优先性<所有的符号,所有的符号 >’#’
例:设文法 S(R)|a|∧ RT TS,T|S 根据定义写出各个文法符号之间的优先关系?
S
(
R
)
a
∧
T
,
#
S
>
=
>
(
<
<
=
<
<
<
R
=
)
>
>
>
a
>
>
>
∧
>
>
>
T
>
=
,
<
<
<
<
=
#
<
=
简单优先文法定义
例 设文法 S(R)|a|∧ RT TS,T|S 运用简单优先分析算法对终结符号串=((a),a)进行检查是否是文法定义的句子?
编译原理 语法分析—自底向上分析技术
是算符优先文法。 + * ( + > < < * > > < ( < < < ) > > i > >
) i > < > < ═ < > >
5.2.4 算符优先文法句型的识别
1.质短语 质短语:句型中至少包含一个终结符号,且除它自 身外不再包含其他质短语的短语。 如文法 G[E]:E::=E+T|T T::=T*F|F F::=(E)|i 的句型E+T*F*i+i中的T*F和 i 是质短语。如何人工寻找 句型中的质短语?先找出一切短语,再从最短的找起。
1 2 3 4 5 6 7 8
i+(i+i)*i F+(i+i)*i F+(F+i)*i F+(F+F)*i F+(E)*i F+F*i F+F*F F+T
#< i >+ #< + < ( < i > + #< + < ( <+< i >) #< + < ( <+> ) #< + < ( = ) > * #< + <* < i > # #< + <* ># #< + >#
E+T*F*i+i中的短语和质短语? 句型分析中自动寻找质短语的思路: 先从左向右寻找质短语的尾终结符号, 再从右向左寻找质短语的头终结符号,
即,先找优先关系
(?) 再找优先关系
(?)
2.句型的识别 关于文法G[E],对输入符号串i+(i+i)*i句型分析
步骤 句 型 关 系 最左质短语 归约到符号
按自底向上分析技术,句型分析的过程是一个不断 从语法分析树中剪去分支的过程。
编译原理系列之五自底向上优先分析(1)-简单优先分析法
编译原理系列之五⾃底向上优先分析(1)-简单优先分析法简单优先分析法1.基本概念通过语法树来理解这三个概念更加简单:⽂法G1[S]:S→ABA→bBA→AaB→aB→Sb语法树1. 短语:若S=*=>αAδ且A=+=>β,则称β是相对于⾮终结符A的句型αβδ的短语。
即:语法树中以⾮终结符的作为根的⼦树的叶⼦所组成的字符串。
如:ba是相对于⾮终结符A的句型AB的短语。
句型baSb的短语有ba,a,Sb,baSb。
2. 直接短语:若S=*=>αAδ且A=>β,则称β是相对于⾮终结符A的句型αβδ的直接短语。
即:语法树中以⾮终结符的作为根的⼦树,它的孩⼦都是叶⼦,没有其他⼦树。
如:Sb是相对于⾮终结符B的句型AB的短语。
句型baSb的短语有a,Sb。
3. 句柄:位于句型最左边的直接短语称为该句型的句柄。
即:位于语法树中最左边的直接短语。
如:句型baSb的句柄是a。
2.优先关系定义1. X和Y优先级相等,表⽰为X=·Y,当且仅当G中存在产⽣式规则A=>···XY···。
解读:X、Y的优先级相同,当XY存在⼀个句柄之中,它们将同时被归约。
表现在语法树中S=·b。
优先级相等在语法树中1. X优先级⼩于Y,表⽰为X<·Y,当且仅当G中存在产⽣式规则A=>···XB···,B=+=>Y···。
解读:X优先级⼩于Y,当XY存在⼀个句型中时,它们将不可能出现在同⼀个句柄中,Y⼀定⽐X先被规约。
表现在语法树中b<·a。
优先级⼩于语法树中1. X优先级⼤于Y,表⽰为X>·Y,当且仅当G中存在产⽣式规则A=>··BD···,B=+=>···X,D=*=>Y···。
编译原理第五章语法分析——自下而上分析
第五章语法分析——自下而上分析要紧内容:[1]自下而上分析的大体问题[2]算符优先分析法[3]算符优先分析表和优先函数的构造[4]LR分析器的大体原理大体要求:[1]明白得自下而上分析法的大体思想[2]明白得有关归约、短语、句柄、标准归约等概念[3]把握算符优先分析法[4]了解算符优先表和优先函数的构造技术[5]了解LR 分析器大体原理和工作方式教学要点:本章介绍自下而上语法分析方式。
所谓自下而上分析法确实是从输入串开始,慢慢进行“归约”,直至归约到文法的开始符号;或说,从语法树的结尾开始,步步向上“归约”,直到根结。
讲义摘要:5.1 自下而上分析大体问题自下而上分析法的大体思想:从输入串开始,慢慢进行“归约”,直到文法的开始符号。
即从树结尾开始,构造语法树。
所谓归约,是指依照文法的产生式规那么,把产生式的右部替换成左部符号。
自上而下分析的核心问题是:如何判定符号串的可归约性,和如何归约。
即,识别可归约串的问题。
归约自下而上分析法事实上确实是一种“移进-归约”法,即,采纳“移进-归约”思想进行。
实现思想是:对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时,(该句型对应某产生式的右部,即栈顶生成了某产生式的右部的文法符号串),就将栈顶的这一部份替换成 (归约为) 该产生式的左部符号,这称为归约。
重复这一进程直到归约到栈中只剩文法的开始符号时那么为分析成功,也就确认输入串是文法的句子。
现举例说明。
例1:设文法G[S]为:(1) S→aAcBe(2) A→b(3) A→Ab(4) B→d试对abbcde进行“移进-归约”分析。
步骤: 1 2 3 4 5 6 7 8 9 10解:动作: 进a 进b 归(2) 进b 归(3) 进c 进d 归(4) 进e 归(1)表1符合栈的转变进程自下而上语法分析的进程也可看成自底向上构造语法树的进程,每步归约都是构造一棵子树,最后当输入串终止时恰好构造出整个语法树,如图1所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章自底向上优先分析方法•教学要求:了解简单优先分折法,掌握算符优先分析法的关系表的构造以及分析过程。
•教学重点:算符优先表构造及算符优先分析法。
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 自底向上优先分析法概述•基本思想:利用文法符号中相邻符号之间的优先关系(谁先规约的优先关系)找出句柄。
•分类:1、简单优先分析:对一个文法按一定原则求出所有符号即终结符号和非终结符号之间的优先关系,按照这种关系确定归约过程中的句柄.特点:准确、规范,但分析效率底,使用价值不大.2、算符优先分析:只规定算符(终结符号)之间的优先关系,不考虑非终结符号之间的优先关系,只要找到句柄就归约,不考虑归约到那个非终结符号。
特点:不是规范归约,分析速度快,特别适合于表达式的分析.96.2 简单优先分析法•基本思想:按照文法符号(终结符号和非终结符号)的优先关系(谁先规约)确定句柄(1)相等关系XY :当且仅当G 中存在规则A→…XY…(2)小于关系X Y :当且仅当G 中存在规则A→…XB…,且B Y…=+>(3)大于关系X Y :当且仅当G 中存在规则A→…BD…,且B …X 和D Y…>·=+>=*>10•优先关系的形式定义:注意:优先关系是有位置属性的例:构造文法G[S]的简单优先关系表G[S]:S→bAb ,A→(B|a ,B→Aa )11(1)求关系:b A , A b , ( B , A a , a )(2)求关系:观察每个非终结符和它左边的符号由S→bAb,且A (B , A a , 得b ( , b a 由A→(B , 且B A…,B (B… , B a…得( A , ( ( , ( a =+>=+>=+>=+>=+>(3)求关系:观察每个非终结符和它右边的符号由S→bAb, 且A a, A (B , A …)得a b , B b , ) b 由B→Aa) , 且A a, A (B , A …) 得a a , B a , ) a >·=+>=+>=+>=+>=+>=+>>·>·>·>·>·>·简单优先文法的定义:(1)在文法符号集V中,任意两个符号之间最多只有一种优先关系成立。
(2)在文法中任意两个产生式没有相同的右部。
第一条必须满足是显然的,第二条若不满足则会出现规约不唯一13简单优先分析法算法根据给定的简单优先文法构造出相应的简单优先关系表,设置分析栈S ,再根据如下算符步骤进行分析:(1)将输入符号串a 1a 2…a n #依次逐个存入分析栈S 中,直到遇到栈顶符号a i 的优先性下一个待输入符号a j 时为止。
(2)栈顶当前符号ai 为句柄尾,由此向左在栈中找句柄的头符号a k ,即找到a k-1a k ,为止。
(3)由句柄ak …a i 在文法的产生式中查找右部为a k …a i 的产生式,若找到则用相应左部代替句柄,若找不到则为出错。
(4)重复上述三个步骤直到规约完输入符号串,栈中只剩文法的开始符号或出错为止。
>·14S ## S 移进## bAb Ab ## bA Bb ## b (B 移进b ## b(Aa)移进)b ## b(Aa Aa)b ## b(A a)b ## b(a 规约符输入串关系分析栈接受#b(aa)b #移进# b (aa)b #移进# b(aa)b #移进例:根据下面文法分析输入串b(aa)b # 是否是句子G[S]:S→bAb ,A→(B | a ,B→Aa )156.3 算符优先分析法一、基本思想1、自下而上归约2、规定算符(更一般地说,指终结符)的优先级及结合规则,以使得分析过程唯一3、比较相邻两个算符而决定动作注:1)关键是对所有算符定义某种优先关系(实际上是谁先规约的关系)2)算符优先分析法是仿效四则运算的计算过程而构造的一种语法分析方法16例:E E+E|E-E|E*E|E/E|(E)|ii+i-i*(i+i)归约过程如下:i+i-i*(i+i) 算量i级别最高,最先归约;E+i-i*(i+i)E+E-i*(i+i) +,-同级,先归约左边“+”E-i*(i+i)E-E*(i+i) -,*不同级,先归约右边“*”E-E*(E+i) 先括号内,后括号外E-E*(E+E) 归约括号内E-E*(E) 归约括号对E-E*E 先归约“*”E-E 后归约“-”E 结束(接受)17一、算符文法的定义1、给定上下文无关文法G,若G中所有产生式右部都不包含两个相继的非终结符,则G为算符文法。
注:算符文法保证了两个运算符之间最多只有一个操作数。
或者说两个操作数之间必有算符(终结符)隔开182)a b 当且仅当G 中含有形如P …aR …的产生式,其中Rb …, 或R Qb …;2、算符优先文法定义设G 是一个不包含ε产生式的算符文法,并设a ,b V T ; P ,Q ,R V N ,定义关系:1)a b 当且仅当G 中含有形如P …ab…产生式,或者P …aQb…产生式;若G 中任一终结符对(a,b )之间至多满足上述关系之一,则称G 为算符优先文法。
=+>=+>3)a b 当且仅当G 中有形如P …Rb …产生式,其中R …a ,或R …aQ.=+>=+>>·19•用语法树来理解更直观a b…a B … b …A P… B b…A P …aa b a b …a b…A为非终结符或ε20注意E E * EE + E E * E EE + E+*•表达式文法:E E+E|E*E| (E)|i 是算符文法,但不是算符优先文法。
•两个算符之间的优先关系是有序的,允许有• a b, b a 同时存在,而不允许有a b ,• a b,a b 三种情况之两种同时存在。
+ *>·>·>·211、各非终结符P 的首算符集和尾算符集定义:三、算符优先文法及优先表的构造FIRSTVT P a P a P Qa a V Q V TN(){|,,}或而},,|{)(N T V Q V a aQ P a P a P LASTVT而或 222、构造首算符集和尾算符集算法1)构造集合FIRSTVT(P)的算法根据FIRSTVT(P)的定义,按下面的规则来构造:(1)若有产生式P→a…或P→Qa…,则a FIRSTVT(P)(2)若a FIRSTVT(Q),且有产生式P→Q…,则a FIRSTVT(P)2)构造LASTVT(P)的算法根据LASTVT (P)的定义,按下面的规则来构造:(1)若有产生式P→…a或P→…aQ,则a LASTVT(P)(2)若a LASTVT(Q),且有产生式P→…Q ,则a LASTVT(P)233)构造算符优先关系表的计算方法注:如果文法G按此算法构造出的优先表没有重定义项,则文法G是个算符优先文法。
24(1)求关系对如下形式的产生式,A …ab…或A …aQb…有a b 成立(2)求关系对每个非终结符B,观察如下形式的产生式A …aB…有a FIRSTVT (B )成立(3)求关系对每个非终结符B,观察如下形式的产生式A …Bb…有LASTVT (B ) b 成立0. E’→#E# 为考虑括号#增加的产生式1. E→E+T|T2. T→T*F|F3. F→P F|P4. P→(E)|i构造优先关系表•解:1)计算每个非终结符的FIRSTVT和LASTVT集合FIRSTVT(E’)={#}FIRSTVT(E)={+}∪FIRSTVT(T) FIRSTVT(T)={*}∪FIRSTVT(F) FIRSTVT(F)={ }∪FIRSTVT(P) FIRSTVT(P)={(,i}={+,*, ,(,i}={*, ,(,i}={ ,(,i}250. E ’→#E# 为考虑括号#增加的产生式1. E →E+T|T 2. T →T*F|F 3. F →P F|P 4. P →(E)|i 构造优先关系表•解:1)计算每个非终结符的FIRSTVT 和LASTVT 集合={+,*, ,),i}={*, ,),i}={ ,),i}LASTVT(E’)={#}LASTVT(E)={+}∪LASTVT(T)LASTVT(T)={*} ∪LASTVT(F)LASTVT(F)={ } ∪LASTVT(P)LASTVT(P)={),i}26LASTVT(E’)={#}LASTVT(E)={+,*, ,),i }LASTVT(T)={*, ,),i }LASTVT(F)={ ,),i }LASTVT(P)={),i }3)求关系:对表达式文法中终结符在前,非终结符在后的相邻符号对有:#E,+T, *F, F,(E 终结符FIRSTVT (非终结符)4)求关系:对表达式文法中终结符在后,非终结符在前的相邻符号对有:E# ,E+, T*, P ,E)LASTVT(非终结符) 终结符FIRSTVT(E’)={#}FIRSTVT(E)={+,*, ,(,i}FIRSTVT(T)= {*, ,(,i}FIRSTVT(F)= { ,(,i}FIRSTVT(P)= {(,i}0. E ’ #E#1. E E+T|T 2. T T*F|F 3. F P F|P 4. P (E)|i2)求关系:# # ,()27四、算符优先分析方法1、最左素短语在算符优先分析中,可归约的短语不再称为句柄,而称为最左素短语。