《编译原理实践及应用》第3章词法分析 (2)

合集下载

《编译原理》第3章

《编译原理》第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}

编译原理与技术 词法分析 (2)(2)

编译原理与技术 词法分析 (2)(2)

2024/7/1
《编译原理与技术》讲义
20
正规式与有限自动机
✓ R= R1 | R2
Si
S0 Sj
(3)
fi
f0
fj
引入新的终态f0和 (fi,)=f0和(fj,)=f0
2024/7/1
《编译原理与技术》讲义
21
正规式与有限自动机
✓ R= R1 ·R2
(1)
Si
fi
Sj
fj
R1对应的 NFA,Si为初 态,fi为终态

2024/7/1
《编译原理与技术》讲义
5
有限自动机的表示
e.g.7 NFA Mn =(, S, S0,F,),其中:
= { 0,1 } , S = {S0, S1 , S2 , S3 , S4 },F={S2 , S4}
(S0,0)= {S0, S3 } (S0,1)= {S0, S1 }
(S1,0)= ∅
有限自动机
有限自动机(Finite Automata-FA)是种更 一般化的状态转换图。分为NFA和DFA。
词法分析器自动生成:
正规式
NFA
DFA
词法程序
非确定有限 自动机
确定的有限 自动机
2024/7/1
《编译原理与技术》讲义
1
非确定有限自动机-NFA
NFA Mn 是一个五元组 Mn =(, S, S0,F,), 其中:
2024/7/1
《编译原理与技术》讲义
15
比较 DFA 和 NFA(2)
DFA
NFA
容易实现-当输入串结束 由于面临同样输入符号存 时(或不存在相应状态转 在多重状态转换或存在转 换)时,若当前状态为终 换的选择,实现较为复杂。 态即为接受“已读入”的串, 一般地,NFA接受串如果

编译原理与实现03第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章词法分析

《编译原理实践及应用》第3章词法分析
字母或数字
*
0
字母
1
其它
2
识别过程是:从初始状态0开始,若读入一个字母, 转入1状态,若再读入字母或数字,仍处于1状态, 否则转向2状态,结束一个标识符的识别过程。状 态上的*表示多读入一个符号。
写成C语言的函数形式: recog_id() 0 1 { … 其它 字母 char state = 0; ch = getch(); do { switch(state){ Case 0: if ch 是字母 state = 1; ch = getch();break; Case 1: if ch 是字母或数字 { state = 1; ch = getch(); } else state = 2; break; } } while (state != 2); 回退一个符号。 }
举例
• 3. 其它输出:错误信息和源程序清单
– 错误信息应该详细,准确,指出出错的具体行、 列位置,发生了哪类错误等,方便用户修改
错误处理
• 应尽可能发现更多的错误 • 处理方式
– 每个程序段单独处理错误 – 统一处理错误(商用软件系统)
• 记录式的文件 • 数据库
• 统计表明,现代软件系统中, 75%的程序代码都 是用于处理错误与错误信息 • 商业系统中错误处理的特点是:统一错误编号,编 制文档指出错误信息的含义、应对措施、解决方案
种别码 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
单词 * */ + , — 、 ·· / /* : := ; < <= <> = > >= [ ]
种别码 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

《编译原理》教学课件 第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 ) 为一个五元组

词法分析-编译原理-03-(二)

词法分析-编译原理-03-(二)

5. 5.1 5.2 5.3 5.4 5.5 5.6 5.7 6 6.1 6.2
isalpha(ch) : ch→buf; 下一字符→ch WHILE isalpha(ch) OR isdigit(ch) DO ch→buf; 下一字符→ch 回送 ch; key = isKeyword(buf) IF key >= 0 THEN 返回 key Lookup( buf ) → attr 返回 IDN ':' : 下一字符→ch; IF ch等于'=' THEN 返回 ASG 出错处理
第三章 词法分析 3.1 词法分析的任务
输入源程序,输出单词符号
把构成源程序的字符串转换成语义
上关联的单词符号的序列
单词符号
token
按照最小的语义单位设计, 通常表示为二元组
(单词种别,属性值)
1) 单词符号的表示
单词种别
通常按照语法分析的需要设置. 常用: 各关键字,标识符,常数,各
例3-3 状态图的实现算法
1. 2. 3.1 3. 4. 4.1 4.2 4.3 4.4 4.5 读入当前字符 ch //跳过空格 WHILE ch 是空格 DO 下一字符 → ch CASE ch OF isdigit(ch) : ch→buf; 下一字符→ch WHILE isdigit(ch) DO ch→buf; 下一字符→ch 回送 ch 将缓冲区的数字字符串变成数字→attr 返回 NUM
7 8 9 10 11 12 13 14 15 16 17 18
'+' : 返回 ADD '-' : 返回 SUB '*' : 返回 MUL '/' : 返回 DIV '=' : 返回 EQ '>' : 返回 GT '<' : 返回 LT '(' : 返回 LP ')' : 返回 RP ';' : 返回 SEMI 其它 : 出错处理 END OF CASE

第3章 词法分析 (编译原理 陈火旺)

第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, ……}

编译原理第三章词法分析解析

编译原理第三章词法分析解析

(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式,。单
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章
词法分析
主要内容
• 词法分析的任务 • 手工实现词法分析程序 • 正规式与有穷自动机 • 词法分析程序的自动生成
教学要求
• 重点掌握 词法分析器的功能和接口,用状态转换图设计
和实现词法分析程序,正规文法、正规式和有穷 自动机的概念及相互转换
词法分析程序 所处的位置
词分器法析取下单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
类 别
单词
关 write 键 true 字 false
not
and
or +
-
* 运/ 算 符<
>
<=
>=
==
<>
一、正规文法
• 正规文法:文法G=(VN,VT,P,S)中的每个产生式 的形式都是A→aB或A→a,其中A和B都是非终结符, a是终结符串。
下面定义的标识符和无符号整数都是正规文法: <ID> → <LETTER>|<ID><LETTER>|<ID><DIGIT> <UINT> → <DIGIT>| <UINT><DIGIT> <AOP> → +|-| * | / <LETTER> → a|b|c|…|z|A|B|…|Z <DIGIT> → 0|1|2|…|9
词法分析程序的接口
符号表
源程序
词法分析程序
token文件
源程序清单 和错误信息
源程序
识别 单词1
token文件
标识符 常数
查填符 号表2
源程序清单 和错误信息
ห้องสมุดไป่ตู้
符号表
源程序
读入一 行1.1
字 母
缓冲区
源程序清单
buffer
数字
读一非 字符 首字符
/
空字符
分类1.3
1.2

标识符/关键字 其它界符和运算符
compiling process} var
a,b,c:integer; x:char; begin if (a+c*3 > b) and (b>3) then c:=3; End.
举例
符号表
• 其它输出:错误信息和源程序清单
– 错误信息应该详细,准确,指出出错的具体行、列位置, 发生了哪类错误等,方便用户修改
• 如:下面几个数应该是符合规则的数:
3,3.51,34E3,34.5E2,34.5E+2,34.5E-2
E/e
. 数字
=> 0 数字 1
数字
数字
2 数字 3 E/e 4 5 +或- 数字 6 其他
7
其他
数字
其他
数字
∙ => 0 数字 1
2 数字 3
数字
E/e
其他 (为小数)
其他
其他
数字
5 E/e 4 +/-
符号表和token 表写入文件 write_sym()
write_token()
Y 缓冲区空?
N 读取单词的第1个字 符get_nextchar()
关闭所有文件 结束
数字 识别数值常数 recog_dig()

识别字符常数 recog_str()
根据第1 个字符进行分类
sort()
字母 识别标识符/关 键字recog_id()
pattern的一种重要的表示法,是单词构成规则的 描述工具。
正规式和正规集的递归定义:(设字母表为) 1. 和都是上的正规式,表示{}和{ }; 2.任何a ,则a是正规式,表示{a}; 3.假定r和s都是上的正规式,分别表示语言L(r)和L(s):
a) (r) | (s)是正规式,表示L (r) U L (s) ; b) (r)(s)是正规式,表示L (r)L (s); c) (r)*是正规式,表示(L (r) )*; d) (r)是正规式,表示L (r); 4.有限次使用上述三步骤而定义的表达式才是上的正 规式,仅由这些正规式所表示的集合才是上的正规集。
– 格式: (单词的种别码,单词符号的属性值) – 单词种别:是对能识别的单词的分类编码 – 单词符号的属性值:单词的某种特性或特征
• 常数的值,标识符的名字等 • 保留字、运算符、分界符的属性值可以省略 – 文件存放最好有格式,如每个单词占一行方便“语法分 析”程序调用
源程序
{this is a sample program writing in simple language}
• 识别单词前作如下假定
– 关键字就是保留字 – 单词中间不能有分界符(如空格、空白、界符和算符等) – 单词中间不能有注释 – 单词必须在一行内写完,换行后认为是另一个单词 – 一个单词不能超过规定长度
识别单词
超前搜索技术:如在读取/* */时,当读到/时,如 何判别是注释还是除法运算?
识别单词:掌握单词的构成规则很重要 • 主要包括如下几种单词的识别:
词法分析器的自动生成
• 正规式 • 正规文法 • 有穷自动机
3.3 正规文法、正规式与有穷自动机
• 本节要求 1 能根据自然语言描述构造正规式、NFA 2 掌握NFA转换为DFA,DFA的化简 3 掌握正规文法、正规式和有穷自动机间的转换
为了讨论词法分析程序的自动生成问题,将状态 转换图加以形式化。
种别码 类别
单词
18
标识
19

id
20
21
整常数
22
常 实常数
23
数 字符常数
24
布尔常数
25
=
26
;
27
,
28
'
29
界 /*
30
符 */
31
:
32
(
33
)
.
种别码
34
35 36 37 38 39 40 41 42 43 44 45 46 47 48
词法分析器的输出
• Token串 (二元式) 输出源文件中各个有用的单词
program example1;
{used for illustrating compiling process}
举例
var
a,b,c:integer;
x:char;
begin
if (a+c*3 > b) and (b>3) then c:=3;
end.
注意token文 件的格式
token文件
program example1 ; var a , b , c : integer ; x : char ; begin if
错误处理
• 应尽可能发现更多的错误 • 处理方式
– 每个程序段单独处理错误 – 统一处理错误(商用软件系统)
• 记录式的文件 • 数据库 统计表明,现代软件系统中, 75%的程序代码都是用于处 理错误与错误信息。 商业系统中错误处理的特点是:统一错误编号,编制文档 指出错误信息的含义、应对措施、解决方案。
语法 树
编译 程序
的后
续部

• 功能
源程序
3.1 词法分析器的功能
词法分析程序 Token串 语法分析程序
– 逐个读入源程序字符并按照构词规则切分成一系列单词
• 主要任务
– 读入源程序,识别出各个单词符号,并输出。
• 其他任务
– 滤掉程序中的无用成分,如空格、注释、换行符 – 调用符号管理程序,对识别出的符号进行管理 – 追踪换行标志,指出源程序出错的行列位置
识别标 识符/关 键字1.5
识别数 值常数
1.6
处理注 释和除 号1.7
识别文 字常数
1.8
识别界 符和运 算符1.9
数值常数
除号/
输出 标识符 token串 常数
文界字符常和数运算符
1.4 token文件
其它
查填符 号表2
符号表
初始化 打开源文件
源程序结束? Y
N 读入一行到string中
get_line()
• 结论:每一种程序设计语言,都有它自己的字符 集V,语言中的每一个单词或者是V上的单个字 符,或者是V上的字符按一定方式组成的字符串。 组成方式就是对字符或字符串进行(连接)“.”、 或“|”(并)、或“*/+”闭包运算。
相关文档
最新文档