编译原理实用教程 第3章 词法分析

合集下载

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

编译原理与实现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型文法也称为正 则文法。对于正则文法所描述的语言可以用一种有穷自动机来识 别。我们的目的是实现词法分析程序,所以为了简化问题,我们 直接介绍这种自动机的非形式表示,即状态图。

编译原理词法分析及词法分析程序

编译原理词法分析及词法分析程序
∴M能识别出L(G)中的全部句子。
状态图=>右线性文法
文法G[0] 0->a1
d 0
S->aA A->dA A->b
a c
1 2
b
d
3
1->d1 1->b
0->c
0->c2 2->d
S->c
S->cB,2有出弧 B->d
左线性文法=>状态转换图
设G=(VN,VT,P,S)是一左线性文法,令|VN|=K, 1) 则所要构造的状态转换图共有K+1个状态. 2) VN中的每个符号分别表示K个状态 2.1) G的开始符S为终止状态 3) 起始状态,用R(VN)标记
识别符号串与归约
S





从初态R到下一状态A对应Ba,即终结 符a归约成非终结符B; U 从状态B转换到状态A对应ABa,即将 Ba归约为A; 状态A转换到状态S(终态)对应S Aa,即 U 将Aa归约为开始符S. 归约成功,恰好进入终态,即状态转换图识 U 别了(或接受)该符号串. 识别00011的例子的归约过程
f是转换函数,是在K×Σ →K上的映像,即:如果f(ki,a)=kj, (ki,kj∈K)意味着,当前状态为ki,输入字符为a时,将转换 为下一个状态kj,我们把kj称作ki的一个后继状态;
1.确定的有限自动机
通常把这五要素组成的五元式M=(K,∑,f, S0,Z)称为确定的 有限自动机(DFA),它是相应的状态转化图的一种形式描 述,或者说,是状态转换矩阵的另一种表示。 在状态转换的每一步,据DFA当前所处状态及扫视的输入 字符,能唯一确定下一状态。

例:文法G=({S,U},{0,1},{SS1 |U1,

编译原理词法分析

编译原理词法分析
❖ 数字:继续读,直到非数字字符出现或文件尾。输 出无符号整数的单词记号及数字串;
❖ =、<、>、!:读下一个字符,判断是否为双字 符分界符,若是,组成双字符分界符,输出类码; 若不是,输出单分界符记号;
编译原理
❖ 非=、<、>、/等与双分界符首字符不同的单分界 字符:输出相应单词记号及单分界符。
1.S是一个有穷集,它的每个元素称为一个状态;
2.Σ是一个有穷字母表,它的每个元素称为一个输入 符号,所以也称Σ为输入符号表;
3.δ是在S×Σ→S上的单值映射,即,如δ (s,a)=s’, (s∈S,s’∈S)就意味着,当前状态为s,输入符为 a时,将转换为下一个状态s’,我们把s’称作s的一 个后继状态;
编译原理 在 入 准初带备整•••始的读输读有个时开入始入头穷模,始,状带:控型读位状态:可制由头置态存以器如状的所三处,处放在:果态符识部于表于输输控读正号别分输示初入入制头好组组符带状移是成成号上态动终的:向发到结字后生最状能移变后态被头每有动化一,该转向读穷个则有移后入控符输限到移一 制号入自下动个器后带动一一符控面上机个个号制,状位,状态置读态,
编译原理
词法分析 读字符
结束 Y
结束
N Y 空字
N 字母 N 数字
Y 组合标识符 Y 组合整数
查保留字Βιβλιοθήκη N 纯单分符Y 输出单分符
N
>,<,!,= Y 读字符
=
N
N
/ Y 读字符
*
N
Y
错误处理
输出保留字
Y 保留字
N 输出标识符
组合整数
读字符
Y 输出双分符
输出单分符 N 输出单分符/
注释处理
读字符

编译原理课件-词法分析

编译原理课件-词法分析

號等記號的文法
—— 正規文法
語法:借助於記號來描述語言的結構的文法
—— 上下文無關文法
21/76
二、記號的文法
識別字 常數
–整數 –無符號數
運算符 分界符 關鍵字
22/76
Wensheng Li BUPT @ 2008
識別字
識別字定義為“由字母打頭的、由字母或數字組成
的符號串”
正規運算式?
描述識別字集合的正規運算式:
9/76
Wensheng Li BUPT @ 2008
3.2 詞法分析程式的輸入與輸出
一、詞法分析程序的實現方法 二、設置緩衝區的必要性 三、配對緩衝區 四、詞法分析程序的輸出
10/76
Wensheng Li BUPT @ 2008
一、詞法分析程式的實現方法
利用詞法分析程序自動生成器
–從基於正規運算式的規範說明自動生成詞法分析程序。 –生成器提供用於根源程式字元流讀入和緩沖的若干副程
記號的屬性
詞法分析程式在識別出一個記號後,要把與之有關 的資訊作為它的屬性保留下來。 記號影響語法分析的決策,屬性影響記號的翻譯。 在詞法分析階段,對記號只能確定一種屬性
–識別字:單詞在符號表中入口的指針 –常數:它所表示的值 –關鍵字:(一符一種、或一類一種) –運算符:(一符一種、或一類一種) –分界符:(一符一種、或一類一種)
4/76
Wensheng Li BUPT @ 2008
3.1 詞法分析程式與語法分析程式的關係
詞法分析程式與語法分析程式之間的三種關係
–詞法分析程式作為獨立的一遍 –詞法分析程序作為語法分析程序的副程式 –詞法分析程序與語法分析程序作為協同程式
分離詞法分析程序的好處

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

编译原理 第三章 词法分析

编译原理 第三章 词法分析
5、界符:如逗号、分号、括号、/*,*/ 等。它是确定的。
单词符号的表示形式:词法分析器所输出的单词符号常常表示成
二元式(单词种别,单词自身的值)。 单词种别可以用以下形式表示: 1、一类单词统一用一个整数值代表其属性。例如:1代表关键字, 2代表标识符等。 2、每一个单词一个类别。例如:1代表BEGIN,2代表END等。 单词自身的值可以表示成:常量的二进制表示;常量、变量等在符号表 种的地址码,等等。
例3-3:简单的状态转换图示例:
1
X
2
初态
终态
Y
(a)转换图示例 数字
3
从0状态到1状态 可能出现字母
字母或数字 字母 其他
0
1
2
*
0
数字
1
其他
2 *
(b)识别标识符的转换图
(c)识别整数的转换图
例3-4:识别FORTRAN实型常数的转换图:
例如下列实型常数可 以被以下转换图识别: 1.23E+4
•scanner当作一遍。 •把scanner当作子程序。
scanner
源程序
scanner作为一遍
设计前提:
输入
列表 把scanner作为一个独立的子程序; 输入缓冲区 预处理 • 词法分析器的任务为输出单词符号。 子程序

扫描缓冲区
预 处 理 部 分
•必要性:编辑性字符如空白符、回车符等,除了出现在文字和 扫描器 常数中以外,在别处出现都没有意义。 扫 单词符号 描 •功 能: 剔除无用字符。 器 语法分析器 •实 现: 预处理子程序。 图2.1 词法分析器
例3-2 :下述C++代码段:while ( i >= j ) i - -; 经词法分析器处理以后,它将被转换为如下的单词符号串

第3章 编译原理课件—词法分析

第3章 编译原理课件—词法分析

个个单词符号。把作为字符的源程序改造为 单词符号串组成的中间程序,执行词法分析 任务的程序称为词法分析器或称扫描器。
2015/12/6
4
3.1 词法分析概述
二、词法分析程序的功能

词法分析程序主要执行以下功能:
读入源程序字符串,识别开具有独立含义的最

小语法单位——单词(符号); 把单词变换成长度统一的且为定长的属性字; 其他功能: 滤掉空格,跳过注释、换行符 某些预加工处理
27
2015/12/6
六、转换系统

定义:转换系统是具有下列三个特征的状态转换 图,即 1) 开始状态S和终止状态Z 唯一; 2) 无弧进入S,也无弧自Z射出;
3)可能存在标记为空串(ε)的弧。

转换系统与状态转换图的区别: ε弧
ε S1 A S2 Z2 ε
28
Z1 ε
S ε
2015/12/6
Z
3.3 正规式与有限自动机
2015/12/6
5
3.1 词法分析概述
三、词法分析程序的安排
常常把词法分析程序作为独立的一遍或作 为被语法分析程序所调用的子程序。 1、作为独立的一遍: 语法分析前进行词法分析,把单词符号 串形成中间文件存贮。

2015/12/6
6
3.1 词法分析概述
三、词法分析程序的安排

2、作为被语法分析器词用的子程序:
2015/12/6 32
正规式与正规集
三、为正则文法构造状态转换图 Nhomakorabea 什么是正则文法?(U::=T 步骤如下:
以S为开始状态作结点;
或U::=WT)
把文法中的每一个非终结符号作为状态结点; 对于形如Q::=T的每个规则,引一条开始状态S
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。



源程序
词法分析程序
图3-1词法分析单独作为一遍
单词序列
取符号
源程序
词法分析程序
送符号
语法分析程序
图3-2词法分析作为语法分析子程序
3.1.2单词符号

单词符号是程序设计语言的基本语法单位和最小语义单位。单词符号一 般分为五类。
(1)关键字(又称保留字或基本字)如if,then ,else,while,do, begin和end。 (2)标识符,用于表示变量名、过程名等。 (3)常数,如123,实数型45.67等。 (4)运算符,如+,-,*,/,<,=等。 (5)界限符,如逗号、分号和括号等。 程序设计语言中的关键字、运算符和界限符的数量都是确定的。而常数 和标识符的数量是不确定的。
3.1.1

词法分析
词法分析是编译过程的第一个阶段。这个阶段的任 务是从左到右一个字符一个字符地读入源程序,对 构成源程序的字符流进行扫描和分解,从而识别出 一个一个的单词。编译程序中完成词法分析任务的 程序段,称为词法分析程序。词法分析程序对源程 序进行扫描,从中识别出一个个的单词符号,因此, 词法分析程序又称为词法分析器,又称扫描器。







′0′‥′9′: begin
while digit do begin concat;getch; end; retract; return(2,dtb); end;
′+′: return(31, ); ′-′: return (32, ) ′ *′: return (33, ); ′/′: return (34, ); ′=′: return (37, ); ′:= ′: return (51, ); ′; ′: return (54, ); ′(′: return (52, ); ′) ′: return (53, ) ; end of case error;

例3.2 有状态转换图3-4所示,其中,0结点用‘S’标记,表 示初态结点;2结点用‘E’标记,表示终态结点。从初态结 点出发到某一终态结点所经过的路径,称为能为该状态转换 图所接受的符号串。
字母或数字 S 0 字母 其它字符
1
2
E
图3-4扫描缓冲区
字母或数字
S

0
字母
数字
非字母、数字1ຫໍສະໝຸດ 2+3.1.3 一个简单的词法分析程序的设计

1.预处理 词法分析器在识别单词符号之前,需要对输入区的源程序进行预处理。 预处理包括删除无用的空格、跳格、回车和换行等编辑性字符以及注释 部分。每一次对一串定长的输入字符进行预处理,并装进一个指定的缓 冲区。 2.状态转换图


利用状态转换图可以设计词法分析器。状态转换图是一个有向图,仅包 含有限个结点,每个结点表示一个状态,其中有一个初始结点,至少有 一个终态结点,结点间弧的标记是输入字符或字符类。


1.单词类别的表示

单词类别表示单词的种类,它是语法分析所需要的信息。一个语言的单 词符号如何划分种类、分为几种,如何编码都属于技术性的问题,主要 取决于处理上的方便。单词符号有5个类别:关键字、标识符、常数、 运算符和界限符,可以用1、2、3、4、5来表示。也可以用一字符一类 别码的编码形式,如保留字可以采用一字一类别。分界符也可以采用一 字一类别。对于一字一类别的单词,单词的类型就是单词的自身值,词 法分析程序就不必输出其值了。常数的自身值是其自身的二进制。

词法分析器作为编译程序的一部分,它与语法分析程序之间 接口方式有两种。一种方式是词法分析程序独立工作,把字 符流的源程序变为单词序列,输出在一个中间文件上,这个 文件称为语法分析程序的输入而继续编译,如图3-1所示就 是将词法分析单独作为一遍的接口方式。源程序词法分析程 序单词序列图3-1词法分析单独作为一遍 取符号源程序词法分析程序语法分析程序图3-2词法分析作 为语法分析子程序送符号 另一种方法,也是常用的一种方法就是把词法分析程序设计 成一个子程序,每当语法分析程序需要一个单词时,就调用 该程序。词法分析程序每得到一次调用,就从源程序文件中 读入一个字符,直到识别出一个单词为止。这种方法省去了 中间文件。
第三章 词法分析
本章学习目标
词法分析程序的主要任务是对源程序进行扫描,从 中识别出单词。它是编译程序的第一步,也是编译 过程中不可缺少的部分。本章的主要内容是: 正则表达式和有限自动机 文法、正规表达式、正规集及自动机的相互转换 词法分析器的C语言实现 词法分析器的自动生成

3.1词法分析器与单词符号
数字
非数字
3
4
+
E E
+
5
E + E+ E+ E+
+ E

— * — = — (
) ;
6 7
8
9
10
11
E+
= — 非=
+
126 136
E
+ E
/ 其他
146 17 E
*
156
非*
E+ EE +
166
图3-6识别各类单词符号的状态集合






词法分析程序的构造如下: 初始化:arr:=′′;getch;getnbc; case ch of ′a′‥′z′: begin while letter or digit do begin concat; getch end; retract; c:=reserve; if c=0 then return (1,arr) ; else return(c, ); end;
2.单词的自身值

单词自身的值是编译程序中其他阶段所需要的信息。对于单 词符号来说,如果一个种别只含有一个单词符号,那么这个 单词符号,其种别就安全地代表了它的自身值。如果一个种 别含有多个单词符号,那么对于它的每个单词符号,除了给 出种别编码之外,还应该给出单词符号自身的值,以便把同 一种单词区别开来。注意,标识符自身的值就是标识符自身 的字符串。而常数自身的值是常数本身的二进制数值。
相关文档
最新文档