编译原理 第三章 词法分析
北航编译原理课件 03.词法分析
3. 词法分析程序算法
北京航空航天大学计算机学院
17
1.单词及内部表示 单词及内部表示: 单词及内部表示
单词名称
BEGIN END FOR DO IF THEN ELSE 标识符 常数(整 常数 整) : + * , ( ) :=
保留字和分界符采用一符一类
记忆符
BEGINSY ENDSY FORSY DOSY IFSY THENSY ELSESY IDSY INTSY COLONSY PLUSSY STARSY COMSY LPARSY RPARSY ASSIGNSY
字母、数字
标识符 无符号整数
单字符分界符
S S S
字母
标 数字
非字母数字
出口
数字
数
非数字
出口
+ * , 单界 ( ) :
其他字符 非=
出口
双字符分界符
北京航空航天大学计算机学院
S
冒号
=
双界
其他字符
出口 15
查保留字表 读字符
字母、数字
S
字母
标 数字
非字母数字
标识符
非数字
数字
数
无符号整数 单字符分界符
如:b{ab} = {ba}b {a|b} = {{a} {b}} = (a*b*)*
北京航空航天大学计算机学院 23
例:设 ∑ = { a,b },下面是定义在∑上的正则表达式和正则集合 正则表达式 ba* a(a|b)* (a|b)*(aa|bb)(a|b)* 正则集合
北京航空航天大学计算机学院
北京航空航天大学计算机学院 20
‘*’ : ‘,’ : ‘(’ : ‘)’ : ‘:’ :
编译原理词法分析及词法分析程序
状态图=>右线性文法
文法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 输出单分符/
注释处理
读字符
词法分析-编译原理-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
哈工大编译原理.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章 词法分析与有穷自动机(第5-8讲)
它所对应的状态表如图:
状态 0 1 2 3 a 1 3 1 3 后继 状态 b 2 2 3 3
输入字符 接受 否 否 否 是
式的转化
22
第3章 词法分析与有穷自动机
■DFA所识别的语言
给定DFA M,对于字符c1,c2,…,cn,当以下条件成立时, 称M接受由c1,c2,…,cn组成的字符串c1c2…cn: 存在状态序列s0,s1,s2,…,sn,使得s1=f(S,c1), s2=f(s1,c2),…,sn=f(sn-1,cn),且sn∈Z。 由DFA M接受的语言L(M)是所有M接受的字符串组成的集 合。
25
第3章 词法分析与有穷自动机
判断下图是DFA还是NFA的状态转换图,并 写出其他2种表示形式
26
第3章 词法分析与有穷自动机
■由正规表达式R构造NFA
1.基本正规表达式 (a)对于正规式φ,所构造NFA: (b)对于正规式ε,所构造NFA: (c)对于正规式a,a∈Σ,则 NFA:
x ε y
练习:若S=a|bb,则L((a|bb)*)=?
5
第3章 词法分析与有穷自动机
■正规式中运算的优先级
括号优先,* 次之,•(连接)再次之,| 最后 例:a|bc* ≌ a|(b(c*)) ab|c*d ≌ (ab)|((c*)d)
■ 正规式与正规集举例
L(a|bc*)=L(a)∪L(bc*) 思考:L(ab|c*d)=? =L(a)∪L(b)L(c*) =L(a)∪L(b)(L(c))* ={a}∪{b}{ε,c,cc,ccc……} ={a,b,bc,bcc,bccc,……}
17
第3章 词法分析与有穷自动机
■有穷自动机的状态转移图表示方法
编译原理第三版 第三章 词法分析
超前搜索
例: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。 另一种编码方案(如本教材中): 标识符:列为一种,用一个整数编码表示; 常数:按类型分种编码; 关键字、运算符、界符:采用一字一种编码。
编译原理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
编译原理第三章(4-2)
无符号数一般形式:dm dm-1 · · · d1 d0 ·d-1 d-2 · · ·d-nE+ dd · · · d E d 0 d . 3 d 1 d d E 4 d 5 d d 6
.
d
2
+∣d
. d d
d
d
F
北京交通大学 于双元 16
无符号数一般形式:dm dm-1 · · · d1 d0 ·d-1 d-2 · · ·d-nE+ dd · · · d E d 0 d . 3 d 1 d d E 4 d 5 d d 6
A B
②开始符号S作为初始状态 设一符号F不属于V作为终止状态
S
F B F F
③形如A→aB的规则
④形如A→a的规则 特别:A → ε
A A
a a
A 未曾在A的射出弧中 出现过的终结符号
北京交通大学 于双元
也可以消除ε产生式后再画状态图。
4
例:G[Z]: Z→0U∣1V U →1Z∣1 V →0Z∣0
1 初态
0 Z 1
U
1 0
F
0
V
②此过程是一种推导过程. (最右(左)推导)
相当于: Z=>0U =>01Z =>011V =>0110Z =>01100U =>011001
能否编程序实现?
有什么问题?
北京交通大学 于双元
8
3 、左线性文法的状态图
左线性文法的规则呈: A→Ba或A→a A,B∈Vn ,a∈Vt (1)状态图 ①G[S]的每一个非终结符号代表一结点(状态) A B
北京交通大学 于双元
23
3、设有如下状态转换图,试给出对应的正则文法 (左线性和右线性)。
编译原理作业集-第三章-修订版
编译原理作业集-第三章-修订版第三章词法分析本章要点1.词法分析器设计,2.正规表达式与有限⾃动机,3.词法分析器⾃动⽣成。
本章⽬标:1.理解对词法分析器的任务,掌握词法分析器的设计;2.掌握正规表达式与有限⾃动机;3.掌握词法分析器的⾃动产⽣。
本章重点:1.词法分析器的作⽤和接⼝,⽤⾼级语⾔编写词法分析器等内容,它们与词法分析器的实现有关。
应重点掌握词法分析器的任务与设计,状态转换图等内容。
2.掌握下⾯涉及的⼀些概念,它们之间转换的技巧、⽅法或算法。
(1)⾮形式描述的语⾔?正规式(2)正规式→ NFA(⾮确定的有限⾃动机)(3)NFA → DFA(确定的有限⾃动机)(4)DFA →最简DFA本章难点(1)⾮形式描述的语⾔?正规式(2)正规式→ NFA(⾮确定的有限⾃动机)(3)NFA → DFA(确定的有限⾃动机)(4)DFA →最简DFA作业题⼀、单项选择题(按照组卷⽅案,⾄少15道)1. 程序语⾔下⾯的单词符号中,⼀般不需要超前搜索a. 关键字b. 标识符c. 常数d. 算符和界符2. 在状态转换图的实现中,⼀般对应⼀个循环语句a. 不含回路的分叉结点b. 含回路的状态结点c. 终态结点d. 都不是3. ⽤了表⽰字母,d表⽰数字, ={l,d},则定义标识符的正则表达式可以是:。
(a)ld*(b)ll*(c)l(l | d)*(d)ll* | d*4. 正规表达式(ε|a|b)2表⽰的集合是(a){ε,ab,ba,aa,bb} (b){ab,ba,aa,bb}(c){a,b,ab,aa,ba,bb} (d){ε,a,b,aa,bb,ab,ba}5. 有限状态⾃动机可⽤五元组(V T,Q,δ,q0,Q f)来描述,设有⼀有限状态⾃动机M的定义如下:V T={0,1},Q={q0,q1,q2},Q f={q2},δ的定义为:δ(q0,0)=q1δ(q1,0)=q2δ(q2,1)=q2δ(q2,0)=q2M所对应的状态转换图为。
编译原理
13
3.9直接从正则式到DFA
构造算法
实例 例3.37
得到的DFA状态比通过NFA得到的DFA状态少!
14
3.10 DFA最简化(3.9.6-3.9.7)
DFA最简化原理
最简DFA唯一性:每一个正则式可以由一个状态数最少
的DFA识别,且这个DFA唯一。 可行性:DFA存在不可区别状态,可以合并。 化简条件:确保DFA是全函数
8
3.9直接从正则式到DFA
构造原理
转换表:聚焦重要状态之间的转移 开始状态:可能出现在给定正则表达式描述的语言中任
何一个串第一个符号位置的所有重要状态。 接受状态:和结尾#相关的位置
9
3.9直接从正则式到DFA
构造算法
定义四个函数:nullable、firstpos、lastpos、
C b a B a b
开始
A
a
b
a
D
19
例 题 1
叙述下面的正则式描述的语言,并画出接受该语言 的最简DFA的状态转换图 (1|01)* 0*
描述的语言:所有不含子串001的0和1的串
1 0
1
.
start 1 刚读过的不是0 0 2 连续读过一个0 0 3 连续读过 不少于两个0
20
例 题 2
编译原理
第三章 词法分析
1
计算机科学与技术学院
3.8词法分析器生成工具的设计
词法分析器模型 图3.49
词法分析器工作方式
DFA模拟器 图3.27
NFA模拟器 图3.27
DFA转换表
NFA转换表
《编译原理》第三章 词法分析器
有限自动机模型
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如下所示 :
编译原理-第3章 词法分析--习题答案
第3章词法分析习题答案1.判断下面的陈述是否正确。
(1)有穷自动机接受的语言是正规语言。
(√)(2)若r1和r2是Σ上的正规式,则r1|r2也是Σ上的正规式。
(√)(3)设M是一个NFA,并且L(M)={x,y,z},则M的状态数至少为4个。
(× )(4)设Σ={a,b},则Σ上所有以b为首的符号串构成的正规集的正规式为b*(a|b)*。
(× )(5)对任何一个NFA M,都存在一个DFA M',使得L(M')=L(M)。
(√)(6)对一个右线性文法G,必存在一个左线性文法G',使得L(G)=L(G'),反之亦然。
(√) (7)一个DFA,可以通过多条路识别一个符号串。
(× )(8)一个NFA,可以通过多条路识别一个符号串。
(√)(9)如果一个有穷自动机可以接受空符号串,则它的状态图一定含有 边。
(× )(10)DFA具有翻译单词的能力。
(× )2.指与出正规式匹配的串.(1)(ab|b)*c 与后面的那些串匹配?ababbc abab c babc aaabc(2)ab*c*(a|b)c 与后面的那些串匹配? acac acbbc abbcac abc acc(3)(a|b)a*(ba)* 与后面的那些串匹配? ba bba aa baa ababa答案(1) ababbc c babc(2) acac abbcac abc(3) ba bba aa baa ababa3. 为下边所描述的串写正规式,字母表是{0, 1}.(1)以01 结尾的所有串(2)只包含一个0的所有串(3) 包含偶数个1但不含0的所有串(4)包含偶数个1且含任意数目0的所有串(5)包含01子串的所有串(6)不包含01子串的所有串答案注意 正规式不唯一(1)(0|1)*01(2)1*01*(3)(11)*(4)(0*10*10*)*(5)(0|1)*01(0|1)*(6)1*0*4.请描述下面正规式定义的串. 字母表{x, y}.(1) x(x|y)*x(2)x*(yx)*x*(3) (x|y)*(xx|yy) (x|y)*答案(1)必须以 x 开头和x结尾的串(2)每个 y 至少有一个 x 跟在后边的串 (3)所有含两个相继的x或两个相继的y的串5.处于/* 和 */之间的串构成注解,注解中间没有*/。
编译原理课件(三)词法分析
为了讨论词法分析器的自动生成,还需要将转换
图的概念形式化。
为此我们引入:正规式,正规集,自动机等概
念。
3.3.1 正规式与正规集
1. ε 和都是 Σ 上的正规式,他们所表示的正规集分别为{ε } 和 ; 2. 任何a Σ , a是Σ 上的一个正规式,它所表示的正规集为{a};
若M的初态结点同时又是终态结点,则为空字可以为M
所识别。DFA M所能识别的字的全体记为L(M).
DFA及其所识别的语言描述
[M=({0,1,2,3},{a,b},,0,{3}) 其中: (0,a)=1; (0,b)=2 (1,a)=3; (1,b)=2 (2,a)=1; (2,b)=3 (3,a)=3; (3,b)=3 问:L(M)=?
输入字符 状态 s1 s2 s1 s2 s2 s1 a b
DFA的(确定的)状态转换图表示
• 假定DFA M 含有m个状态n个输入字符,
– 那么,这张图含有m个状态结点,
– 每个结点顶多有n条箭弧射出和别的结点相连接,
– 每条箭弧用上的一个不同字符作标记, – 整张图含有唯一的初态和若干个(可以是0个)终 态结点。
留字i表进行。
1 DO99K=1,10 2 IF(5.EQ.M)I=10 3 DO99K=1.10 4 IF(5)=55
标识符的识别
• 标识符的定义:字母开头,字母和数字的 组合 • 标识符后通常有界符
常数的识别
• 算术常数有时需要超前搜索
– 5.EQ. M
• 逻辑常数:.T. , .F., 有界符,容易识 别
3.1.2 词法分析器的构造方式-词法分析器 作为独立子程序
词法分析器安排成语法分析的子程序。 好处在于:编译器结构清晰。
编译原理第二版第3章词法分析
1. ε和φ都是∑上的正规式,它所表示的正规集分
别为{ε}和Ф; 2. 任何a∈∑,a是∑上的正规式,它所表示的正 规集为{a}; 3. 假定e1和e2都是∑上的正规式,他们所表示的 正规集分别为L(e1)和L(e2),那么,以下也 都是正规式和他们所表示的正规集;
一、正规式与正规集的递归定义
3.2 单词符号及输出单词的形式
单词自身值
对常数,基本字,运算符,界符就是他们本 身的值 对标识符,将标识符的名字登记在符号表中, ‚自身值‛是指向该标识符所在符号表中位 置的指针。
假定基本字、运算符和界符都是一符一种 例:if(a>1) b=100; 词法分析后输出的单词序列是: (2, ) if (29, ) ( (10,‘a’) a (23, ) > (11,‘1’) 1 (30, ) ) (10,’b’) b (17, ) = (11,‘100’) 100 (26, ) ;
4. 仅由有限次使用上述三步定义的表达式才是∑上的 正规式,仅由这些正规式所表示的字集才是∑上 的正规集。
重点回顾
四、将正规文法转换成正规式 求非终结符的正规式 将正规文法中的每个非终结符表示成关 于它的一个正规式方程,获得一个联立 方程组 用代入法解正规式方程组 最后只剩下一个开始符号定义的正规式, 其中不含非终结符
3.3 语言单词符号的两种定义方式
作用: 描述单词的构成规则,基于这类描 述工具建立词法分析技术,进而实现词法 分析程序的自动构造。 工具有: 正规文法 正规式(Regular Expression)
多数程序设计语言的单词符号都能用正 规文法或正规式来定义。
3.3.1 正规文法
多数程序设计语言单词的语法都能用正 规文法(3型文法)描述 正规文法回顾 文法的任一产生式α →β 的形式都为 A→aB或A→a,其中A ,B∈VN ,a∈VT A→Ba或A→a,其中A ,B∈VN ,a∈ VT 正规文法描述的是VT*上的正规集
编译原理第三章词法分析
z19
step1 : 对语言的各类单词分别构造状态图;
step1
L
1
2
other
*
3 其中: other表示非L| D | _字符
z8
3.2.1 单词与属性字
注意:
(1) 同一个字符开头+后续字符->跨多个单词类;
(2) 非单词成分和预处理成分;
•例:源程序注释;/* …….*/
预处理指令:
•# define… # include…
z9
3.2.1 单词与属性字
2. 属性字 对所识别的单词的数据结构表示。
控制线
数据线
X : 固定长度的存储空间 ; z16
预处理程序(作用)
(1) 减少内存空间占用;
(2) 减轻扫描器实质性处理的负担;
预处理程序主要任务:
(1) 滤掉源程序中的非单词成分(如无用空格;换行
符等);
•滤掉注释;
(2) 实际的预处理工作
•宏替换; •文件包含的嵌入;
L1= ( T,C)
属性字 Token
Code
刻画单词类别(单词性质)
如:标识符;运算符;…
单词的内码值(可空)
z10
说明
单词类别通常用整数编码 单词类别提供给语法分析程序使用 单词符号属性信息记录单词符号的特征或特性 单词的属性值提供给语义分析程序使用
编码形式:
一类一种:关键字、标识符、常数、运算符、界符 一字一种:关键字、运算符、分界符各一码
编译原理课件chap03(陈火旺)
第三章 词法分析
3。2。2 单词符号的识别:超前搜索 词法分析器的结构图如图3。1所示。
源程序串
预处理 子程序
输入缓冲区
列表
扫描缓冲区 扫描器
单词符号
图3。1词法分析器
第三章 词法分析
当词法分析器调用预处理子程序处理 出一串输入字符串放进扫描缓冲区之后, 分析器就从此缓冲区中逐一识别单词符 号。当缓冲区里的字符串被处理完之后, 它又调用预处理程序装入新串。 下面我们来介绍单词符号识别的一 个简单方法-----超前搜索
第三章 词法分析
关键字的识别 像FORTRAN这样的语言,关键字不加保 护(只要不引起矛盾,用户可以用它们作为普 通标识符),关键字和用户自定义的标识符或 标号之间没有特殊的界符作间隔。这使得关键 字的识别甚为麻烦。请看下面例子: 1 DO99K=1,10 2 IF(5.EQ.M)I=10 3 DO99K=1.10 4 IF(5)=55 这四个语句都是正确的FORTRAN语句。 语句1和2分别是DO和IF语句,它们都是以某 基本字开头的。语句3和4是赋值语句,它们都 是以用户自定义的标识符开头的。
第三章
词法分析
编译程序首先是在单词级别上来分析和翻译 源程序的。词法分析的任务是:从左至右逐个字 符地对源程序进行扫描,产生一个个单词符号, 把作为字符串的源程序改造成为单词符号串的中 间程序。因此,词法分析是编译的基础。执行词 法分析的程序称为词法分析器。 •3。1 对词法分析器的要求
3.1.1 词法分析器功能和输出形式 输入源程序,输出单词符号。 程序语言的单词符号一般分为五种:关键字, 标识符,常数,运算符,界符
第三章 词法分析
对于2和4来说,必须超前扫描到与IF后的 左括号相对应的那个右括号之后的第一个字符 为止。若此字符是字母,则得逻辑IF。若此字 符为数字,则得算术IF。否则,应认为是用户 自定义标识符IF. 标识符的识别、常数的识别及算符和界符的 识别相类似可以参考课本P40,P41这里就不再 多述。 3。2。3 状态转换图 使用状态转换图是设计词法分析器的一种好 途径。转换图是一张有限方向图。在转换图中, 结点代表状态,用园圈表示。状态之间用箭弧 连结。箭弧上的标记(字符)代表在射出结点 (即箭弧始结点)状态下可能出现的输入字符 或字符类。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单词符号的表示形式:词法分析器所输出的单词符号常常表示成
二元式(单词种别,单词自身的值)。 单词种别可以用以下形式表示: 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 - -; 经词法分析器处理以后,它将被转换为如下的单词符号串
( while ,_ ) ( ( ,_ ) ( id ,指向i的符号表指针 ) ( >= ,_ )
( id ,指向j的符号表指针 )
( ) ,_ ) ( id ,指向i的符号表指针 )
GETCHAR是过程,
将下一输入字符读入 为了把状态转换图转化成程序,每个状态要建立一段
程序,它要做的工作如下:
CHAR,搜索指示器 前移一个字符。
第一步:从输入缓冲区中取一个字符。为此,我们使用函 数GETCHAR,每次调用它,推进先行指针,送回一 个字符。 第二步:确定在本状态下,哪一条箭弧是用刚刚来的输入 字符标识的。如果找到,控制就转到该弧所指向 的状态;若找不到,那么寻找该单词的企图就失 败了。 失 败:先行指针必须重新回到开始指针处,并用另一状 态图来搜索另一单词。如果所有的状态转换图都 试过之后,还没有匹配的,就表明这是一个词法 错误,此时,调用错误校正程序。
其中的DO、 IF为关键字 其中的DO、 IF为标识符 的一部分
IF数组
标识符的识别
多数语言的标识符是字母开头的“字母/数字”串, 而且在程序中标识符的出现后都跟着算符或界符。因此, 不难识别。 常数的识别 对于某些语言的常数的识别也需要使用超前搜索。
算符和界符的识别
对于诸如C++语言中的“+ +”、“- -”,这种复 合成的算符,需要超前搜索。
基本概念和术语
V自身的n次(连接)积记为:
Vn = V V…V (n个V) 规定V0= {ε}. 例:设A = { a, b }, 求A0 , A1, A2 A0 = {ε} A1 = { a, b} A2 = {aa, ab, ba, bb }
基本概念和术语
V* = V0∪V1∪V2∪…,称V*是V的闭包。
4、GETBC
过程,检查CHAR中的字符是否为空白。若是,则调用GETCHAR
直至CHAR中进入一个非空白字符。
5、CONCAT
过程,把CHAR中的字符连接到TOKEN之后。
6、LETTER
DIGIT 7、RESERVE
布尔函数过程,它们分别判断CHAR中的字符是数字或是字母,
从而给出真假值TRUE、FALSE。 整型函数过程,用TOKEN中的字符串查保留字表,若是一个保留
符号串y直接拼接在x之后,此种操作为符 号串x和y的连接,记为xy。 例:若x=NPU,y=1108, 则xy=NPU1108。而yx=1108NPU εx=xε=x 符号串的方幂:符号串x与其自身的n-1次 连接称为此符号串的n次方幂,记作xn。
特别:x0=ε
基本概念和术语
符号串集合的运算:
2.3 程序语言的语法描述
基本概念和术语:
字母表 :由若干元素所组成的有限非空集合 Σ ,其中,每一元素称为符号,故有时又将
字母表称为符号集。 符号串(字) :Σ中的符号所组成的任何有限序 列。 符号串的长度:符号串中所含符号的个数. 例: |abc|=3。
基本概念和术语
空符号串(空字):不包含任何符号的符号 串,记为ε(音:伊普西隆)。|ε|=0。
设U,V为两个符号串的集合: 集合U,V的和记作U+V(或U∪V) 定义为: U+V={α|α∈U 或 α∈V}
集合U同V的积记作UV
定义为: UV={αβ | α ∈U 且 β ∈V } 一般UV≠VU,但(UV)W=U(VW).
基本概念和术语
例:
设U = { a, b } V = { c, d } W= {df, ghi} 求UV=? UW=? UV={ ac, ad, bc, bd } UW={ adf, aghi, bdf, bghi }
词法分析的任务:
从左至右逐个字符地扫描源程序,产生 一个个的单词符号,把作为字符串的源程序 改造成为单词符号串的中间程序。
词法分析器/扫描器:执行词法分析的程序。
词法分析器的功能如下图所示:
由程序语言定义的具有固定意 义的标识符。也可称为保留字 或基本字。例如:Pascal中的 用来表示各种名字,如变量名、 begin,end,if等。 数组名、过程名等。它是不限
注意:一个语言的单词符号如何分种,分几种,怎样编码,是一个技术
问题。标识符一般同归为一种。常数则宜按类型(整、实、布尔)分。 关键字可以将其全体视为一种,也可一字一种。运算符可采用一符一种, 但也可把具有一定共性的视为一种。界符则一般采用一符一种。如何进 行分种主要取决于处理上的方便。 若是一符一种分种,单词自身值就不需要了。否则,要查符号表。
例3-1:151-FORTRAN编译程序的词法分析器在扫描输入串 IF (5·EQ·M) GOTO 100
逻辑IF 左括号 整常数 等号 标识符 右括号 GOTO 标号 (34,_)
后,它输出的单词符号串是:
IF为关键字,种别编码34, 采用一符一种的编码方式。 ‘(’为界符,种别编码2,采 (2,_) 用一符一种的编码方式。 常数类型,种别编码20,单词自 (20,‘5’的二进制表示) 身的值为‘5’的二进制表示。 等号为运算符,种别编码6, (6,_) 采用一符一种的编码方式。 M为标识符,种别编码26,单 (26,‘M’) 词自身值为‘M’。 ‘)’为界符,种别编码16, (16,_) 采用一符一种的编码方式。 GOTO为关键字,种别编码30, (30,_) 采用一符一种的编码方式。 100为标号,种别编码19,单词 (19,‘100’的二进制表示) 内部的值用100的二进制表示。
确定
1、关键字:由程序语言定义的具有固定意义的标识符。也 可称为保留字或基本字。例如:Pascal中的begin, end,if等。它是确定的。 2、标识符:用来表示各种名字,如变量名、数组名、过程 名等。它是不限的。
3、常数:常数的类型一般有整型、实型、布尔型、文字型 等。它是不限的。
பைடு நூலகம்
不限
4、运算符:如+、-、*、/ 等。它是确定的。
的。 常数的类型一般有整型、实型、 布尔型、文字型等。它是不限 的。 运算符:如+、-、*、/ 等。 它是确定的。 界符:如逗号、分号、括号、 /*,*/ 等。它是确定的。
1、关键字
源 程 序
2、标识符
扫描器
3、常数
scanner
4、运算符
5、界符
词法分析器的功能:输入源程序,输出单词符号。 单词符号:一个程序语言的基本语法符号。分为以下5种。
用Σ*表示Σ上的所有符号串的全体,空字也包括
在其中。 Σ*显然为一无限集
如:若Σ={a,b} 则Σ*={ ε,a,b,aa,ab,bb,ba,aaa,…} φ(音:弗爱):不含任何元素的空集{ } 注意:ε、{ }和{ε}的区别。
基本概念和术语
符号串的运算:
符号串的连接:设x和y是两个符号串,将
IF
DO STOP END 标识符 常数(整) = + * ** ,
2
3 4 5 6 7 8 9 10 11 12
$ IF
$ DO $ STOP $ END $ ID $INT $ ASSIGN $ PLUS $ STAR $ POWER $ COMMA
(
)
13
14
$ LPAR
$ RPAR
-
-
空白
字则给予编码,否则回送0值(假定0不是保留字的编码)。
8、RETRACT 过程,把搜索指示器回调一个字节,把CHAR中的字符置为空白。
以上函数和子程序过程都不难编制,使用它们能够方便 的构造状态转换图的对应程序。一般,我们可以让每一个状 态结对应一个程序段。 例如:我们可以让不含回路的分叉结,对应一个CASE 语句,或者是一组IF„THEN„ELSE语句。具体见后面实例。 终态结一般对应一个RETURN(C,VAL)语句。其中C为单词 种别编码;VAL是字符数组的TOKEN ,或者是一个整数值, 或者无定义。具体见后面实例。
转换图:是一张有限方向图。在状态转换图中,结点代表 状态,用圆圈表示。状态之间用箭弧连接。箭弧上 的标记(字符)代表在射出结状态下可能出现的输 入字符或字符类。 状态转换图的功能:用于识别一定的字符串。 初态:一张转换图的启动条件,至少有一个,用圆圈表示。 终态:一张转换图的结束条件,至少有一个,用双圈表示。 * :表示多读进了一个字符。(用在终态上)