编译原理第三章素材
编译原理第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章
NFA到相应的DFA的构造的基本思路是: DFA的每 一个状态对应NFA的一组状态. DFA使用它的状 态去记录在NFA读入一个输入符号后可能达到的 所有状态.
NFA M所能接受的符号串的全体记为L(M)
结论:
上一个符号串集V是正规的,当且仅当存 在一个上的不确定的有穷自动机M,使得 V=L(M)。
DFA是NFA的特例.对每个NFA N一定存在一个DFA M,使得 L(M)=L(N)。对每个NFA N存在着与之 等价的DFA M。 有一种算法,将NFA转换成接受同样语言的DFA.这 种算法称为子集法. 与某一NFA等价的DFA不唯一.
0
1
S P
Z
{P} {}
{P}
{S,Z} {Z}
{P}
• δ为S * 到S的子集(2 S)的一种映射
• 从NFA的矩阵表示中可以看出,表项通常是一状态的集合, 而在DFA的矩阵表示中,表项是一个状态
∑*上的符号串t被NFA M接受:
• 对于Σ*中的任何一个串t,若存在一条从某一初态 结点到某一终态结点的道路,且这条道路上所有 弧的标记字依序连接成的串(不理采那些标记为ε 的弧)等于t,则称t可为NFA M所识别(读出或接 受)。 • 若M的某些结点既是初态结点又是终态结点;或 者存在一条从某个初态结点到某个终态结点的道 路,其上所有弧的标记均为ε,那么空字ε可为M所 接受。
其中: δ(S,0)={P}
δ(S,1)={S,Z} δ(Z,0)={P} δ(Z,1)={P} δ(P,1)={Z} • 状态图表示
1 1 S 0 0,1 Z
P
1
• 矩阵表示
状态 输入
δ(S,0)={P} δ(S,1)={S,Z} δ(Z,0)={P} δ(Z,1)={P} δ(P,1)={Z}
编译原理_第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 单词的描述⼯具程序设计语⾔中的单词是基本语法成分.单词符号的语法可以⽤有效的⼯具加以描述,并且基于这类描述⼯具,实现词法分析程序的⾃动构造.描述⼯具:正规⽂法和正规式识别⼯具:有穷⾃动机⼀.正规⽂法多数程序设计语⾔的单词的语法能⽤正规⽂法来描述。
编译原理_chapter3概要
3.1.5 词法分析器的位置
符 号 表 源程序 词法分析器 语法分析器 语义分析与 代码生成 目标程序
目标代码整理 图3.1 以语法分析器为中心
以语法分析器为中心的优点:
简化编译器的设计。 提高编译器的效率。 增强编译器的可移植性。
16
2018/11/26
设计成一个独立程序,完成词法分析的 任务,结果以文件的形式组织,做为语 法分析的输入
单词名称 标识符 无符号常数(整) 无符号浮点数 布尔常数 字符串常数 FOR DO IF ELSE THEN INT CHAR FLOAT WHILE
2018/11/26
类别编码 单词值 1 内部字符串 标识符常数 : 2 整数值 一类一码 数值 3 4 0 或 1 5 内部字符串 6 7 8 9 关键字: 10 一字一码 11 12 13 14 7 …… ……
符号表
源程序
词法 分析
TOKEN字
错误信息
图3.2 设计成独立的程序
17
3.2 词法分析阶段的设计与实现
区别?
2018/11/26
8
例3.1 语句if count>7 then result := 100; 的单词符号序列
(9,0) (1,指向count 的符号表入口) (30,0) (11,7) (10,0) (1,指向result的符号表入口) (24,0) (11,100) (29,0)
2018/11/26
School of Computer Science & Technology Harbin Institute of Technology
第三章 词法分析
重点:词法分析器的输入、输出, 用于识别符号的状态转移图的构造 难点:根据状态转移图实现词法分析器的设计
编译原理课件第3章
代码优化
代码优化的目的和分类
目的
提高程序运行效率,减少空间占用,提高可读 性。
局部优化
对单个程序块的优化,如基本块的优化。
全局优化
对整个程序的优化,如循环优化、死代码删除等。
代码优化的主要技术
常量折叠和替换
将常量表达式的结果在编译时计算出来,并 用结果替换掉表达式。
循环优化
编译原理课件第3章
contents
目录
• 词法分析 • 语法分析 • 中间代码生成 • 代码优化 • 目标代码生成
01
CATALOGUE
词法分析
词法分析器的任务
将源程序分解成一系列的记号(tokens) 去除源程序中的注释和空白符
识别出关键字、标识符、常量、操作符等记号 为语法分析器提供有序的记号流
通过改变循环的迭代顺序、减少循环中的计 算等方法来提高循环的效率。
死代码删除
删除永远不会被执行到的代码。
函数内联
将小的函数调用替换为函数体的直接执行, 以减少函数调用的开销。
代码优化的实现
编译器前端
负责将源代码转换成中间表示(IR),这一阶段主要 完成语义分析和语法分析。
编译器中端
对中间表示进行优化,如常量折叠、死代码删除等。
考虑文法的二义性
有些文法具有二义性,即一种语法结构可以有多种解析方 式。在设计语法分析器时需要考虑如何处理二义性问题, 避免产生错误的分析结果。
语法分析器的实现
编写词法分析器
词法分析器是将输入的字符串转 换成一个个的单词或符号,供语 法分析器使用。在实现语法分析 器之前,需要先编写词法分析器 。
实现递归下降分析
解析与语义分析
编译原理_3_3
<间接宾语> <代词>
<直接宾语> <冠词> <名词>
<代词> He
<代词> me
<名词> book
<冠词> a
<动词> gave
文法
1. <句子> <主语><谓语><间接宾语><直接宾语>
2. <主语> <代词>
3. <谓语> <动词>
He <动词> <间接宾语><直接宾语>
He gave <间接宾语><直接宾语>
He gave <代词> <直接宾语>
He gave me <直接宾语>
He gave me <冠词><名词>
He gave me a <名词>
He gave me a book
编译原理
高级程序设计语言的语法描述
编译原理
第3讲 高级程序设计语言的语法描述
编译原理
高级程序设计语言的语法描述
——文法
高级语言及其语法描述
程序语言的定义
特
性
描
述
高级语言的一般
程序语言的语法
文法
文法: 描述语言的语法结构的形式规则
He gave me a book.
<句子> <主语><谓语><间接宾语><直接宾语>
编译原理_第3章(清华大学)
文法:是语言语法的描述工具,实现用 有穷的规则把语言的无穷句子集描述出 来。
例:“我是大学生”是汉语的一个句子 用EBNF来表示汉语句子的构成规则: 〈句子〉∷=〈主语〉〈谓语〉 〈主语〉∷=〈代词〉|〈名词〉 〈代词〉∷= 我|你|他 〈名词〉∷= 王明|大学生|工人|英语 〈谓语〉∷=〈动词〉〈直接宾语〉 〈动词〉∷= 是|学习 〈直接宾语〉∷=〈代词〉|〈名词〉
第三章
文法和语言
学习目标: 掌握:自上而下与自下而上的分析方法 理解:文法的形式定义,推导,归约,句 型,句子,语言,上下文无关文法,规范 句型,语法树,短语,直接短语,句柄 了解:文法的类型,文法使用中的限制, 文法的二义性
3.1 3.2 3.3 3.4 3.5 3.6 3.7
语言和文法的直观概念 符号和符号串 文法和语言的形式定义 文法的类型 上下文无关文法及其语法树 句型的分析 有关文法实用中的一些说明
文法类别产生式形式产生的语言说明0型文法短语文法v且至少含一个非终结符v0型语言对产生式基本无限制1型文法上下文有关文法1或avavnv1型语言上下文有关语言将a替换成时必须考虑a的上下文2型文法上下文无关文法aavnv2型语言上下文无关语言无需考虑a在上下文中的出现情况3型文法正规文法aab或aaabvnavt3型语言正规语言产生式全部是规定的形式四种文法之间的逐级包含关系2型文法1型文法3型文法0型文法35上下文无关文法及其语法树1
3.3 文法和语言的形式定义
1.文法的定义 2.文法的简化表示法 3.推导与归约 4.句型、句子、语言的定义 5.文法的等价
பைடு நூலகம்
1.文法的定义
产生式(规则) 产生式是一个有序对(α,β),通常写作 α→β(或α::=β ) 文法定义: 文法G(Grammar)定义为四元组(VN,VT,P,S) VN (Nonternimal):非终结符集 VT (Terminal):终结符集 P (Production): 产生式(规则)集合 S: 开始符号或识别符号
编译原理第三章
例如:Σ={a,b} Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…} + ={a,b,aa,ab,ba,bb,aaa,aab,…}
13
语言
语言:字母表上的一个语言是上的一些符号 串的集合 (上的每个语言是*的一个子集)。 例如: Σ={a,b} Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…} 语言1:集合{ab,aabb,aaabbb,…,anbn,…}或 {w|w∈Σ*且w=anbn,n≥1}为字母表上的一 个语言。 语言2:集合{a,aa,aaa,…}或{w|w∈Σ*且 w=an,n≥1} 为字母表上的一个语言。 语言3:ε是一个语言。 语言4:即 是一个语言。 14
20
文法的定义
文法G定义为四元组(VN,VT,P,S)
VN :非终结符集 VT :终结符集 P:产生式(规则)集合 S:开始符号, S∈VN,S必须要在一条规则 的左部出现。 VN∩VT= φ 。 V=VN∪VT,称为文法G的文法符号集合
21
文法示例1
例3.1 文法G=(VN,VT,P,S) VN = { A }, VT ={ 0, 1 } P={ A→0A1, A→01 } A为文法G的开始符号 习惯上只将产生式写出。并有如下约定: 第一条产生式的左部是开始符号 用尖括号括起的是非终结符,否则为终结符。或 者大写字母表示非终结符,小写字母表示终结符 G可写成G[S],S是开始符号 例: G: A→0A1 或 G[A]: A→0A1 A→01 A→01
4
预备知识 -----文法的直观概念
<句子>::=<主语><谓语> <主语>::=<代词>|<名词> <代词>::=我|你|他 <名词>::=王明|大学生|工人|英语 <谓语>::=<动词><直接宾语> <动词>::=是|学习 <直接宾语>::=<代词>|<名词>
编译原理 - 陈火旺版 - 第三章
f(V,a)=U f(V,b)=Q f(Q,a)=Q f(Q,b)=Q
S U V Q
a U Q U Q
b V V Q Q
21
确定有限自动机(DFA)
• 状态转换图
f(S,a)=U f(V,a)=U
f(V,b)=Q f(Q,a)=Q f(Q,b)=Q U b b a a a,b S Q b
3
3.1 词法分析器的要求
• 输入:源程序 • 输出:单词符号
– 单词是语言中具有独立意义的最小单位 – 分类
• 基本字:具有固定意义的标识符,
– 如Pascal中, begin, end
• 标识符:变量名、数组名、过程名等 • 常数:分为整型、实型、布尔型等
– 如 100, 0.8, TRUE
• 运算符:+、-、*、/等 • 界符:逗号,分号,括号等
24
非确定有限自动机(NFA)
• NFA: Nondeterministic Finite Automata • 定义:NFA M=S,,δ,S0,F,其中S为状态 的有限集, 为有穷字母表,δ为S * 到 S的子集(2 S)的映射,S0S是初始状态 集,F S为终止状态集。
25
NFA vs. DFA
一个确定有限状态自动机 DFA 是一个五元组 M = (S, ,δ,S0, F ).
有限状态集
有限输入符号集
转移函数 一个开始状态
δ : S S
S0 S FS
26
一个终态集合
NFA vs. DFA
一个非确定有限状态自动机 NFA 是一个五元组 M = (S, ,δ,S0, F ).
22
f(S,b)=V f(U,a)=Q f(U,b)=V a
编译原理第三章-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)*
编译原理编译第三章
④Ada 的循环结构 loop /*可以在loop前加重复说明*/
循环体(语句序列)
end loop; 重复说明可以是:
while <条件> 或 for <计数变量> in <离散范围> 或 for <计数变量> in reverse <离散范围>
可由exit或exit when<条件>终止循环
整理课件
⑤Dijkstra的卫哨命令表示法 do B1→S1 B2→S2
...... BN→SN od
整理课件
四. 语句级控制结构讨论
顺序、选择、重复是一定意义的抽象 关于goto语句的讨论 控制结构的选择
五. 用户定义控制结构
如:Pascal的计数控制变量可以是ducer
repeat 生产一个元素; 存放这个元素到缓冲区;
forever
单元consumer
repeat 从缓冲区移出一项; 对该项执行某个运算;
forever
整理课件
2. 几个基本概念
①并发单元的特点:诸程序单元并行活动 ②同步问题 正确访问缓冲区:不会向已满的缓冲区写数据, 不会从空缓冲区读数据
signals (zero(int),overflow,had_format(string)) ③异常处理程序静态绑定于调用者
<语句> except<处理程序表>end 其中,<处理程序表>的形式是
when <异常表1>: <语句1>
…… when<异常表n>: <语句n>
整理课件
3. Ada的异常处理
p(i):-new player(i, cards) end; for i:=1 step 1 until 3 do
《编译原理》第3章 词法分析与有穷自动机PPT课件
教学内容
3.1 词法分析的任务 3.2 词法分析程序的输出形式 3.3 词法分析程序的设计与实现 3.4 正规式与有穷自动机 3.5 词法分析程序的自动生成工具LEX 3.6 PL/0编译程序的词法分析
G[D]: D→ int L | float L L→ L, id | id
3.4.3 有穷自动机
状态图的形式化描述
读字符
字母、数字
查保留字表
S 字母 1
非字母数字
标识符
数字
数字 2
非数字
无符号整数
+*, 3 ()
其他字符 非=
<4 =
5 其他字符 出口
其他
出错
返回S
单界符 双界符
• 有穷自动机是一种数学模型,具有离散的输入与输出, 系统可处于有穷状态中的任何一个
单词类别
编码
关键字
1
标识符
2
常数
3
运算符
4
分界符
5
3.3 词法分析程序的设计与实现
词法规则
状态图
词法分析程序
3.3.1 正规文法及其状态图
1.状态图:为识别单词而专门设计的有向图, 是设计词法分析程序的一种好途径。
结点代表状态,用圆圈表示,为非终结符
有向弧表示状态转移
弧上的标记表示在射出弧的结点状态下可能出现的输入字
DFA M所接受的语言为:L(M)={α|f(S, α)=Sn, Sn ∈Z}
DFA M所能接受的符号串的全体记为L(M)
DFA的状态图表示:
a1 a
编译原理(王晓斌)编译第三章课件
中间代码的形式
常见的中间代码形式包括三地址 代码、抽象语法树(Abstract Syntax Tree, AST)等。
三地址代码的生成
三地址代码的特点
三地址代码具有高度的局部性,便于 后续的优化和目标代码生成。
三地址代码的生成方法
常见的三地址代码生成方法包括递归 下降分析、预测分析等。
表达式的优化
数据流分析分类
根据数据流分析的侧重点不 同,可以分为值依赖分析、 活性变量分析、路径分析等
。
数据流分析应用
数据流分析在编译器优化中 主要用于确定变量的值在程 序执行过程中的变化情况, 从而帮助编译器进行更好的 优化。
控制流分析
控制流分析定义
01
控制流分析是一种静态程序分析技术,通过分析程序
中控制流的转移情况,来发现程序中的潜在问题。
分析器根据当前字符和当前状态,查找到对应的规则
,然后根据规则转换到新的状态和生成记号。
03
分析器会持续读取字符并重复上述过程,直到处理完
整个源代码。
词法分析的实现
01
词法分析器通常使用正则表达式或有限自动机来实 现。
02
正则表达式用于描述记号的模式,有限自动机用于 实现状态转换和记号生成。
03
分析器可以手动编写代码实现,也可以使用工具生 成。
词法分析概述
词法分析是编译过程的第一阶段,负责将源代码分解成一系列的记号( tokens)。
记号是源代码中的最小语法单位,例如关键字、标识符、常量、运算符等 。
词法分析器也称为扫描器或词法器,其任务是识别和生成记号序列。
词法分析过程
01
词法分析器从源代码的第一个字符开始读取,直到源
代码结束。
陈火旺 编译原理 chapter3
标识符的识别:后跟算符或界符; 常数的识别:算术常数、布尔常数、字符串; 算符和界符的识别:对于复合运算符,超前搜索; 了解某个源语言的词法规则就可以为它设计一 个词法分析器了。设计词法分析器的一种非常好的 工具就是状态转换图。
P13
©张 捷
三、状态转换图-设计词法分析器的好工具(好途径) 1.转换图是一张有限方向图 结点 代表状态,用圆圈表示 箭弧 状态之间的连接,箭弧上的标记(字符)代表 在射出结点状态下可能出现的输入字符或字符 类。 初态 识别出某一类字符串的开始,初态只有一个 终态 识别出某一单词,至少有一个。用双圈表示
0 数字
●
6
1 ○
数字
●
○
2 E或D
○
数字 + 或— 3 — 4 数字 其它
○
5 其它 ○
7
*
6 (d) 数字 其它 ○ 识别FORTRAN实型常数的转换图
P16
* 终态结点上打个星号意味着多读进了一个不属于标识符部分的字符 应该退还给输入串 ©张 捷 大多数程序语言的单词符号可用转换图予以识别
DIM IF DO
种别编码
1 2 3
助忆符
$DIM $IF $DO
内码值
-
STOP
END 标识符 常数(整) = + * ** , ( )
P21
4
5 6 7 8 9 10 11 12 13 14
$STOP
$END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR
P6
©张 捷
6
3.1.2 词法分析器作为一个独立子程序 在实现编译程序时,常将词法分析程序从语法 分析中独立出来,作为一个独立的阶段。这样做 有什么好处? 可使编译程序结构更简洁,清晰和条理化 可用更有效的特殊方法和工具进行处理/ 改进编 译程序的效率 有利于集中力量考虑其他枝节问题/增强编译程序 的可移植性 但不一定是独立的一遍(如果独立一遍则要保存源
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2018/10/13
TJNU-COCIE-WJW
22
2. 直接分析法(续2) 分析流程图
下一个语句 否 字符是否读来 是 读 一 个 符 号
该字符是什么
字母 子 程 序 1
·
子 程 序 2
数字 子 程 序 3
*
子 程 序 4 出口
其他 子 程 序 5
2018/10/13
TJNU-COCIE-WJW
2018/10/13 TJNU-COCIE-WJW 11
三、例子
例1:FORTRAN编译程序的词法分析器,在扫描输 入串: IF (5. EQ .M) GOTO 100 输出的单词如下:
单词符号 IF 左括号 整常数 等号 标识符 右括号 GOTO 标号
2018/10/13
2018/10/13 TJNU-COCIE-WJW 4
2.单词的种类 (1)基本字(保留字,关键字) 由程序语言定义的具有固定意义的标识符。 用户不能用来表示变量名,函数名等标识符 例:C语言中的“if” “else” “while” … (2)标识符 用户使用的,用来表示各种名字,变量名,函数 名等
0
Y
2
注意:一个完整的状态转换图有n个状态,其中有 一个初态,至少要有一个终态(用双圆圈表示)
2018/10/13 TJNU-COCIE-WJW 25
3. 状态转换图法(续2) (4)举例 例1:构造一个识别标识符的状态转换图 解:
字母或数字 0 字母 1 其他 2
*
其中“*”表示在该状态下多读进一个字符 识别:name1
2018/10/13
TJNU-COCIE-WJW
29
1、SL的单词符号及其内部表示(P42)
单词符号 DIM IF DO STOP END 标识符 常数(整型) = + * ** , ( )
2018/10/13
种别编码 1 2 3 4 5 6 7 8 9 10 11 12 13 14
助记符号 $DIM $IF $DO $STOP $END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR
词法分析器输出的单词符号常常用二元式来表示:
<单词种别,单词符号的属性值>
2018/10/13
TJNU-COCIE-WJW
7
1. 单词种别 通常用整数编码来表示 (1)关键字,运算符,界符 一字一种编码(处理起来比较方便) 例:if,else,‘(’,‘+’,… (2)常数 按类型分别给出编码 例:整型,实型,布尔型,… (3)标识符 统归一种,只给一个编码 例:变量名,函数名等都是一种编码
23
3. 状态转换图法 (1)状态转换图:一张有限方向图 (2)状态转换图的功能 识别(接受)一定的符号串(单词)
2018/10/13
TJNU-COCIE-WJW
24
3. 状态转换图法(续1) (3)状态转换图的结构 ①结点:代表状态,用圆圈表示 ②箭弧:状态之间用箭弧连接 ③箭弧上的标记:代表在射出节点下可能出现的 字符或字符串 X 1 例:
2018/10/13 TJNU-COCIE-WJW 19
1. 超前搜索法(续2) (4) 算符和界符的识别 应将那些由多个字符复合成的算符和界符拼成一个 单词符号 例:++ ->=
2018/10/13
TJNU-COCIE-WJW
20
2. 直接分析法 (1)基本思想 根据读来的第一个字符的种类分别转到各种 子程序处理。这些子程序功能就是识别以相 应字符开头的各种单词。 (2)方法 以FORTRAN语言为例,分成几种情况 ①以字母开头的 基本字、标识符、格式说明符,… IF WHILE
2018/10/13 TJNU-COCIE-WJW 13
3.2 词法分析器的设计
一、词法分析器的结构
源程序
输入
预处理 子程序
输入 缓冲区
列表
扫描缓冲区 扫描器
单词符号
2018/10/13 14
TJNU-COCIE-WJW
1. 输入缓冲区、预处理子程序 (1)输入源程序文本,放入输入缓冲区中,词 法分析工作可在这个输入缓冲区中工作 (2)剔除无用的空白,跳格(TAB),回车,换 行等编辑性字符;若空白符号为单词符号的界 符,就将若干空白和并为1个 (3)剔除注释行,比如/*…*/ (4)如果是FORTRAN语言,区分标号区、续 行区和给出句末符 (5)源程序的出错列表打印 (6)将预处理好的子程序放到扫描缓冲区中
2018/10/13 TJNU-COCIE-WJW 21
2. 直接分析法(续1) ②以小数点开头的 .34 .EQ. .TRUE. .FALSE. 等 ③以数字开头的 常数、格式语句、重复说明 WRITE(6,10) X,Y 10 FORMAT(2X, F10.4, F9.3) ④以*开头的:* ** ⑤除此之外:都是一个基本字符表示一个单词
2018/10/13
TJNU-COCIE-WJW
5
2.单词的种类(续) (3)常数 整型、实型、逻辑、字符… 例:1000,3.14,TRUE,“Abcd” (4)运算符 +、-、*、/ … (5)界符 , ; { } ()…
2018/10/13 TJNU-COCIE-WJW 6
二、单词的表示形式
内码值 内部字符串 标准二进制 30
TJNU-COCIE-WJW
2.为了讨论方便,对SL加三点限制 (1)所有基本字都规定为保留字(用户不能 用它们来定义标识符的,避免超前搜索 ) (2)对基本字只构造一个基本字表,不构造 其状态转换图(只要识别出是一个标识符, 就去查基本字表看看是否是基本字)
(3)对基本字,标识符和常数之间要留有间 隔符(避免超前搜索)
经词法分析器处理后,将被转换成如下单词符号序列: 单词符号 <单词种别编码,单词符号的属性值> while < while,- > ( < ( ,- > i < id,指向i的符号表项的指针> >= < >= ,- > j < id,指向j的符号表项的指针> ) < ), - > i < id,指向i的符号表项的指针> -< --,- > ; <;,->
2018/10/13 TJNU-COCIE-WJW 8
1. 单词种别(续) 注意: (1)若一个种别只包含一个单词符号(一种一字), 对于该单词符号,种别编码就可以代表它自身了。 例如:关键字,运算符,界符 (2)若一个种别包含有多个单词符号(一种多字), 对于该种别的每个单词符号,除了给出种别编码, 还需给出单词符号的属性值 例如:整型常数,实型常数,布尔常数,标识符
2018/10/13 TJNU-COCIE-WJW 15
2.扫描缓冲区、扫描器 (1)扫描缓冲区 设两个半区,可互补使用
前半区
起点指针
设两个指针
后半区
搜索指针
起点指针:指出正在识别单词起点位置 搜索指针:向前搜索以寻找单词终点
(2)扫描器:扫描缓冲区,直接进行单词的识别
2018/10/13 TJNU-COCIE-WJW 16
END
超前扫描很多字符,直到扫描到可以肯定词性的 地方为止
2018/10/13 TJNU-COCIE-WJW 18
1. 超前搜索法(续1) (2) 标识符的识别 一般是以字母开头后跟数字/字母的字符串,后边 一般都有算符和界符,比较好识别 (3)常数的识别 例:对于FORTRAN 5.EQ.M (5==M) 5.E08 (5*108) 直到超前扫描到字母Q时才能确定5的词性 3HABC (“ABC”) 3H是词头,代表长度为3的字符串常数
2018/10/13
TJNU-COCIE-WJW
9
2.单词符号的属性信息 单词符号的属性:指单词符号的特性或特征
单词符号的属性值:反映单词特性或特征的值
2018/10/13
TJNU-COCIE-WJW
10
2.单词符号的属性信息(续) 属性值的表示方法: (1)基本字,运算符,界符(一字一种) 只给其种别编码,不给出它的属性值 例:基本字while表示成: <$WHILE, - > (2)常数 表示成标准的二进制形式 例:1024表示成:<$CONST, 1024的二进制表示> (3)标识符 用字符串编码或对应的符号表项地址 例:name表示成:<$ID,“name”> 或<$ID, 指向name的符号表项的指针>
2018/10/13 TJNU-COCIE-WJW 26
3. 状态转换图法(续3) 例2:构造一个识别整数的状态转换图,说说识 别256过程 解:
数字 1
0
数字
非数字
2
*
2018/10/13
TJNU-COCIE-WJW
27
3. 状态转换图法(续4) 例3: 识别FORTRAN实型常数的状态转换图 解: E|D
<单词种别编码,单词符号的属性值> <34,- > <2 ,- > <20,5的二进制表示> <6 ,- > <26,‘M’ > <16,- > <40,- > <19,‘100’二进制表示>
TJNU-COCIE-WJW 12
例2:考虑下面C++的一段代码: while ( i >= j) i--;
32
4. 状态转换图的程序实现 思路:为每个状态结点都编写一个子程序 首先,设以下一些变量或过程 ch:字符变量,存放最新读进的源程序字符 strToken:字符数组,存放构成单词符号的字符串 GetChar:子程序过程,将下一输入字符读到ch中,搜索指 示器前移一字符位置 GetBC:子程序过程,检查ch中的字符是否为空白,若是, 则调用GetChar直至ch中进入一个非空白字符 Concat:子程序过程,将ch中的字符连接到strToken之 后.例如,假定strToken原来的值为“AB”,而ch中存放 着‘C’,经调用Concat后,strToken的值就变为“ABC”