编译原理第三章PPT
编译原理第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
编译原理第三章-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
11
例3.1 试构造产生标识符的文法。
I→L|LS S →T|ST T →L|D L →a|b|c|d…|z|A|B…|Z|_ D →0|1|…|9
12
例3.2 写一文法,使其语言是奇数集合,但不 允许出现以 0开头的奇数。
N →A|MA M →B|MD A →1|3|5|7|9 B →1|2|3|4|5|6|7|8|9 D →0|B
4
二、形式语言
? Chomsky于1956年提出了一种用来描述语言的数学系统。 人们把用一组数学符号 和规则来描述语言的方式称为 形式 描述,而把所用的数学符号和规则称为形式语言。
? 形式语言,只是从语法上研究语言。它是抽象的数学系统, 用于模拟程序设计语言的语法,或者是并不很成功地模拟 自然语言如英语的语法。
特定的含义。 语用—在各个记号所出现的行为中,它们的来
源、使用和影响。
3
什么是符号与字母表?
? 字母表:由若干元素(符 号、字母)所组成的有限 非空集合。常用大写英文 字母A,B… 或希腊字母Σ 表示。
? 符号:可以相互区别的记 号(元素)。
? 例如:
Σ = {0,1} V = {a, b,c…z} A={begin,if,real,end}
7
引例2
有如下规则: <标识符>→<字母> <标识符> → <标识符> <字母> <标识符> → <标识符> <数字> <字母> → A <字母> → B <字母> → C <数字> → 0 <数字> → 1
编译原理课件第3章有穷自动机
确定性有穷自动机 (DFA)
1
定义
DFA 是有穷自动机的一种,用于表示确定性状态自动机,它从一个状态转移到 另一个状态,每次只读入一个输入字符。
2
应用
在编译原理的词法分析中,DFA 可帮助语法分析器DFA 可以使用状态表或状态图来实现。
非确定性有穷自动机 (NFA)
定义
NFA 是有穷自动机的一种,其中一个状态可以 有多个后继状态,并且可以从一个状态转移到 多个状态。
应用
在词法分析中,NFA 可以解决正则表达式匹配 问题,同时也被用于编程语言中的语法分析。
有穷自动机的应用
词法分析
在编写编译器时,有穷自动机可以用来进行词法分析,从而将源程序转换成更易于处理和理 解的单词串。
计算理论
有穷自动机是计算理论中的重要概念,被广泛应用于机器学习、人工智能和计算机科学的许 多领域。
有穷自动机
编译原理课件第3章介绍有穷自动机,这是一种数学模型,用于描述自动的计 算过程。有穷自动机是编译原理中非常重要的概念。
有穷自动机概述
1 定义
有限状态机,又称有穷状态自动机。它是一个表示有限个特定状态及在这些状态之间的 转移和动作等行为的数学模型。
2 应用
有穷自动机在计算机科学中很有用,例如编写正则表达式、词法分析和语法分析。
状态图
有穷自动机可以使用状态图来表示,通常包括起始状态、接受状态、状态转移和输入字母表。
有穷自动机的分类
有限状态自动机
这是大多数情况下使用的模型,用于表示有穷状 态自动机,由确定性自动机和非确定性自动机两 种类型。
无限状态自动机
用于表示无限状态自动机,由部分确定性自动机 和无限确定性自动机两种类型。
有穷自动机的定义
编译原理陈火旺版第三章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 正规式与正规集
递归定义:
⑴ε和都是∑上的正规式,其所表示的正规集
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
由a和b组成,且不含子序列abb的串: b*a*b?a* 由a和b组成,且不含子串abb的串 b* (a|ba)*b?
一些记号的模式
记号 模式
if then else relop id num
if then else < | <= | > | >= | = | < > letter ( letter | digit )* digit+(.digit+)?(E(+|–)?digit+)?
词法分析
词法分析器的位置
token 源程序 词法分析器 get next token 符号表 语法分析器
词法分析器的功能
读入源程序
去除注释、空格、制表符、换行符等 建立符号表 识别词素,抽象成记号 将记号插入符号表
发现词法错误
将记号提交给语法分析器
单独划分词法分析阶段的原因
出现了当前语言中不会出现的字符,如@ or #.
整数越界 (有些语言限制为 0 to 32767). 标识符名太长(有些语言最大长度为32个字符). 字符串太长(有些语言最大长度为256个字符). 字符串跨行.
双缓冲双指针策略
采用大块存储空间作为缓存
一次将大批数据读入缓存 采用双缓冲
r? = r | ε
[range] : 字符的范围
A | B | C | … | Z = [ABC…Z] = [A-Z]
id [A-Za-ห้องสมุดไป่ตู้][A-Za-z0-9]*
正则表达式例子
以 “tab” 开始,或以 “bat”结束的小写字母 串: tab(a|b|…|z)* | (a|b|…|z)* bat tab[a-z]* | [a-z]*bat 福大邮箱地址
作业2
1、P78 练习3.3.3
2、P79 练习3.3.5 (1)-(3) 3、设有文法G: S aSb | bSa | abS | baS | Sab | Sba | ε (1)证明文法G是二义性文法
(2)文法G识别的语言是什么?
(3)将文法G改写成无二义性的文法G',使得 L(G)=L(G')
(r)(s)是正则式,表示语言 L(r) L(s)
(r)*是正则式,表示语言 (L(r))* 以上运算均左结合,优先级从高到低为:*, 连接,|
正则表达式与语言(例)
由正则式生成的串的集合称为语言。语言中串的 数量可能有限,也可能无限,这些串就是词法分 析时的词素。
正则式 a a|b {a} {a,b} 语言
M = {1, 2, 3}
L2 = { AA, AB, AC, AD, BA, BB, BC, BD, CA, … DD}
L* = { All possible strings of L plus ε } L+ = L* - {ε}
L (L M ) = ??
L (L M )* = ??
正则表达式与语言(正则集)
记号、模式、词素
记号(词法单元、单词) Token
具有独立含义的最小语法单位,每个记号代表一类符号串
例: <identifier>, <number>
模式 Pattern
描述某个记号的词素集合的构造规则
词素 Lexeme
源程序的符号序列,可匹配某个记号的模式 标识符: x, count, name, etc…
子序列由该串任意字符组合确定,共有
0 1 2 10 C10 C10 C10 C10 210 1024
语言上的运算
例子
已知:L = {A, B, C, D }
L M = {A, B, C, D, 1, 2, 3 } LM = {A1, A2, A3, B1, B2, B3, C1, C2, C3, D1, D2, D3}
简化编译器的设计
提高编译器的效率
增强编译器的可移植性
词法分析器的三种构造策略
使用词法分析器生成器,从基于正规式的说 明自动产生 使用传统的程序设计语言手工编写 使用汇编语言手工编写
词法错误
局部化
例: whil ( x = 0 ) do 并不产生词法错误
当前输入的前缀无法匹配任何记号时报词法错误,如:
定义于{a,b}之上的,含有三个“b”的串。
(a|b)*a(a|b)(a|b)
定义在{a,b}之上的,倒数第三个字母为“a”的串。
((ε|a)b*)*
定义于{a,b}之上的任意串。
正则表达式的扩展
“+” : 1个或多个
r* = r+ | ε 并且 r+ = r r*
“?” : 0或1个
正则表达式(又名正则式、正规表达式、正规 式):基于字母表构造串的一组规则(模板、 模式)
基于同一个字母表,可以通过不同的正则式来定 义不同的语言
如果r是正则式, 则:L(r)是r描述的语言(又 名正规集、正则集)
正则表达式及其语言
正则式定义在字母表上:
ε是正则式,L(ε)={ε} 若a属于, 则a是正则式,L(a)={a} 若r和s为正则式,且L(r)和L(s)为对应语言. 则 (r)是正则式,表示语言 L(r) (r) | (s) 是正则式,表示语言 L(r) L(s)
ab (a|b)(a|b) a*
(a|b)*
{ab} {aa,ab,ba,bb}
{ε,a,aa,…,任意个a的串} {ε,a,b,aa,ab,ba,bb,…所有a,b组成的串}
描述以下正则式表示的语言:
a(a|b)*a
定义于{a,b}之上的,以a开头和结尾的,长度不少 于2的串。
a*ba*ba*ba*
ε:空串, |ε| = 0
串的各部分(术语)
串S :banana
前缀Prefix:从尾部删除0或多个符号得到的串。ban, banana, ε
后缀Suffix:从首部删除0或多个符号得到的串。ana, banana, ε
子串Substring:删除某个前缀和某个后缀后得到的串。 nan, ban,
ana, banana, ε
子序列Subsequence:删除0或多个符号所得的串。bnan, nn, ε 真前缀:不等于原串,也不为ε的前缀
真后缀、真子串:与上类似
试说明字符串abcdefghij,分别有多少个前缀、后缀、真前 缀、子串和子序列。 解:串abcdefghij长度为10,分别从其尾部删除0,1,2,…10个符 号,得不同前缀,故前缀数为11。 类似地,可知后缀数为11。 在前缀中去除长度为0和10两种情形,得真前缀,故真前缀 数为11-2=9。 当子串不为空串时,子串由其串首和串尾符号的组合确定, 2 子串长度大于等于2时,有 C10 45种,子串长度等于1时 1 10 种,加上空串,共有56个子串。 ,有C10
• 在一个缓冲 I/O • 另一缓冲词法分析
当第一块完成后, 可继续读第二块
Block 1
Block 2
双缓冲双指针策略
switch ( *forward++ ) { case eof: if (forward is at end of first buffer ) { reload second buffer; forward = beginning of second buffer; } else if (forward is at end of second buffer ) { reload first buffer; forward = beginning of first buffer; } else /* eof within a buffer marks the end of input */ terminate lexical analysis; break; cases for the other characters: ...... }
记号的例子
对模式的非形式化描述,不利于记号的自动识别
字母表和串
字母表:符号的有穷集合
例:{0,1}, or {a,b,c}, or {n,m, … , z}
串:基于给定字母表的有穷符号序列
例:0011 or abbca or AABBC …
串的长度:如果S是一个串,则|S|指S的长 度(S中的符号数)