编译原理课件CHAPTER 4(Syntax Analysis-2)

合集下载

编译原理04自上而下语法分析PPT课件

编译原理04自上而下语法分析PPT课件
5
❖ 例4.1:假定有文法(4.1) S→xAy A→**|*
分析输入串x*y(记为α)。
S
S
S
x Ay
x Ay x A y
***来自(a)(b)(c)
6
❖ 由上例看到,自上而下分析法存在许多困难和缺点
文法的左递归性P+ Pα使分析陷入无限循环 回溯的不确定性,要求我们将已经完成工作推倒重来 虚假匹配问题 难于知道出错位置 效率低,代价高,实践价值不大
END
③ 化简上述文法
11
例4.3:考虑文法:SQc|c
Q Rb|b
R Sa|a
消除左递归。
解:将终结符排序为R、Q、S。对于R不存在直接左递归。把R带入 到Q中有关的候选式: Q Sab|ab|b
现在Q同样不含直接左递归,把它带入S的有关候选式:
S Sabc|abc|bc|c 经消除S的直接左递归后我们们得到整个文法
❖ 下图表明了语法分析器在编译程序中的地位
源程序
词法分析器
单词符号 取下一
语法分析器
语法 分析树
单词符号
后续部分
符号表
❖ 按照语法分析树的建立方法,我们可以粗略地把语法分析方 法分为两类:一类是自上而下分析法,另一类为自下而上分 析法
3
例:自顶向下构造最左推导(aabbaa) SaASa A SbA SS ba
执行任务。这个候选就是那个终结首符集含a 的
14
❖ 如何把一个文法改造成任何终结首符集的所有候选首符集两 两不相交呢?其办法是提取公共左因子
❖ 假定关于A 的规则是 A1| 2| … |n| 1| 2|… |m (其中每个不以开头)
那末,可以把这些规则改写成: A A’| 1| 2|… |m A’ 1 | 2 | …| n

清华大学编译原理Chapter4PPT课件

清华大学编译原理Chapter4PPT课件

f
a
b
-0 1 2
132
213
+3 3 3
状态转换表的行标表示状态,列标表示输入 符号,表元素表示f(W,a)的值。
19
定义4.6 字母表V上的状态图SG是如下有向图:
(1)至少有一个初始结点,用“-”标记; (2)至少有一个终止结点,用“+”标记;
确定,可全体编为一类,称作“一字一类”) ②标识符:用户定义的常量名、变量名、过程名和
类型名(个数不确定,作为一类,称作“一符一 类”) ③常量:12,1997,4.14,‘A’,‘scnu’等(个数不 确定,按类型分类) ④运算符 +,-,*,/, >,>=,<,<=,#等(个数 确定,“一符一类”) ⑤界限符 ;,()等(个数确定,“一符一类”)
5
词法分析程序输出的单词符号通常用二元式 表示:(单词种别,单词自身的值)
单词种别:表示单词种类,常用整数编码, 它是语法分析需要的 单词自身的值:是编译中其他阶段所需要 的信息
6
(4)词法分析程序的设计过程
3G 3型文法 RE 正则表达式
3G RE
SG 状态图 εFA ε确定自动机
εDFA
εNFA ε非确定自动机
A→0S|1A|ε A=ε+0S+1A ② 解:
17
4.3 有穷自动机(FA)
(1)确定有穷自动机(DFA) 定义4.5 一个确定有限自动机(DFA)M是一个五元 组:M=(K,VT,f,S,Z) 其中 K:有穷状态集; VT:有穷的输入字母表; f:K×VT→K是状态转换函数,即f(W,a)=U
(ba)*b ={(ba)nb|n≥0} b(ab)* =(ba)*b
11

编译原理第四章

编译原理第四章

FIRST( F ) = { (, id
}
FIRST( T ) = FIRST( F ) = { (, id } FIRST( E ) = FIRST( T ) = { (, id } FIRST( E' ) = { +,ε }
FIRST( T' ) = { *, ε }
定义
教学进度
FOLLOW( A ) 的计算法(P67)
计算机科学与工程系
表达式文法直接左递归的消除
E → E + T|T T → T * F|F F → ( E )|id
E E' T T' F → → → → → T + F * ( E' T E'|ε T' F T'|ε E )|id
教学进度
计算机科学与工程系
把直接左递归改为直接右递归:
将规则A →A1|A2|...|Am|1|2|...|n 改写为: A → 1 A’ |2 A’ |...|n A’ A’ → 1A’|2 A’ |...|m A’ | ε
• top down parsing:推导
• bottom up parsing:归约
教学进度
4.2 自顶向下语法分析
• 基本思想:
计算机科学与工程系
• 从文法的开始符号出发,向下推导出句子; • 试图用一切可能的办法,从文法开始符号出发, 自上而下地为输入串建立一课语法树;(寻找一 个最左推导) • 此分析过程本质上是一种试探过程。 • 非确定的自上而下分析法实际上采用的是一种 穷尽一切可能的试探法。
• E → T E' • E'→ + T E'|ε • T → F T' • T'→ * F T'|ε • F → ( E )|id 按照最左推导过程,构造分析树

《编译原理教程》第四章语义分析和中间代码生成

《编译原理教程》第四章语义分析和中间代码生成

控制流分析和数据流分析案例
总结词
控制流分析和数据流分析是编译器设计中两种重要的 语义分析技术。
详细描述
在控制流分析案例中,我们以一个具有条件语句和循环 的程序为例,分析其控制流图(Control Flow Graph, CFG)。CFG是一个有向图,用于表示程序中各个基本块 之间的控制流程关系。通过CFG,编译器可以检测到潜 在的程序错误,如死代码和无限循环。在数据流分析案 例中,我们使用数据流方程来跟踪程序中变量的值在执 行过程中的变化。我们以一个简单的程序为例,该程序 包含一个变量在函数调用后被修改的情况。通过数据流 分析,我们可以确定变量的最新值,以便在后续的语义 分析中使用。
定义
三地址代码是一种中间代码形式,它由一系列的三元组操作数和 操作符组成。
特点
三地址代码具有高度规范化,易于分析和优化,且易于转换成目 标代码。
常见形式
常见的三地址代码有三种基本形式,即加法、减法和赋值。
循环优化
定义
循环优化是指在编译过程中,对循环结构进行优化, 以提高目标代码的执行效率。
常见方法
将源程序分解成一个个的词素或标记。
语法分析
根据语言的语法规则,将词素或标记组合成一个个的语句或表达式。
语义分析
对语法分析得到的语句或表达式进行语义检查,确保其语义正确。
中间代码生成
基于语义分析的结果,生成中间代码。
02
语义分析技术
类型检查
类型检查是编译过程中对源代码进行语义分析的重要环节,其主要目的是 确保源代码பைடு நூலகம்类型安全。
常见的循环优化方法包括循环展开、循环合并、循环 嵌套等。
优化效果
通过循环优化,可以减少循环的次数,提高程序的执 行效率。

Chapter04_Syntax Analysis语法分析共125页文档

Chapter04_Syntax Analysis语法分析共125页文档

4.2.2.1 Specification of context-free grammar rules 上下文无关文法规则的说明
● 什么是文法? 文法是对语言结构的定义与描述。即从形式上用于描述和 规定语言结构的称为“文法”(或称“语法”)。
例:请判断英语句子The big elephant ate the peanut. 语法上是否正确?
the regular expression: number = digit digit* digit = 0|l|2|3|4|5l6|7|8|9
*
• |() =
无 不出现 | 含义变化 (=, ::=)
the context-free grammar: number number digit | digit ;
20times
② 语法错误是指语法结构出错,如少分号、begin/end不配 对等。
begin
x:=a+b
y:=x;
25.05.2020 北京化工大学信息科学与技术学院计算机系 4
4.1 语法分析器的作用
● 源程序中可能出现的错误
① 词法错误
如非法字符或拼写错关键字、标识符 等;
② 语法错误
intege 是2指0t语im法es结构出错,如少分
=> the big elephant ate the <名词>
=> the big elephant ate the peanut
a:=a/b2;5.05.2020 北京化工大学信息科学与技术学院计算机系 5
4.1 语法分析器的作用
● 语法错误处理的目标
• 清楚而准确地报告错误的出现 (地点正确、不漏报、不错报也不多报); • 迅速地从每个错误中恢复过来 (以便分析继续进行); • 不应使对语法正确源程序的分析速度降低太多。

编译原理课件Chapter_4

编译原理课件Chapter_4
21
NFA构造文法的例子
• A0 aA0 | bA0 | aA1 • A1 bA2 • A2 bA3 • A3 ε
• 考虑baabb的推导和接受过程可知:NFA接受一个句子 的运行过程实际就是该文法推导出该句子的过程
b
(a|b)*abb
22
文法及其生成的语言
语言是从文法的开始符号出发,能推导得到的所 有句子的集合
将文法的非终结符号排序为A1, A2, …, An for i = 1 to n do {
for j = 1 to i – 1 do { 将形如Ai Ajγ的产生式替换为Ai δ1γ | δ2γ | … | δkγ, 其中Aj δ1 | δ2 | … | δk是以Aj为左部的所有产生式
} 消除Ai的立即左递归 }
23
设计文法 (1)
文法能够描述程序设计语言的大部分语法
但不是全部,比如,标识符的先声明后使用则无法用 上下文无关文法描述
因此语法分析器接受的语言是程序设计语言的超集; 必须通过语义分析来剔除一些符合文法、但不合法的 程序
24
设计文法 (2)
在进行高效的语法分析之前,需要对文法做以下 处理
6
上下文无关文法的例子
• 简单算术表达式的文法
– 终结符号:id, +, –, *, /, (, )
– 非终结符号:expression, term, factor
– 开始符号:expression
– 产生式集合
expression expression + term
expression expression – term
消除二义性
二义性:文法可以为一个句子生成多颗不同的分析树
消除左递归

《编译原理》课件

《编译原理》课件
代码生成
编译器可以将高级语言编写的源代码转换成机器语言或低级语言,以便在特定的硬件平台上运行。编 译器还可以生成可执行文件或动态链接库等二进制文件。
编译器在人工智能领域的应用
机器学习编译器
机器学习编译器可以将机器学习模型转换成可执行代码,以便在嵌入式设备或边缘计算 设备上运行。这种编译器可以优化模型的计算性能和内存占用,提高模型的运行效率。
3
缺点
对于某些复杂文法,可能导致大量的无用推导和 状态爆炸。
自底向上的语法分析
分析步骤
从输入符号序列的最后一个符号开始,逐步向上构建语法树,直 到找到与文法中的某个产生式右部匹配的符号串。
优点
可以充分利用已知信息,避免不必要的推导和状态爆炸。
缺点
对于某些复杂文法,可能导致大量的无用归约和状态爆炸。
04
中间代码生成
中间代码生成的定义和任务
定义
中间代码生成是编译器的一个阶段,将源代码转换成中间代码的过程。
任务
将源代码转换成一种中间表示形式,以便进行后续的优化和目标代码生成。
三地址代码的生成
01
三地址代码是一种中间代码形 式,由一系列的三元式组成。
02
三元式的形式为(op, arg1, arg2),表示执行一个操作(op) 并产生一个结果,操作数arg1 和arg2来自寄存器、常数或之 前的计算结果。
语义分析
检查AST是否有语义错误,如类型错 误、未定义的变量等。
中间代码生成
将AST转换为中间代码,通常是三地 址代码。
代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换为机器语言代码, 能够在特定硬件上执行。
编译器的分类

编译原理完整课件_第4章 语法分析-自上而下分析

编译原理完整课件_第4章 语法分析-自上而下分析

2022/3/20
中南大学软件学院 陈志刚
6
第四章 语法分析-自上而下分析
4.2 自上而下分析面临的问题
➢ 顾名思义,自上而下就是从文法的开始符号出 发,向下推导,推出句子。 • 带回溯的分析方法 • 不带回溯的递归子程序(递归下降)分析方 法
➢ 自上而下分析的主旨: 对任意输入串,试图用一切可能的办法,从文 法开始符号(根结)出发,自上而下地为输入 串建立一棵语法树。或者说,为输入串寻找一 个最左推导。
设 ,有P→Pα|β,若α≠>ε,β不以P开头 (否则不可能消除左递归)。
则改写为:
可消除左递归。
2022/3/20
中南大学软件学院 陈志刚
12
第四章 语法分析-自上而下分析
一般地,若 αi≠ε,βj不以P开头, 则可改写为:
从而消除直接左递归。 ■ 例:S→Sabc|Sab|ab ■ 消除直接左递归得:
2022/3/20
中南大学软件学院 陈志刚
13
2、完全消除左递归 分析
第四章 语法分析-自上而下分析
虽不含直接左递归,但
所以含有左递归。
■ 如果文法G不含回路( ),也不含ε产生式,
则下列算法可消除左递归(完全)
①把G的非终结符按任意顺序排列成P1,…,Pn
②for i:=1 to n do
begin for j:=1 to i-1 do
➢ 关键:对一个文法,当给你一串(终结)符号 时,怎样知道它是不是该文法的一个句子呢? 这就要判断,看是否能从文法的开始符号出发 推导出这个字符串。或者,从概念上讲,就是 要建立一棵与输入串相匹配的语法分析树。
2022/3/20
中南大学软件学院 陈志刚
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1

07:14
4.3

自底向上分析
自底向上分析:

从叶子到根来建立句子的分析树。

或,给出一个从句子出发到开始符号的归 约序列
07:14
2
4.3
自底向上分析
E
T T
句子:
例:文法G[ E ]: ET+E|T T int * T | int | (E)
E T + int
3
int
*
int
07:14
输入符号串
abbcde$ bbcde $ bcde $ bcde $ cde $ cde $ de $ e $ e $ $ $
动作
移进 移进 归约(A→b) 移进 归约(A→Ab) 移进 移进 归约(B→d) 移进 归约(S→aAcBe) 接受
S A B
9) 10) 11)
A
a b b c d e
对输入串abbcde#的移进-规约分析过程
07:14
*
int

+
int
8
4.3
步骤 (6)
自底向上分析
|int * int + int int | * int + int int * | int + int int * int | + int int * T | + int T | + int int
07:14
T T * int

+
int

07:14
23
4.4

算符优先分析

FIRSTVT(B)={ b | B b…或 B Cb…} 对于非终结符 B,其往下推导所可能出 现的首个算符(终结符号) LASTVT(B)={ a | B …a或 B …aC} 对于非终结符 B,其往下推导所可能出 现的最后一个算符
24

28
例:文法G[E]: (0) E’→$E$ (1) E→E+T (2) E→T (3) T→T*F (4) T→F (5) F→PF | P (6) P→(E) (7) P→i
07:14
4.4
算符优先分析
3)“ · ”关系 > 找形如:A→…Bb…的产生式 E$:则 LASTVT(E) · $ > E+:则 LASTVT(E) · + > T*:则 LASTVT(T) · * > P:则 LASTVT(P) · > E):则 LASTVT(E) · ) >
int
07:14
*
int

+
int
6
4.3
步骤 (4)
自底向上分析
|int * int + int int | * int + int int * | int + int int * int | + int
int
07:14
*
int

+
int
7
4.3
步骤 (5)
自底向上分析
|int * int + int int | * int + int int * | int + int int * int | + int int * T | + int T int
例:文法G[E]: (0) E’→$E$ (1) E→E+T (2) E→T (3) T→T*F (4) T→F (5) F→PF | P (6) P→(E) (7) P→i
07:14
29
4.4
算符优先分析
算符优先关系表
+ *

例:文法G[E]: (0) E’→$E$ (1) E→E+T (2) E→T (3) T→T*F (4) T→F (5) F→PF | P (6) P→(E) (7) P→i
07:14
T T int * int +
E T int
14

4.3

自底向上分析
注:
右句型(规范句型):最右推导得到的句型 每一步都是将右句型的最左可归约串(句 柄)归约为产生式的左部符号 (P195)



分析过程是寻找一个(最左)归约序列的过程
输出的是一个产生式序列 应用这个产生式序列对句子进行一个规范归 约,或应用这个产生式序列的逆序列作一个 最右推导,可以同时构造句子的分析树。
07:14
20
4.4
算符优先分析
2、a <· b(a的优先级小于b) 当且仅当 G 中含有形如 A →…aB…的产生式,且有 B b… 或 B Cb… 3、a · b(a的优先级大于b) 当且仅当 G > 中含有形如 A →…Bb…的产生式,且有 B …a 或 B …aC
11

4.3
步骤 (9)
自底向上分析
|int * int + int int | * int + int int * | int + int int * int | + int int * T | + int T | + int T + | int T + int | T+T|
07:14
T T int * int + T int
27
例:文法G[E]: (0) E’→$E$ (1) E→E+T (2) E→T (3) T→T*F (4) T→F (5) F→PF | P (6) P→(E) (7) P→i
07:14
4.4
算符优先分析
1) “ =·”关系 由产生式(0)和(6),得: $ =·$,( =·) 2)“ <·”关系 找形如:A→…aB…的产生式 $E: 则 $ <·FIRSTVT(E) +T: 则 + <·FIRSTVT(T) *F: 则 * <·FIRSTVT(F) F: 则 <·FIRSTVT(F) (E: 则 ( <·FIRSTVT(E)
Chapter4 Syntax Analysis

语法分析概述
(An overview of parsing)

自顶向下分析(Top-down Parsing) 自底向上分析(Bottom-up Parsing) 算符优先分析 (Operator-precedence Parsing) LR 分析(LR Parser)
07:14
31
4.4
算符优先分析
例子:P 203 example 4.27

文法(4.27)不是算符优先文法 由于文法(4.27)的简单直观性,在实 际使用中往往人为地给出此文法的算符 优先关系,用此文法来分析表达式

07:14
32
4.4

算符优先分析
算符优先分析的基本思想:

利用算符优先关系来寻找可归约串 算法:P 206 算法4.5
07:14
21
4.4

算符优先分析
算符优先文法:

如果一个算符文法 G 的任意两个终结符号之 间最多只有<· >、=· 、· 、三种关系的一种成 立,则称 G 为算符优先文法。
07:14
22
4.4

算符优先分析
算符优先关系表的构造

由定义直接构造 通过计算 FIRSTVT 集与 LASTVT 集构造
步骤 (8)
自底向上分析
|int * int + int int | * int + int int * | int + int int * int | + int int * T | + int T | + int T + | int T + int |
07:14
T T int * int + int
S aAcBe aAcde aAbcde abbcde
07:14 17
4.3

自底向上分析
自底向上分析法的关键问题是:

在右句型中寻找可归约串(对于规范归约来 说是寻找句柄) 不同的寻找可归约串的方法就形成了不同的 自底向上分析法

07:14
18
4.4

算符优先分析
算符文法(operator grammar):
07:14
26
4.4
算符优先分析
FIRSTVT(E’)={ $ } FIRSTVT(E)={ + , * , , ( , i } FIRSTVT(T)={ * , , ( , i } FIRSTVT(F)={ , ( , i } FIRSTVT(P)={ ( , i } LASTVT(E’)={ $ } LASTVT(E)={ + , * , , ) , i } LASTVT(T)={ * , , ) , i } LASTVT(F)={ , ) , i } LASTVT(P)={ ) , i }
16
07:14
(P195)
文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
步骤 符号栈
1) 2) 3) 4) 5) 6) 7) 8) $ $a $ ab $ aA $ aAb $ aA $ aAc $ aAcd $ aAcB $ aAcBe $S

算符文法 G 中不含形如 A→ε A →αBCβ 的产生式 在算符文法中,任何句型都不包含两个相邻 的非终结符号
19

07:14
4.4

算符优先分析
相关文档
最新文档