《编译原理及实践教程》第3章词法分析
编译原理与实现03第3章 词法分析

利用状态图识别句子的方法是一种自底向上的分析方法。开始时,处于开 始状态,此时句柄是随后扫描的字符,即输入串的的第一个符号,所要归 约的符号就是从开始状态经过标记有句柄符号的弧到达的下一个状态的名 字。以后每一步(除第一步外)的句柄是当前状态的名字和随后扫描的字 符,而句柄所要归约的符号就是下一个状态的名字。
3.3.2 状态图的用法
例3.2,对句子0110进行的分析。 解:根据上面介绍的状态图使用方法,我们在图3.5(a)列出分析的每一步。 由于这些规则很简单,所以分析也非常简单。首先,在开始状态S下扫描的第 一个符号是0,转到状态V,表示0是句柄,归约到V。接下来,在状态V扫描1, 转到状态Z,此时句柄为V1,归约成Z。再往下扫描1,由状态Z转到状态U,表 示句柄为Z1归约为U。最后,扫描0,转到状态Z,此时句柄为U0,归约为Z, 从而形成图3.5(b)所示的语法树。 步骤 1 2 状态 S V 扫描的字符 0 1 余留部分 110 10
3.3.2 状态图的用法
状态图画好后,就可以利用状态图来分析和识别字符串,其方法如下: 1.首先设置初始状态S为当前状态。从输入串的最左字符开始重复步骤2,直 到到达输入串的右端为止。 2.扫描输入串的下一个字符,在当前状态所射出的弧中,找出标记有该字符 的弧,并沿此弧前进,过渡到下一个状态。如果找不到标记有该字符的弧, 则说明输入串不是合法的句子,分析过程失败结束;如果我们扫描输入串 的最后一个字符,并从当前状态出发沿着标记有该字符的弧到达终结状态, 则表示输入串是该文法的合法句子,识别过程成功结束;如果扫描输入串 的最后一个符号后到达的状态不是状态图的终结状态,则表示输入串不是 该文法的合法句子,识别过程失败结束。
3.3 正则文法及状态图
程序设计语言的单词符号可用3型文法来描述,3型文法也称为正 则文法。对于正则文法所描述的语言可以用一种有穷自动机来识 别。我们的目的是实现词法分析程序,所以为了简化问题,我们 直接介绍这种自动机的非形式表示,即状态图。
《编译原理》教学课件 第3章-词法分析

单词的定义 • 正则表达式的局限性。
正则表达式
• 基本概念: • 字母表:非空有限集,,其元素称为符号或字母. • 符号串:符号的有限序列,也称为‘字’。或表示
空串 空串集{}不同于空集 。
• 符号串长度:符号串中字符的个数.|| • 符号串连接:和都是符号串,则为符号串的连接
非确定有限自动机NFA
• 定义1:一个非确定有限自动机(NFA)A是 一个五元组A=(,SS,S0,f,TS).其中
• 是字母表
• SS是状态集
• S0是初始状态集 • f是转换函数,但不要求是单值的
•
f: SS (∪{}) 2SS
• TS是终止状态集
非确定有限自动机NFA
• 定义2:设A是一个NFA,A= (,SS,S0,f,TS) • 则定义L(A)为从任意初始状态到任意终止状
❖ 空格符和制表符以及换行符的处理 1.无用的空格符和制表符要删掉; 2.字符串内的空格不能删; 3.换行符不能删。用于错误定位
❖ 复合型特殊符,如“:=”的处理 读到“:”时不能判断是否为冒号,必须读下 一字符。
❖ 括号类配对预检
• 括号类: begin …end ,if … then,[ ],{ },( )
描述程序设计语言中的单词字,进一步为词法 分析程序的自动构造寻找特殊的方法和工具。 主要内容: • 确定有限自动机DFA • 确定有限自动机DFA的实现 • 非确定有限自动机NFA • NFA到DFA的转换 • DFA的化简
确定有限自动机DFA
• 确定有限自动机(DFA:Deterministric Finite Automata ) 为一个五元组
编译原理_第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 单词的描述⼯具程序设计语⾔中的单词是基本语法成分.单词符号的语法可以⽤有效的⼯具加以描述,并且基于这类描述⼯具,实现词法分析程序的⾃动构造.描述⼯具:正规⽂法和正规式识别⼯具:有穷⾃动机⼀.正规⽂法多数程序设计语⾔的单词的语法能⽤正规⽂法来描述。
第3章 词法分析 (编译原理 陈火旺)

标识符的符号表入口地址作为其单词符号的属性值,常
每个基本字占一个单词种别,单词符号的属性值缺省。
对于界符,运算符通常一个符号一个种别,单词符号的
属性值缺省
例: 参见P42.表3.1 单词符号及种别编码
10
3.1.3 词法分析器作为独立子程序
词法分析可采用如下两种处理结构:
把词法分析程序作为主程序。将词法分析作为
19
3.2.1 正规文法、正规式与正规集
正规集:由正规文法产生的语言所构成的集合。
注:正规集是集合,可有穷也可无穷。 可通过正规式来形式化表示。
对于一个正规文法的语言提炼出一个简洁的公式,用这个
式子来对它进行形式化的表示,这个式子叫正规式。
正规式:也称正则表达式,是说明单词的模式的一种重要的 表示法(记号);是定义正规集的数学工具;用来描述单词 符号。
在设计一个编译程序时,通常是把对源程序的结构分析分为词 法分析和语法分析两个相对独立的阶段来完成。
第一,描述单词的结构比描述源程序的其它语法结构要简单
得多,仅使用3型文法也就基本够用了。
第二,由于把词法分析和语法分析分开,可使编译程序各部
分的功能更为单一,整个编译程序的结构也更加清晰,从而 有利于编译程序的编写和调整。 上述词法分析和语法分析两个阶段的划分,仅仅是对整个编译 程序的逻辑功能而言,而不一定指的是编译程序的执行流程。
25
例3.2 判断下述正规式之间是否等价: (1)b(ab)*与(ba)*b (2)(ab)*与a*b* 解: (1) b(ab)*对应的正规集是b后面出现任意多个ab对
L(b(ab)*)={b,bab,babab, ……}
编译原理课件第3章

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

词法分析
主要内容
• 词法分析的任务 • 手工实现词法分析程序 • 正规式与有穷自动机 • 词法分析程序的自动生成
教学要求
• 重点掌握 词法分析器的功能和接口,用状态转换图设计
和实现词法分析程序,正规文法、正规式和有穷 自动机的概念及相互转换
词法分析程序 所处的位置
词分器法析取下单ktnoe一词符个语分表器号法 析
写成C语言的函数形式: recog_id() {…
char state = 0;
字母或数字
* 0 字母 1 其它 2
ch = getch();
do {
switch(state){ Case 0: if ch 是字母 state = 1; ch = getch();break; Case 1: if ch 是字母或数字 {
数字 6
数字 其他(为整数)
(出错)
7*
*
10
其他 (为指数)
*
8
*
9
练习2
• 画出识别标识符和整常数(可带正负号)的状态转 换图
练习3
• 以下状态转换图接受的字符集合是什么?
0
X
Y1
0
某简单语言的词法 分析程序的实现
状态转换图的实 现:使用一个 switch case 语 句:每条分支对 应一个case语句 段 见书P45 例
char
const
关 begin 键 if 字 then
else
while
do
for
to
end
read
种别码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
类 别
编译原理第三版 第三章 词法分析

超前搜索
例:FORTRAN语言中关键字的识别: DO99K=1,10 识别DO为关键字要搜 DO99K=1.10 索到“,” FORTRAN语言中常数的识别:
5.EQ.M, 5.E08
识别5为常数要搜索到Q
2、状态转换图
大多数程序设计语言中单词符号的词法规则可 以用正规文法描述。如: <标识符>→ 字母|<标识符>字母|<标识符>数字 <整数>→数字|<整数>数字 <运算符>→+|-|×|÷„ <界符>→; |, |( | )|„
#
3.3 正规表达式与有限自动机
目的: 形式化地描述词法规则和词法分析程序 词法分析程序的自动生成 主要内容 正规式与正规集 确定有限自动机 (DFA) 非确定有限自动机(NFA) 正规式与有限自动机的等价性 确定有限自动机的化简
正规文法
多数程序设计语言单词的语法都能用正规文法 (3型文法)描述 正规文法回顾 文法的任一产生式α→β的形式都为
单词符号的种类
(3) 常数 常数的类型一般有整型、实型、布 尔型、字符型等。
(4) 运算符 如 +,-,*,/等,对具体语言个 数是确定的。 (5) 界符 如 , ;()等,对具体语言个数是 确定的。
单词符号的表示形式
词法分析器所输出的单词符号常常表示成如下的 二元式:<单词种别,单词符号的属性值> 单词种别:由语法分析阶段使用的抽象符号。如: 用整数编码。 最简单的编码方案为一类一码,种别编码可设为: 1,2,3,4,5。 另一种编码方案(如本教材中): 标识符:列为一种,用一个整数编码表示; 常数:按类型分种编码; 关键字、运算符、界符:采用一字一种编码。
编译原理第三章词法分析解析

(30,_)
采用一符一种的编码方式。
(19,‘100’的二进制表示)1内0部0为的标值号用,10种0别的编二码进制19表,示单。词
例:下述C++代码段:while ( i >= j ) i - -; 经词法分析器处理以后,它将被转换为如下的单词符号串
( while ,_ ) ( ( ,_ ) ( id ,指向i的符号表指针 ) ( >= ,_ ) ( id ,指向j的符号表指针 ) ( ) ,_ ) ( id ,指向i的符号表指针 ) ( - - ,_ ) ( ; ,_ )
3、常数:常数的类型一般有整型、实型、布尔型、文字型 等。它是不限的。
4、运算符:如+、-、*、/ 等。它是确定的。
5、界符:如逗号、分号、括号、/*,*/ 等。它是确定的。
单词符号的表示形式:词法分析器所输出的单词符号常常表示成 二元式(单词种别,单词自身的值)。
单词种别可以用以下形式表示:
1、一类单词统一用一个整数值代表其属性。例如:1代表关键字, 2代表标识符等。
例如:在标准FORTRAN中 1、DO99K = 1,10 2、IF(5.EQ.M)I = 10 3、DO99K = 1.10 4、IF(5) = 55
其中的DO、 IF为关键字
其中的DO、 IF为标识符 的一部分
标识符的识别
多数语言的标识符是字母开头的“字母/数字”串, 而且在程序中标识符的出现后都跟着算符或界符。因此, 不难识别。
(2,_)
用一符一种的编码方式。
(20,‘5’的二进制表示)
常数类型,种别编码20,单词自 身等的号值为为运‘算5符’,的种二别进编制码表6示,。
(6,_)
M采为用标一识符符一,种种的别编编码码方26式,。单
《编译原理实践及应用》第3章词法分析—DFA与NFA

其中 Κ ={ S 0 ,S1 ,S 2 } Σ ={a,b}
Ѕ={ S 0 , S1 } ( S0 ,a)={ S1 }
F={ S 2 }
( S 0 ,b)={ S 0 ,S 2 }
( S1 ,a)= Φ
(S1 ,b)={S 2 }
( S 2 ,a)= Φ
(S 2 ,b)={S1 }
②以每个非终结符号做其它状态
③对于形如Q→q的规则,
q
S
Q
对于形如Q→Rq的规则,
Rq Q
④以文法开始符号为终止状态。
例3-1: 文法G[Z]: Z→Za|Aa|Bb
aA
a
A→Ba|a B→Ab|b
Sb a
Za
b
Bb
2.应用状态转换图识别句子
识别句子:从开始状态到终止状态经过的边上的符号序列。 识别句子的步骤: ①从开始状态出发,以欲识别符号串的最左字符开始,寻找标
Z→Cb C→b|Bb B→Ab A→a|Ba
有限自动机(FA)
FA可看作一个机器模型,由一个带读头的有限控制器和 一条字符输入带组成。
#
a b a ba
…
输入带
控制器
工作原理:读头从左到右扫描输入带,读到一个字符,状态改
变,同时读头右移一个字符,…,直到读头读到
“#”,状态进入终止状态。
控制器中包括有限个状态,读入一个字符形成状态转换。
( S1 ,a)= S0 ( S1 ,c)= S3 ( S 2 ,b)= S1
( S3 ,b)= S3
a
b
S2 a
S0 a S1
ba
C
S3 b
定义: 所接收的语言(正则集)
L( AD)={β | S β S, S∈ F },
编译原理chapter3 词法分析

一 设计一个奇偶校验器
DFA是由集合,序列和函数定义的数学模型, 它对于 上的w,判定是可接受的还是不可 接受的。例如,设计一个DFA m ,奇偶校验 器,首先,w是由0,1组成的字符串,因此, 1. ={0 ,1}且w在一条输入带上。
0 1 0 1 1$
读头
精品文档
11
2. 状态集:它记忆已读入w子串的状态,m是 奇偶校验器,它应该记住,初始序列是奇数 个1还是偶数个1。因此,m有even和odd两个 状态. 3 .even为开始状态。
词法分析器
‘while’,‘i’,‘<>’,‘j’, ‘do’, ‘if’,‘i’,‘>’,‘j’,‘then’, 'i', ':=’ , 'i', ’-’ , 'j', 'else', 'j', ':=', 'j', '-', ‘i'
精品文档
4
词类和属性
computator n. Calcculating machine.
3.1.1 词法分析程序的功能 源程序 单词词序法列分析器
3.1.2 单词的词类和属性 (词类符号,单词的属性值)
3.1.3 词法分析程序作为一个独立子程序 (1)语法分析程序的子程序; (2)组 织成一遍扫描。
精品文档
3
While i<>j do if i>j then i:=i-j else j:=j-I
三 一个DFA有三种表示:
(1)象上面,用转换函数;
精品文档
14
转移矩阵
状态转换图
a
b
0
1
2
a
编译原理与技术讲义-第3章

2
在自顶向下的语法分析中,通常使用预测分析法 或移进-规约分析法进行语法分析。
3
预测分析法基于预测分析表进行语法分析,而移 进-规约分析法则使用一个栈和一个规约机进行语 法分析。
自底向上的语法分析
自底向上的语法分析是一种与自顶向下 的语法分析相反的方法,其基本思想是 从源程序的叶子节点开始,逐步向上构 建语法树。
在自底向上的语法分析中,通常使用LR(0)、 SLR(1)、LALR(1)等算法进行语法分析。
自底向上的语法分析方法在处理左 递归和不确定的文法时具有优势, 但在处理右递归文法时可能会出现 问题。
03
中间代码生成
中间代码生成概述
中间代码定义
01
中间代码是源代码和目标代码之间的代码,通常是一种抽象的、
语法分析的主要目标是理解源程序的语法结构,并构建一棵语法树,以表 示程序中的各个语句和表达式的层次结构。
语法分析是编译过程中最复杂的部分之一,需要仔细设计和实现,以确保 能够正确地解析源程序。
自顶向下的语法分析
1
自顶向下的语法分析是一种常见的语法分析方法, 其基本思想是从源程序的根节点开始,逐步向下 分析各个子节点。
利用数据流方程来分析程序中 的数据依赖关系,从而进行优 化。例如,通过数据流分析确 定无用代码并进行删除。
05
目标代码生成
目标代码生成概述
01
目标代码生成是编译器的重要 阶段,它将中间代码转换为特 定机器上的目标代码。
02
目标代码生成需要考虑机器的 指令集、寻址方式、寄存器分 配等因素,以确保生成的代码 能够正确、高效地运行。
Java等。
02
实现词法分析器需要编写相应的词法分析器代码,并
《编译原理》第三章 词法分析器

有限自动机模型
Finite Automata (FA):
一个有限自动机的模型如下所示:
... ... head finite control input tape
输入带被分成一个个的小单元来装输入符号, 其右边是无限延伸的。 有限状态控制器由有限个状态组成,并根据读 入字符将当前状态转换成下一个状态
有限自动机与正规式的等价性证明
• 证明一: 对于∑上的NFA M,我们来构造∑上的正规式r, 使得L(r)=L(M)。 首先,我们将状态图的概念拓广,令每条弧可 用正规式作标记。并在M的转换图上加进两个 结点,一个为X,一个为Y。从X用ε弧连接到Y, 从而形成一个新的NFA,记为M’,它只有一个初 态X和一个终态Y。显然L(M)=L(M’)。即,这 两个NFA是等价的。 现在来逐步消去M’中的所有结点,直至只剩下 X和Y为止。
有限自动机接受的语言
The language accepted by FA
一个FA 能够接受的语言定义如下:
• 对于一个 DFA M, 可接受的语言表示为: L(M)={ x | x∈Σ* and f(s0 , x)∈Z} • 对于一个 NFA M, 其接受的语言为: L(M)={x | x∈Σ*and f(s0, x)∩Z≠Φ} • 两个 FA M and M’ 是等价的当且仅当 L(M) = L(M’)
M
M
a
M
假设对于任意 正规式 r1 and r2, 如果 |r1| < k 而 且 |r2| < k, 那么就于一个NFA M1 and M2 对应 于r1 和 r2. 所以对于任意 RE r, |r| = k, 我们有:
• 这个自动机所接受的语言是所有被3整除 以后余数为2的二0, q1, q2, q3}, {0, 1}, f1, q0 {q3} ) . 其中f1如下所示 :
编译课件 03 第三章 词法分析

2020/7/7
2
词法分析器的接口
CharList 附 属 词法分析器
call Token
语法分析
2020/7/7
5
设计与实现--有限自动机描述
1. 按类构造出相应的状态转换图。
2. 合并各类单词的状态转换图,构成一个能 识别语言所有单词的状态转换图。
1) 将各类单词的状态转换图的初始状态合
并为一个唯一的初始状态;
2) 化简调整状态冲突和对冲突状态重新编
号;
3) 如果有必要,增加出错状态。
2020/7/7
CurrentCharEof do begin State:=T(State, CurrentChar);
Read(CurrentChar);
end;
if StateFinalStates then Accept else Error;
特点 2020/7/7 程序短小,但占用存储空间多。
7
设计与实现--自动机实现
4) 特殊符号:包括运算符和界限符。运算符表示程 序中算术运算、逻辑运算、字符运算、赋值运 算的确定的字符或字符串。
2020/7/7
4
设计与实现--正则表达式描述
1) 标识符: L(L | D)* 其中L=[a-z, A-Z], D=[0-9]
2) 整数: D1D*|0, 其中D1=[1-9] 3) 特殊符号:+ | ;| :| := | < | <= | … 4) 保留字: if | else | …
《编译原理及实践教程》第3章词法分析

3.2.1 词法分析程序的接口
• 词法分析程序的主要任务
– 扫描源程序 – 识别单词,转换并输出token串 – 输出相应的错误信息 – 查填符号表 符号表
源程序
二元形式 (种别码, 单词值)
词法分析程序
token文件 源程序清单 和错误信息
图3.2 词法分析程序的输入/输出接口(顶层数据流图)
3.2.2 词法分析程序的总体设计
源程序 识别标 识符/关 键字1.5
说明:圆圈 代表“加工” 或“处理”
标
读入一 行1.1
识
源程序清单 读一非 空字符 1.2
缓冲区 buffer 字符 首字符 分类1.3
数
字
/ ‘
识别数 值常数 1.6 处理注 释和除 号1.7 识别文 字常数 1.8
母
符 /关
字
数
字 键
输出 标识符 token串 常数 1.4 查填符 号表2
• 词法分析程序有两种实现方式
– 可以作为独立的一遍,即一个独立的功能程序 – 可以和语法分析结合在一起作为一遍
• 将词法分析程序设计成一个子程序,每当语法分析程序需 要一个单词时,就调用该子程序。
3.2 词法分析程序的设计
本节主要介绍手工构造方式 按软件工程的观点介绍设计方法
画数据流图 总体设计 详细设计 程序实现(编程)
• 单词种别码和单词值的用途:
– 单词的种别码在语法分析时使用 – 单词的值在语义分析和中间代码生成时使用。
词法分析输出举例
• 例3.1 对于语句if (r>=2.0) C=2*pi*r,经词 法分析后的输出为:
(9, ―if‖) (46, ―(‖) (34, ―r‖) (31, ―>=‖) (36, ―2.0‖) (47, ―)‖) (34, ―C‖) (39, ―=‖) (35, ―2‖) (26, ―*‖) (34, ―pi‖) (26, ―*‖) (34, ―r‖)
编译原理 第3章

一般而言 ,当一个语言的两种单词有相同的前缀时,其扫描 器都应当考虑采用超前搜索和多字符回退操作。
编译原理
8
3.1.4 源程序的输入及预处理 •为了提高读盘的效率和便于扫描器工作,通常采用缓冲 输入的方案,即在内存设置一个适当大小的输入缓冲区, 让操作系统直接将磁盘上的源程序字符串分批送入次缓 冲区,供扫描器处理。
∴M能识别出L(G)中的全部句子。
编译原理 21
二、对于左线性文法构造状态转换图 设G=(Vn,Vt,P,S)是一左线性文法,Vn中的每个非终结符号 对应状态图中的一个结点。与右线性文法不同的是,增 设一个不属于V的符号R标记初态结点,并用S作为终态 结点 。|Vn|=k,共有k+1个节点(状态)。 1. 对于G中的每一条形如A→a的规则,从初态结点R引一 条矢线到结点A,并用符号a标记这条矢线。 2. 对于G中每一条形如A→Ba的规则,从结点B引一条矢线 到结点A,并用符号a标记这条矢线。
编译原理
16
E d
d 0
d
d
d 5 d 6
1
.
d
2
E
4
±
. 图3.4文法G<无符号数>的状态图
编译原理
17
状态图识别符号串
利用状态转换图可识别相应文法所表示的符号串。 定义:设α∈VT * ,如果状态转换图中存在一条从初态到 终态的路径,此路径上的标记符号顺序相连构成符号串α, 则称α为状态图所识别串。
状态图识别语言:状态图所识别的串集合。
a 开始 0 a 1 b 2
编译原理 18
b
2)状态转换图对符号串的识别 对符号串W=a1a2a3……an,ai∈ VT 识别过程:
从初态S出发,自左至右逐个扫描W中的字符,在S 状态下扫视的符号为a1; 在节点S所射出诸矢线中寻找标记为a1的矢线(若 不存在,则说明W有错);
编译原理第3章课后习题答案

consonant -> [b-df-hj-np-tv-z] ctnvowels->(consonant*)(((a+)(consonant*))+)(((e+)(consonant*))+)
(((i+)(consonant*))+)(((o+)(consonant*))+)(((u+)(consonant*))+)
Dtran[I,b] =ε-closure(move(I,b))= ε-closure({5, 16})=G DFA D 的转换表 Dtran NFA 状态 {0,1,2,4,7} {1,2,3,4,6,7,8} {1,2,4,5,6,7} {1,2,4,5,6,7,9} {1,2,4,5,6,7,10,11,12,13,15} {1,2,3,4,6,7,8,12,13,14,15,17,18} {1,2,4,5,6,7, 12,13,15,16,17,18} {1,2,4,5,6,7, 9,12,13,15,16,17,18} {1,2,4,5,6,7, 10,11,12,13,15,16,17,18} 可得 DFA 的如下状态转换图: DFA 状态 A B C D E F G H I a B B B B F F F F F b C D C E G H G I G
编译原理第 2 版参考习题答案 (3 章) 第 3 章 词法分析 3.2.2 试描述下列正则表达式定义的语言 (1) a( a|b )*a 答: { aa, aaa, aba, aaaa, aaba, abaa, abba, ... },(按穷举法) 或以 a 开头和结尾,长度大于等于 2 的 a,b 串 (2) ( (ε|a)b*) )* 答: 由 a 和 b 组成的任意符号串 (自然语言描述)
编译程序构造与实践教程第三章

例 改进的属性字序列
符 号 类
1 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 27 1 19 20 23 28 1 25 1 25 1 26 32 19 1 10 1 20 1
例 属性字序列之例
void main ( ) { int i, j, d; if (i>j) d=i-j; else d=j-i; d=d/4; }
相应的属性序列:
输入符号 void main ( ) { int i , j , d ; if ( i > j ) d 属性字序列 27, "void" 1, "main" 19, "(" 20, ")" 23, "{" 28, "int" 1, "i" 25, "," 1, "j" 25, "," 1, "d" 26, ";" 32, "if" 19, "(" 1, "i" 10, ">" j, "j" 20, ") " 1, "d" 输入符号 = i j ; else d = j i ; d = d / 4 ; } 属性字序列 18, "=" 1, "i" 4, "-" 1, "j" 26, ";" 33, "else" 1, "d" 18, "=" 1, "j" 4, "-" 1, "i" 26, ";" 1, "d" 18, "=" 1, "d" 6, "/" 2, "4" 26, ";“ 24, "}"
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
=>
0
数字
1
.
2
数字
3
4
+或 -
5
数字
数字
6
其他
7
其他 其他
图3.6(c) 无符号实数的状态转换图
• 对图3.6(c)—无符号实数状态转换图改进:
– 使用不同的终态来表示不同单词的识别,不仅可靠性 高,而且可据此来确定该数的属性,便于填入符号表
• • • • 终态7:识别出错处理的终态 终态8:识别带指数的实数的终态 终态9:识别带小数的实数的终态 终态10:识别整数的终态
– 识别数值型常数(加工1.6):当读入的单词首 字符是数字时,开始识别整数或实数。 – 处理注释和除号(加工1.7):当读入的单词首 字符是“/”时,开始识别注释和除号。 – 识别文字常数(加工1.8):当读入的单词首字 符是单引号时,忽略单引号,开始拼写字符常 数,直到下一个单引号结束,最后返回种别码 – 识别其他界符和运算符(加工1.9): – 查填符号表(加工2):对标识符和常数识别 后,要查填符号表(若表中没有,则加入表并 填写属性等信息)。符号表的格式见3.2.5节的 表3.2。
字母或数字
*
2
• 例:识别表达式“x2=56;”中的整数56
数字
* 0
数字
1
其它
2
图3.6(b) 识别无符号整数的状态转换图
• Sample语言中识别无符号实数的状态转换图 (不带正 负号,可表示整数、可表示小数,可带指数部分) • 如:下面几个数应该是符合规则的数: 3,3.51,34E3,34.5E2,34.5E+2,34.5E-2
例:识别表达式“x2=56;”中的标识符x2
字母或数字
*
0
字母
1
其它
2
图3.6(a) 识别标识符的状态转换图
字母或数字
*
0 字母 1
其它
2
识别过程是:从初始状态0开始,读取一个字符,若是字母, 读入它,转入状态1,否则(不是字母)识别失败。在状 态1,读取下一个字符,若为字母或数字,则读入它,仍 处于状态1;在状态1读入的字符不是字母或数字,则转向 状态2,结束一个标识符的识别过程。状态上的*表示多读 入一个符号,指针应回退一个字符。
源程序 识别标 识符/关 键字1.5
说明:圆圈 代表“加工” 或“处理”
标
读入一 行1.1
识
源程序清单 读一非 空字符 1.2
缓冲区 buffer 字符 首字符 分类1.3
数
字
/ ‘
识别数 值常数 1.6 处理注 释和除 号1.7 识别文 字常数 1.8
母
符 /关
字
数
字 键
输出 标识符 token串 常数 1.4 查填符 号表2
其他 (为小数) (出错)
数字
7 10 8
* *
其他
其他
数字
=> 0
数字
1
∙
2
数字
3
数字
E/e
4
+/-
5
数字
数字
6
其他
(为指数)
*
E/e 其他(为整数)
9
*
练
习 1
• 画出识别标识符和整常数(可带正负号)的状 态转换图
练 习 2
• 以下状态转换图接受的字符集合是什么?
0 X 0 Y 1
词法分析程序 实现方法总结
初始化 打开源文件
3.2.3 词法分析程序 的详细设计
Y
源程序结束? N 读入一行到string中 get_line() 缓冲区空? N 读取单词的第1个字 符get_nextchar() 根据第1 个字符进行分类 sort()
Y
符号表和token 表写入文件 write_sym() write_token()
• 对“输入/输出接口”(图3.2)按照软件工程自 顶向下逐层分解→图3.3和图3.4
– 图3.3第一层数据流图:主要工作是“识别单词”和 “查填符号表”
token文件 源程序 识别 单词1 标识符 常数 源程序清单 和错误信息
图3.3 第一层数据流图(圆圈:表示“加工”)
查填符 号表2
符号表
– 图3.4更详细的数据流图:对图3.3(第一层数 据流图)再进一步展开。
识别过程中,若能到达终点,表示单词正确,否 则单词不正确(如标识符“$x”)。
写成C语言的函数形式: recog_id(char ch) { 0 1 其它 char state = '0'; 字母 while (state != '2') { switch(state) { case '0': ch=get_nextchar(); if (isletter(ch)) state ='1' else error(); break; case '1': ch=get_nextchar(); if (isletter(ch)||isdigit(ch)) state ='1' else state = '2'; break; } } return (gettoken()); //返回识别的单词的token值(查表3.1) }
• 单词种别码和单词值的用途:
– 单词的种别码在语法分析时使用 – 单词的值在语义分析和中间代码生成时使用。
词法分析输出举例
• 例3.1 对于语句if (r>=2.0) C=2*pi*r,经词 法分析后的输出为:
(9, ―if‖) (46, ―(‖) (34, ―r‖) (31, ―>=‖) (36, ―2.0‖) (47, ―)‖) (34, ―C‖) (39, ―=‖) (35, ―2‖) (26, ―*‖) (34, ―pi‖) (26, ―*‖) (34, ―r‖)
表3.1 Sample语言单词的编码
类 别 var integer 单词 program 种别码 1 2 3 类 别 关 键 字 单词 write true false 种别码 18 19 20 标识 符 id 34 类别 单词 种别码
bool
real char const 关 键 字
4
5 6 7
not
and or +
21
22 23 24 常 数
整常数
实常数 字符常数 布尔常数
35
36 37 38
begin
if then
8
9 10 运 算 符
* /
25
26 27
=
; ,
39
40 41
else
while do
11
12 13
<
> <=
28
29 30 界 符
'
/* */
42
43 44
for
to end
14
15 16
>=
== <>
31
32 33
:
( )
45
46 47
read
17
.
48
• 单词的值:
可用多种方式给出: – 对于“一字(一符)一种”单词:单词值可不 给出(因单词的种别码唯一代表该单词) – 一个类别有多个单词(标识符、常数):必须 给出每个单词值,单词值可为单词符号串本身 ,也可为一个指针值(在符号表和常数表中的 入口位置),常数的单词值也可以是自身常数 的二进制数。
• 其他任务:
– 滤掉程序中的无用成分,如空格、注释、换行符 – 调用出错处理程序,指出源程序出错的行列位置 – 调用符号管理程序,对识别出的单词进行管理 • 关键:找出单词的分隔符
单词的类型
• 单词:是语言中具有独立意义的最小单位,常用 单词分5类: – 保留字(关键字):具有固定意义的标识符 – 标识符:表示各种名字(变量名、函数名等) – 常数:整型、实型、布尔型、字符型等 – 运算符:算术运算符(+、-、*、/)、逻辑 运算符(not、and、or)和关系运算符(<、 >、<=、>=、==) – 界符:类似自然语言的标点符号,分:单界 符(;、’等)、双界符(/*等)
语法 树
表
器
编译 程序 的后 续部 分
3.1 词法分析的任务和功能
• 功能:
源程序 词法分析程序 Token串 语法分析程序 – 逐个读入源程序字符并按照构词规则切分成一系列单词 – 对识别过程中发现的词法错误,输出错误信息
• 主要任务:
– 读入源程序,从左至右逐个字符地扫描,识别出各个单 词符号,并输出(形式:单词符号串——token串)
3.2.1 词法分析程序的接口
• 词法分析程序的主要任务
– 扫描源程序 – 识别单词,转换并输出token串 – 输出相应的错误信息 – 查填符号表 符号表
源程序
二元形式 (种别码, 单词值)
词法分析程序
token文件 源程序清单 和错误信息
Байду номын сангаас
图3.2 词法分析程序的输入/输出接口(顶层数据流图)
3.2.2 词法分析程序的总体设计
3.2.4 使用状态转换图来识别单词
状态转换图是描述单词构成规则的一种很好的工具。
利用转换图可识别(或接受)按某种规则构成的单词。 状态转换图是一张有限方向图。有限个状态,用结点(圆 圈)表示状态,其中有一个初态(初态用箭头指出),至少 有一个终态(终态用双圈表示)。状态之间用带箭头的弧线 连结,称为边,由状态s到状态r的边上标记的字符表示使 状态s转换到状态r的输入字符或字符类。
值 常