《程序分析技术》PPT课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 左(右)句型:用最左推导方式导出的句 型,称为左句型,而用最右推导方式导出 的句型,称为右句型(规范句型)。
结论:每个句子都有相应的最右和最左推导 (但对句型此结论不成立)
a
36
• 短语:设S是文法的开始符,是句型(即 有S *),如果满足条件:
S* A
A+
VT+
则称是句型的一个短语。 任一子树的
特点:
• 命令为基础,程序由一系列语句组成,语句的 执行引起存储单元值的变化。
• 程序的正确型(归纳断言指导…) • 数学性质弱(副作用,变量值变化) • 数据类型不够丰富 • 程序的动静态结构差异大
a
9
历史上的goto语句之争
1970,XPL编译器只用了一个goto 1972,操作系统只有五处用了标号和
• 子字符串:非空字符串 x ,删去它的前缀和后 缀后所得到的字符串称为 x 的子字符串,简称 子串。如果删去的前缀和后缀不同时为ε,则称 该子串为真子串。
a
20
• 符号串集合:若集合A中的所有元素都是某字 母表上的符号串,则称A为该字母表上的符号 串集合。
• 符号串集合的乘积:设A、B 是两个符号串集 合,AB表示A与B的乘积,则定义
goto • 难以理解,难以查错,动静态差异大 • 修改引起的副作用小,全局优化简单 • 概念简单,效率高
a
10
三、程序设计语言的发展 ——高级程序设计语言
(2)函数式语言
LISP,ML,HOPE,FP… 程序由一组函数组成,通过调用执行程序。
特点:
– 数学性质好 – 数据类型可自定义 – 支持并行计算 – 抽象级别高 – 数据以表为基础
• 3型文法:也称为正则文法。它是2型文法的特例,即
产生式的右部至多有两个符号,而且具有下面形式之
一: A →a ,A →a B
其中A,BVN ,aVT 。
a
32
4.3 上下文无关文法
定义为四元组(VT,VN,S,P) VT是有限的终极符集合 VN是有限的非终极符集合 S是开始符,S VN P是产生式的集合,且具有下面的形式: AX1X2…Xn 其中AVN,Xi(VTVN) ,右部可空。
a
31
4.2 文法分类
• O型文法:也称为短语文法,其产生式具有形式: 符→。,其中,(VTVN)*,并且至少含一个非终极
• 1型文法:也称为上下文相关文法。它是0型文法的特 例,要求|| || (S→例外,但S不得出现于产生 式右部)。
• 2型文法:也称为上下文无关文法。它是1型文法的特 例,即要求产生式左部是一个非终极符: A→ 。
a
40
5 语法分析
• 分类 – 自顶向下 • 递归下降法 • LL(1)方法 – 自底向上 • 简单优先方法 • LR(0)方法 • SLR(1)方法 • LR(1)方法 • LALR(1)方法
a
41
5.1 自顶向下分析基本思想
• 从文法开始符出发试图推导出所给的终极 符串。
例 G[z] :
Z
[1]Z aBd
a
21
2 正则表达式
• 定义:RE为定义在∑上的正则表达式则
– ∧,ε∈RE – 若a∈∑,则a∈RE – 若e1,e2∈RE,则e1·e2,e1|e2,e1+∈RE • 语义函数(解释函数)L L(∧)=Ф,L(ε)={ε} – 若a ∈ ∑则L(a)={a} – 若e1,e2∈RE则L(e1·e2)= L(e1)·L(e2)
a
11
三、程序设计语言的发展 ——高级程序设计语言
(3)逻辑式语言
• PROLOG • 以谓词为基础,具有推理能力 • 特定的应用领域抽象的问题求解公式处理
专家系统人工智能等
a
12
三、程序设计语言的发展 ——高级程序设计语言
(4)对象式语言
SmallTalk80
• 特点:
– 封装性 – 继承性 – 多态性
Ei
EE+E
EE*E a E(E)
39
E
E
+
E
E*
E
i
E
E
*
E
i
E+
E
i
i
i
i
推导1的语法树
推导2的语法树
句型i*i+i 可能的推导: 推导1: E E + E E * E + E i * E + E
i*i+Ei *i+i 推导2: E E * E i * E
i*E+Ei*i+Ei *i+i
• 功能没有扩充 • 可读性强
例:将(R4R5)中的双字节 数取补,结果送R4R5。
CMPT:MOV A,R5
CPL A ADD A,#1 MOV R5,A MOV A,R4
CPL A ADDC A,#0 MOV R4,A
RET
a
8
三、程序设计语言的发展
——高级程序设计语言
(1)过程式语言
PASCAL,C,FORTRAN,PL1
1. 每个结点都有G的一个文法符号,并且根 结点标有初始符S,非叶结点标有非终极 符,叶结点标有终极符或非终极符或。
2. 如果一个非叶结点A有n个儿子结点(从左 到右)为 X1,X2,...,Xn,则G一定有产 生式 A→X1X2 ...Xn 。
a
38
• 线性推导:我们称用符号进行的推导为线性推 导。
a
13
三、程序设计语言的发展 ——第四代语言
特定领域的特殊类语言
高级语言的抽象
如:Oracle应用开发环境、Power Builder…
a
14
四、程序分析的一般方法
• 静态分析方法 • 动态分析方法
a
15
五、静态的分析过程
• 词法分析
• 语法分析
• 所需要的分析
a
16
程序分析技术
第二讲 编译原理基础
程序分析技术
a
1
程序分析技术
第一讲: 程序设计语言的发展
a
2
一、程序分析的任务
以程序为对象,分析其属性,如: • 值的获取与传播 • 活跃性 • ……
a
3
二、程序分析技术的应用
1. 程序转换 2. 程序理解 3. 程序演化 4. 程序逆向工程
a
4
5. 程序验证与测试 6. 程序优化 7. 重构 8. 自动并行化 9. ……
Match Derivation Match Derivation Match Match Success
a
43
5.2 自底向上语法分析
• 思想:从待分析的符 号串开始,自左向右 进行扫描,自下而上 进行分析,通过反复 查找当前句型的句柄, 并使用产生式规则将 找到的句柄归约为相 应产生式的左部非终 极符,直到将输入串 归约为文法的开始符。 (移入-归约分析)
aB d
[2] B d [3] B c [4] B bB
bB c
a
42
自顶向下分析实例
自顶向下的语法分析过程【Sf,Rest,Action(D/M/S/E)】
Z#
abcd #
Derivation
aBd # Bd #
bBd # Bd # cd # d# #
abcd # bcd # bcd # cd # cd # d# #
a
17
大纲
• 基本概念 • 正则表达式 • 自动机理论 • 文法概述 • 语法分析
– 自顶向下 – 自底向上
a
18
1 基本概念
• 字母表: ∑,元素的非空有穷集合。
• 符号串:由字母表中的符号组成的任何有穷 序列。或者如下定义: 1. 空符号串ε是上的符号串 2. 若x是上的符号串,a是的元素,则xa是 上的符号串 3. y是上的符号串,当且仅当它可以由1和2 导出
L(e1|e2)= L(e1)∪L(e2) L(e1+)= L+(e1)
aLeabharlann Baidu
22
• ={ a,b } 正则表达式e 1. ab*
2. a(a|b)*
实例
L(e) 1. 上所有以a为首后跟任意多
个(包括0个)b的字符串集 2. 上所有以a为首的字符串集
a
23
3 自动机
• 定义:一个DFA是一个5元组 (S,∑,δ,S0,F),其中S是状态集合, ∑是字符集,δ是转换函数(转移函 数为)终S止×∑状→态S集合,,S0为F⊆初S。始状态S0∈S,F
• 文法能构造有效的语法分析器,检查源程 序是否符合语言规定的语法形式。
• 文法定义可以了解程序设计语言的结构, 有利于将源程序转化为目标代码及检查出 语法错误。
• 基于文法实现的语言易于扩展
a
30
4.1 文法定义
文法G定义为四元组(VT,VN,S,P) VT是有限的终极符集合 VN是有限的非终极符集合 S是开始符,S VN P是产生式的集合,且具有下面的形式: ,其中,(VTVN)*
a
33
4.4 文法相关概念
• 推导(直接推导):如果A是一个产生 式,则有A ,其中表示一步推导 (用A →)。这时称是由A直接推导的。 的含义是,使用一条规则,代替左边 的某个符号,产生右端的符号串。
• + : 表示通过一步或多步可推导出 • * : 表示通过0步或多步可推导出
a
34
• 句型:如果有S* ,则称符号串为CFG 的句型 。我们用SF(G)表示文法G的所有句 型的集合。
树叶全体(具有共同祖先的叶节点符号串)皆
为短语。
• 直接短语(简单短语):如果满足条件:
则称S是句* 型A的一A个简单短语。V任T+一简单 子树的树叶全体(具有共同父亲的叶节点符号 串)皆为简单短语。

句柄:一个句型可能有多个简单短语,其中 最左的简单短语称之为句柄。
a
37
• 语法分析树(简称分析树)用来描述句型的结 构,是句型推导的一种树型表示。文法 G=(VN,VT,S,P),则称满足下面条件的树为G 的一棵语法分析树:
• 句子:如果只包含终极符,则称为CFG的 句子。
• 语言:L(G)={ u| S + u ,u VT* } 文法G所定义的语言是其开始符所能推导的 所有终极符号串(句子)的集合。
a
35
• 最左(右)推导:如果进行推导时选择的 是句型中的最左(右)非终极符,则称这种 推 表导示为最最左左((右右))推推导导,。并用符号lm(rm)
a
19
• 符号串的连接:设x和y均是字母表∑上的符号 串,它们的连接是把y的所有符号顺序接在x的 符号之后所得到的符号串。
• 符号串的方幂:设x是字母表∑上的符号串,把 x自身连接n次得到的符号串z, 称作符号串x的n 次幂,记作 z=xn ,特别地:x0=
• 前缀和后缀:设x是字母表上的符号串,x=yz , 则y是x 的前缀,z 是x的后缀,特别是当z≠ 时,y是x的真前缀;y≠ε时,z是x的真后缀。
AB={xy|(x∈A)∧(y∈B)} • 符号串集合的方幂:设A是符号串集合,则称
Ai 是符号串集合 A的方幂,其中i 是非负整 数。
A0={}, A1=A, A2=AA, …, An=AA… A • 符号串集合的正闭包:A+=A1∪A2∪A3 … • 符号串集合的星闭包:A*= A0∪A1∪A2∪A3 …
f (Q, b)=Q
a
25
两种表示形式
a
S
U
b
b
a
a
b
V
Q
b
a
S UVQ a UQUQ b V V QQ
a
26
3.2 词法分析
• 功能:读源程序的字符序列,逐个拼出单 词,并构造相应的内部表示,同时检查源 程序中的词法错误。
• 单词:所谓单词是指语言中具有独立含义 的最小的语义单位。
• Token:单词的内部表示。“程序语言的操 作对象(只能)是该语言规定的各种数 据。”编译程序是用某种程序语言书写的 程序,其操作对象是一般程序中的各种语 法单位。
a
5
三、程序设计语言的发展
a
6
三、程序设计语言的发展
——机器语言
指令:
– 二进制组成 – 具有基本操作,左
移、右移、加1
缺点:
– 可读性差(可理解 性差)
– 写程序困难(不方 便)
问题:程序的维护比 较困难
– 扩展 – 纠错 – 预防 – 适应
a
7
三、程序设计语言的发展
——汇编语言
• 符号化了的机器 语言
a
27
单词的一种分类方法
单词
标识符 常量
X1, classT 10, LENGTH
保留字
while, int
特殊符号
运算符 界限符
+,^ {,},;
格式符
a
EOF,
28
识别常数的自动机
A
数字
数字 C
+
-
B
数字
E
数字
数字
小数点 D
注:未考虑前导0的情形
a
29
4 文法概述
• 文法能清晰地描述程序设计语言的语法构 成,易于理解。
• 树型推导与线性推导的不同:线性推导指明了推 导的顺序,而树型推导则没有指明推导的顺序。 因此,句型一般只有一棵分析树(如果无二义性), 而线性推导则可以有很多棵分析树。
• 二义性文法:如果一个文法的某个句型有两棵不 同的语法分析树,则称该文法二义性为二义性文 法。
例:文法G=( {+,*,i,(,)}, {E}, E, P), 其中P为:
• 两种表示形式
– 转换图 – 转换矩阵
a
24
3.1 自动机实例
确定有限状态自动机 M=({a, b},
{S, U, V, Q}, f, S, {Q}),其中f定义为:
f (S, a)=U
f (V, a)=U
f (S, b)=V
f (V, b)=Q
f (U, a)=Q
f (Q, a)=Q
f (U, b)=V
相关文档
最新文档