编译原理第三章PPT3
编译原理第03章PPT课件

65
-
procedure swap(var x:integer); begin x:=x+a; /*a是全局变量*/
a:=x-a; x:=x-a end; 调用swap(a);别名也影响编译器生成优化的代 a:=(x-y*z)+w ; b:=(x-y*z)+u ; 若a与x、y或z中任一个是别名
用标号控制循环体 DO 7 I=1,10 A(I)=0 B(I)=0
7 CONTINUE
19
-
②Pascal的for 语句
计数重复的值可在任何有序集上 for . . . to . . . for . . . down to . . .
20
-
2. 条件制导
①while:0次或多次重复 ②do-while,repeat-until:多次重复 ③ALGOL 68循环的一般形式:
Smalltalk 语言以对象方式来处理控 制结构。
40
-
可以认为上述语言是可扩充的,用 户可以通过定义新的(抽象)数据类型 和控制结构来扩充基本语言。
但基本的控制结构并没有发生改变。
41
-
第二节 单元级控制结构
规定程序单元之间控制流程的机制。 最简单的机制是 ALGOL60 的分程序
42
-
在程序顺序执行的过程中,遇到一 个分程序,就建立一个新的引用环境, 并执行这个分程序。
7
-
3. 多选一 嵌套 的 if then else
if语句包含if语句 ①ALGOL 60的选择结构引起二义性
if x>0 then if x<6 then x:=0 else x:=9 ②PASCAL的“最近匹配原则” ③ ALGOL 68中if语句的结束符号fi ④ ALGOL 68对else if 进行缩写
编译原理_第3章课件

编译原理_第3章课件第三章词法分析本章将讨论词法分析程序的设计原则,单词的描述技术,识别机制及词法分析程序的⾃动构造原理。
教学要求1.掌握:正规式,DFA的概念,NFA的概念2.理解:将NFA转换为DFA ,正规式、正规⽂法与有穷⾃动机间的转换⽬录3.1 词法分析程序的设计3.2 单词的描述⼯具3.3 有穷⾃动机3.4 正规式与有穷⾃动机的等价性3.5 正规⽂法和有穷⾃动机的等价性3.6 词法分析程序的⾃动构造⼯具⼩结3.1.词法分析(lexical analysis)程序的设计回顾:1、词法分析的任务:逐个读⼊源程序字符并按照构词规则切分成⼀系列单词。
2、词法分析程序:实现词法分析的程序。
⼀.词法与语法分析程序的接⼝⽅式1、作为独⽴的⼀遍词法分析是编译过程中的⼀个阶段,在语法分析前进⾏,把字符流的源程序变为单词序列,输出在⼀个中间⽂件上。
2、与语法分析结合在⼀起作为⼀遍⼀般、把词法分析程序设计成⼀个⼦程序,由语法分析程序调⽤词法分析程序来获得当前单词,供语法分析使⽤。
….词法分析程序的主要任务:读源程序,产⽣单词符号词法分析程序的其他任务:滤掉空格,跳过注释、换⾏符追踪换⾏标志,复制出错源程序,宏展开,……⼆、词法分析程序的输出输出是单词符号。
单词是语⾔中具有独⽴意义的最⼩单位。
单词包括:保留字标识符常量运算符界符(标点符号)词法分析程序所输出的单词符号常常采⽤以下⼆元式表⽰:(单词种别,单词⾃⾝的值)。
单词的种别是语法分析需要的信息,⽽单词⾃⾝的值则是编译其它阶段需要的信息。
(标识符,指向该标识符所在符号表中位置的指针) 单词的种别可以⽤整数编码表⽰,假如标识符编码为1,常数为2,保留字为3,运算符为4,界符为5例如:程序段if i=5 then x∶=y;在经词法分析器扫描后输出的单词符号和它们的表⽰如下:- 保留字if(3,'if')- 标识符i(1,指向i的符号表⼊⼝)- 等号=(4,'=')- 常数5(2,'5')- 保留字then(3,'then')- 标识符x(1,指向x的符号表⼊⼝)- 赋值号∶=(4,'∶=')- 标识符y(1,指向y的符号表⼊⼝)- 分号;(5,';')三、词法分析⼯作从语法分析⼯作独⽴出来的原因:简化设计改进编译效率增加编译系统的可移植性3.2 单词的描述⼯具程序设计语⾔中的单词是基本语法成分.单词符号的语法可以⽤有效的⼯具加以描述,并且基于这类描述⼯具,实现词法分析程序的⾃动构造.描述⼯具:正规⽂法和正规式识别⼯具:有穷⾃动机⼀.正规⽂法多数程序设计语⾔的单词的语法能⽤正规⽂法来描述。
哈工大编译原理.ppt

procedure SORT(CH);
{ case CH of ‘字母’:
‘字母’: call RECOGID(CH,TOKEN);
‘/’: call HANDLECOM(CH,TOKEN);
‘数字’: call RECOGDIG(CH,TOKEN);
‘’‘
call RECOGSTR(CH,TOKEN);
if TOKEN!=‘ ’ then call PRINTERR(‘注解未完’);
TOKEN:=‘ ';
return }
25
识别界限符(RECOGDEL) 输入:CH内含单界限符; 输出:各种界符的TOKEN字; procedure RECOGDEL(CH,TOKEN); { case CH of
otherwise call RECOGDEL(CH,TOKEN);
end case;
write TOKEN into TOKEN文件;
Return } 23
procedure RECOGID(CH,TOKEN);
{ WORD:= ‘ ’; WORD:=WORD||CH; Repeat {
call GETCH(CH);
%%
标识符 {入口地址=LOOKUP();}
%%
LOOKUP()
31
辅助过程是动作需要的,这些过程用C书 写,可以分别编译.例:LOOKUP()
32
28
声明 %% 翻译规则 %% 辅助过程
29
声明包括变量,符号常量和正规定义式。
翻译规则的形式为:
p1
{ 动作1}
p2
{ 动作2}
…
…
pn
{ 动作n}
30
每个pi是正规定义式的名子,每个{动 作i}是正规定义式pi识别某类单词时,词 法分析器应执行动作的程序段。用C书 写。
编译原理课件第3章

代码优化
代码优化的目的和分类
目的
提高程序运行效率,减少空间占用,提高可读 性。
局部优化
对单个程序块的优化,如基本块的优化。
全局优化
对整个程序的优化,如循环优化、死代码删除等。
代码优化的主要技术
常量折叠和替换
将常量表达式的结果在编译时计算出来,并 用结果替换掉表达式。
循环优化
编译原理课件第3章
contents
目录
• 词法分析 • 语法分析 • 中间代码生成 • 代码优化 • 目标代码生成
01
CATALOGUE
词法分析
词法分析器的任务
将源程序分解成一系列的记号(tokens) 去除源程序中的注释和空白符
识别出关键字、标识符、常量、操作符等记号 为语法分析器提供有序的记号流
通过改变循环的迭代顺序、减少循环中的计 算等方法来提高循环的效率。
死代码删除
删除永远不会被执行到的代码。
函数内联
将小的函数调用替换为函数体的直接执行, 以减少函数调用的开销。
代码优化的实现
编译器前端
负责将源代码转换成中间表示(IR),这一阶段主要 完成语义分析和语法分析。
编译器中端
对中间表示进行优化,如常量折叠、死代码删除等。
考虑文法的二义性
有些文法具有二义性,即一种语法结构可以有多种解析方 式。在设计语法分析器时需要考虑如何处理二义性问题, 避免产生错误的分析结果。
语法分析器的实现
编写词法分析器
词法分析器是将输入的字符串转 换成一个个的单词或符号,供语 法分析器使用。在实现语法分析 器之前,需要先编写词法分析器 。
实现递归下降分析
解析与语义分析
编译原理课件第三章

语法树
树形结构用于表示程序的语法结 构,方便地运用于源代码分析。
代码优化
1
常量传播
将一些常量在编译器计算好,避免运行时重复计算。
2
死代码消除
通过删除不会执行的代码来提高程序性能。
3
指针分析
通过分析指针和寄存器在程序中的使用来优化代码。
生成目标代码
静态链接
将程序和所需库文件合并成一个完整的可执行文件。
编译原理课件第三章
了解语言处理器的基本作用和编译过程的概述是打开计算机编程大门的关键!
词法分析与语法分析
1 词法分析
将源代码分离成一个个单词,即“记号”。
2 语法分析
将各个记号按照语法规则组成语法树,检验代码结构是否合法。
3 语法制导翻译
将语法树转换成检查和翻译动作的程序。
语义分析
类型检查
确认数据类型是否合法,如 加法只能对整数或浮点数操 作。
动态链接
将程序和库文件分离,程序在运行时动态加载所需 的库文件。
语言处理器的作用
编译器
将一种语言的代码翻译成另一种语言的代码,提高代码的性能。
解释器
将一种源代码解释成另一种语言的代码,即时运行,比较灵活。
预处理器
对源代码进行宏替换、条件编译等处理,生成另一个源代码文件。
编译处理的概述
前端处理
包括语法分析、词法分析、语义 分析和中间代码生成。
常量折叠
在编译时计算常量的值。比 如3+2就不需要在运行时计 算,直接算成5。
指针分析
对指针操作进行检查,如不 能对无效的指针进行解引用。
中间代码生成
三地址码
源代码和机器代码之间的一种中 间形式,每个语句最多只包含三 个地址。
编译原理课件第3章 (1)

3.2 单词的描述 3.2.1 正则文法
• 正则文法G = (V,T,P,S)中,对 α β ∈P,α β 均具有形式Aw或 AwB(Aw或ABw),其中A,B∈V, w∈T+。 • 例3.2 标识符的文法
– <id> – <id> – <id> – <id>
2019/2/16
A|B|…|X|a|b|…|z <id>A|<id>B| … |<id>Z <id>a|<id>b| … |<id>z <id>0|<id>1|<id>2|… |<id>9
11
• 例3.2 标识符的文法或者定义为
– 约定:用digit表示数字:0,1,2,…,9; 用letter表示字母:A,B,…,Z,a,b,…,z – <id> <letter> | <id><digit> | <id><letter> – <letter> A | B | … | Z | a | b | … | z – <digit> 0 | 1 | 2 | … | 9
2019/2/16 2
3.1.1 单词的分类与表示 & 3.1.2 词法分析器的输出
一、单词的种类
1. 关键字:也称基本字,begin、end、for、do...
2. 标识符:由用户定义,表示各种名字
3. 常数:整常数、实常数、布尔常数、字符串常数等 4. 运算符:算术运算符+、-、*、/等;逻辑运算符not、or
编译原理陈火旺版第三章ppt

词法分析器对扫描缓冲区扫描时采用2个 指示器:一个指向当前单词的开始位置(起点 指示器);另一个用于向前搜索以寻找单词的 终点(搜索指示器)。
扫描缓冲区的设计:
预处理 子程序
扫描器 单词符号
起点指示器 搜索指示器
输入 输入缓冲区
else if(ch=‘+’) return($PLUS,-); else if(ch=‘*’) begin
Getchar(); if(ch=‘*’) return($POWER,-); Retract(); return($STAR,-); end else if (ch=‘;’) return ($SEMICOLON,-); else if (ch=‘(’) return ($LPAR,-); else if (ch=‘)’) return ($RPAR,-); else if (ch=‘{’) return ($LBRACE,-); else if (ch=‘}’) return ($RBRACE,-); else ProcError(); /*错误处理*/
a(a|b)* ∑上所有的以a为首的字
(a|b)*(aa|bb)(a|b)* ∑上所有含有2个相继的a或者2个
相 继的b的字
例3.2 令∑={ A , B , 0 , 1 } , 下面是∑上的正规式和相应的正规
集。
正规式
正规集
(A|B)(A|B|0|1)* ∑上 “标识符” 的全体
(0|1)(0|1)*
§3.3 正规表达式与有限自动机
3.3.1 正规式与正规集
递归定义:
⑴ε和都是∑上的正规式,其所表示的正规集
编译原理第三章-Read

词法分析的基本概念 正规式自动机和状态图 词法分析程序的设计
1
学习目标:
掌握:词法分析程序的构造,正规式和正 规文法到有穷自动机的转换,NFA到DFA的 转换、DFA的化简
理解:正规文法、正规式、DFA的概念、 NFA的概念
了解:词法分析程序的自动构造工具
2
词法分析程序
A→(a|d)A A→ε
A→aA A→dA
最终有产生式: S→aA , A→ ε, A→aA, A→dA
30
2. 将正规文法转换成正规式 将每条产生式改写为正规式
用代入法解正规式方程组
最后只剩下一个开始符号定义的正规式,其中 不含非终结符
正规文法到正规式的转换规则:
文法产生式 正规式
规则1 A→xB B→y A=xy
分配律
5。 r=r, r=r
是“连接”的恒等元素
6。 rr=r r=rrr… “或”的抽取律
25
程序中的单词都能用正规式来定义
令l为a~z的字母,d为0~9的数字
e1= l ( l | d)* e2= dd*
e1表示标识符集合 e2表示无符号整数
注(比较): <标识符>→l|l<字母数字> <字母数字>→l|d|l<字母数字>|d<字母数字>
多含有一个终结符为止
原产生式 变换后产生式
规则1 A→xy A→xB B→y 规则2 A→x*y A→xA A→y 规则3 A→x|y A→x A→y
其中B为一新非终结符
29
例: 将R=a(a|d)*转换成相应的正则文法 令转换成文法G=(VN,VT,P,S) 其中VT={a,d}, 文法开始符为S 首先形成S→a(a|d)*,然后变换 S→aA A→(a|d)*
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例子
a abb a*b+
例子(续1)
输入aaba的执行过程
对应的DFA
模式 none a a*b+ none a*b+ abb 状态 A {0,1,3,7} B {2,4,7} C {8} D {7} E {5,8} F {6,8} a B D --D ----b C E C C F C
最小化一个DFA的状态数
不确定的有穷自动机(NFA)
NFA(Non-Deterministic Finite Automata)是一个五元组, 它包括: 有穷状态集合S 输入符号集合 转换函数move • 一个开始状态 s0S 状态集 字母表 转移函数 开始状态(初态)
• move(state, symbol) set of states
ε-closure(s) : s S
ε-closure of T : T S move(T,a)
状态s的ε闭包
状态集T的ε闭包
从状态s出发,仅通过ε边就能达到的状态集合
从状态集T中任一状态出发,仅通过ε边就能达到的状态集
: T S, a 转移函数
对于状态集T,在输入a时,可以到达的状态集(不考虑ε边)
DFA最小化(续)
思考题二
将(a|b)*abb(a|b)*转换成NFA,并将所得NFA确定 化,然后最小化所得DFA。
P92 练习3.5.1
P109 练习3.8.2
最小化一个DFA的状态数
最小化一个DFA的状态数
工作原理:将状态集分划成多个组,每个组中的各个状态相 互不可区分。然后,将每个组中的状态合并成一个状态。 1. Start with an initial partition Π with two groups, F and S - F. 2. Construct a new partition as follows: initially, let Πnew = Π; for ( each group G of Π ) { partition G into subgroups so that two states s and t are in the same subgroup if and only if for all input symbols a, states s and t have transitions on a to states in the same group of Π; replace G in Πnew by the set of all subgroups formed; }
由NFA构造DFA的子集构造算法
initially, ε-closure(s0) is the only state in Dstates, it is unmarked while ( there is an unmarked state T in Dstates ) { mark T; for ( each input symbol a ) { U = ε-closure(move(T,a)); if ( U is not in Dstates ) add U as an unmarked state to Dstates; Dtran[T, a] = U; } }
ε-closure(T)的计算(例)
ε-closure({0}):经过0条ε弧{0} 条ε弧{2,6,5} 经过3条ε弧{7}
经过1条ε弧{1,4} 经过4条ε弧Ø
经过2
ε-closure({0})={0,1,4,2,6,5,7}
move(ε-closure({0}),a)=move({0,1,4,2,6,5,7},a)={3,6} ε-closure(move(ε-closure({0}),a))= ε-closure({3,6})={3,6,7}
s = s0; c = nextchar( ); while ( c != eof ) { s = move(s, c); c = nextchar( ); } if ( s is in F ) return "yes"; else return "no";
接受(a|b)*abb的DFA
NFA状态集上的操作
NFA状态集上的操作(例)
ε-closure(1)={1,2,4}
ε-closure({1,2,3})={1,2,3,4,6}
move({2,4},a)={3}
ε-closure(T)的计算
push all states of T onto stack; initialize ε-closure(T) to T; while ( stack is not empty ) { pop t, the top element, off stack; for ( each state u with an edge from t to u labeled ε ) if ( u is not in ε-closure(T) ) { add u to ε-closure(T); push u onto stack } }
最小化一个DFA的状态数
3. If Πnew=Π, let Πfinal = Π and continue with step (4). Otherwise, repeat step (2) with Πnew in place of Π. 4. Construct the minimum-state DFA D' as follows: (a) Choose one state in each group of Πfinal as the representative. The representatives will be the states of D'. (b) The accepting states of D' are the representatives of those groups that contain an accepting state of D. (c) Let s be the representative of some group G of Πfinal, and let the transition of D from s on input a be to state t. Let r be the representative of t's group H. Then in D', there is a transition from s to r on input a.
自动机的等价:对于同一个语言,可以存在多个识 别此语言的DFA,这些DFA等价。
同构:如果仅需变换状态的名字就可以将一个DFA变成 另一个DFA,则这两个DFA同构。
两个状态的等价
同时是或不是接受状态 对任意的输入,总是转向同一状态或等价状态
任何正则语言都有唯一的状态数最少的DFA 从任意一个接受相同语言的DFA,通过合并等价状 态,可以得到状态数最少的DFA。
• 一个接受状态集合FS 终止状态集(终态)
NFA的两种表示
状态转换图:包括状态(圆圈)、弧、初态、终态 状态转换表:描述各个状态下,对于各个输入的状
态迁移 a a
0
1
b
2
b
3
a b ε
b
0 1 2 3
{0,1} Ø Ø Ø
{0} {2} {3} Ø
Ø Ø Ø Ø
自动机中输入字符串的接受
一个NFA接受(accept)输入字符串x, 当且仅当 状态转换图中存在一条从开始状态到某个接受 状态的路径,使得该路径上各条边的符号组成 符号串x。
由正则表达式构建NFA
正则式ε对应 NFA
正则式a, 对应NFA
由正则表达式构建NFA(II)
若s,t是正则式, N(s)和N(t)是对应的NFA,则s|t对 应之NFA为:
由正则表达式构建NFA(III)
若s, t为正则式,N(s)和N(t)是对应的NFA,则st对
应之NFA为:
例:
将a(a|b)*a转换成NFA,并将所得NFA确定化,然 后最小化所得DFA。
a(a|b)*a对应的NFA
将NFA转换成DFA
DFA状态 A B C D NFA状态 ε_closure(0)={0} ε_closure(1)={1,2,3,5,8} ε_closure({4,9})={2,3,4,5,7,8,9} ε_closure(6)={2,3,5,6,7,8} a B C C C b --D D D
DFA最小化
解:首先将DFA中状态划为终态组g1={C}和非终态组 g2={A,B,D}。 (1)g1中只有一个元素,无需继续划分。 g2中A没有定义输入b时的状态转换,而B,D在输入b时均转 向g2,故将g2继续划分成g3={A}, g4={B,D}。 (2)g3只有一个元素,无需继续划分。 g4中的状态在输入为a时,均转向g1,在输入为b时,均转 向g4。故无需划分。 本阶段状态分组无变化,故已经最小化,所得状态组为: g1={C}, g3={A}, g4={B,D}。合并状态B和D,得最小化后的 DFA如下:
由一个NFA定义(接受)的语言是其接受的 所有符号串的集合。
自动机中输入字符串的接受(例)
确定的有穷自动机(DFA)
NFA的一个特例
没有输入ε之上的转换动作 对每个状态s和每个输入符号a,有且仅有一条 标号为a的边离开。
DFA的运行
INPUT: An input string x terminated by an end-of-file character eof. A DFA D with start state s0, accepting states F, and transition function move. OUTPUT: Answer ''yes" if D accepts x; "no" otherwise.