付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章词法分析本章内容词法分析器:把构成源程序的字符流翻译成记号流,还完成和用户接口的一些任务围绕词法分析器的自动生成展开介绍正规式、状态转换图和有限自动机概念
词法分析器语法分析器符号表记号(token)取下一个记号源程序2.1词法记号及属性
2.1.1词法记号、模式、词法单元
记号名
词法单元例举
模式的非形式描述
if if 字符i,f
for for 字符f,o,rrelation <,<=,=,… <或<=或=或…id sum,count,D5 由字母开头的字母数字串number 3.1,10,2.8E12 任何数值常数literal “seg.error” 引号“和”之间任意不含 引号本身的字符串2.1词法记号及属性历史上词法定义中的一些问题忽略空格带来的困难
DO8I3.75 等同于 DO8I3.75DO8I3,75关键字不保留
IFTHENTHENTHEN=ELSE;ELSE…关键字、保留字和标准标识符的区别保留字是语言预先确定了含义的词法单元标准标识符也是预先确定了含义的标识符,但程序可以重新声明它的含义2.1词法记号及属性2.1.2词法记号的属性
position=initial+rate60的记号和属性值:
id,指向符号表中position条目的指针 assign_op
id,指向符号表中initial条目的指针 add_op id,指向符号表中rate条目的指针
mul_op number,整数值602.1词法记号及属性2.1.3词法错误词法分析器对源程序采取非常局部的观点例:难以发现下面的错误
fi(a==f(x))
…在实数是“数字串.数字串”格式下,可以发现下面的错误 123.x紧急方式的错误恢复 删掉当前若干个字符,直至能读出正确的记号错误修补 进行增、删、替换和交换字符的尝试2.2词法记号的描述与识别
2.2.1串和语言字母表:符号的有限集合,例:={0,1}串:符号的有穷序列,例:0110,语言:字母表上的一个串集 {,0,00,000,…},{},句子:属于语言的串串的运算连接(积) xy,s
=s=s
幂
s0为,si为si-1s(i>0)
2.2词法记号的描述与识别
语言的运算并: LM={s|s
L或s
M}连接: LM={st|s
L且t
M}幂: L0是{},Li是Li-1L
闭包: L=L0
L1
L2…正闭包: L+=L1
L2…例L:{A,B,…,Z,a,b,…,z},D:{0,1,…,9}L
D,LD,L6,L*,L(L
D)*,D+
2.2词法记号的描述与识别
2.2.2正规式正规式用来表示简单的语言,叫做正规集
正规式 定义的语言 备注
{}
a {a} a (r)|(s) L(r)∪L(s) r和s是正规式 (r)(s)
L(r)L(s) r和s是正规式
(r)*
(L(r))* r是正规式
(r) L(r) r是正规式 ((a)(b)*)|(c)可以写成ab*|c
2.2词法记号的描述与识别
正规式的例子={a,b}a|b {a,b}(a|b)(a|b) {aa,ab,ba,bb}aa|ab|ba|bb {aa,ab,ba,bb}a* 由字母a构成的所有串集(a|b)* 由a和b构成的所有串集复杂的例子(00|11|((01|10)(00|11)(01|10)))句子:001110012.2词法记号的描述与识别
2.2.3正规定义
对正规式命名,使表示简洁 d1
r1 d2
r2 ... dn
rn各个di的名字都不同每个ri都是{d1,d2,…,di-1}上的正规式2.2词法记号的描述与识别
正规定义的例子C语言的标识符是字母、数字和下划线组成的串
letter_
A|B|…|Z|a|b|…
|z|_
digit
0
|1|…|9 id
letter_(letter_
|digit)*
2.2词法记号的描述与识别
正规定义的例子无符号数集合,例1946,11.28,63E8,1.99E6
digit
0
|1|…|9
digits
digit
digit*
optional_fraction
.digits|
optional_exponent
(E(+||)digits)|
numberdigitsoptional_fractionoptional_exponent简化表示 number
digit+(.digit+)?(E(+|)?digit+)?2.2词法记号的描述与识别
正规定义的例子(进行下一步讨论的例子)
while
while do
do relop
<|<=|=|<>|>|>=
letter
A|B|…|Z|a|b|…
|z id
letter(letter|digit)* number
digit+(.digit+)?(E
(+|)?
digit+)?delim
blank|tab|newline
ws
delim+2.2词法记号的描述与识别
2.2.4转换图关系算符的转换图
051624837return(relop,LE)return(relop,NE)return(relop,LT)return(relop,GE)return(relop,GT)return(relop,EQ)开始<=>=>=**otherother2.2词法记号的描述与识别
标识符和关键字的转换图91011开始letterother*letter或digitreturn(installId())2.2词法记号的描述与识别
无符号数的转换图 number
digit+(.digit+)?(E
(+|)?
digit+)?开始1912131415161718digitdigitdigitdigitdigitdigitother.E+/Edigitotherotherreturn(installNum())*2.2词法记号的描述与识别
空白的转换图delimblank|tab|newlinewsdelim+2122开始delimother*delim202.3有限自动机
2.3.1不确定的有限自动机(简称NFA) 一个数学模型,它包括:
1、有限的状态集合S
2、输入符号集合
3、转换函数move:S({})
P(S)
4、状态s0是唯一的开始状态
5、F
S是接受状态集合识别语言(a|b)*ab
的NFA12开始a0abb输入符号ab0{0,1}{0}1{2}2状态
NFA的转换表2.3有限自动机
识别语言(a|b)*ab
的NFA12开始a0abb2.3有限自动机
例
识别aa*|bb*的NFA12开始a0abb342.3.2确定的有限自动机(简称DFA)
一个数学模型,包括:1、有限的状态集合S2、输入字母集合3、转换函数move:SS,且可以是部分函数4、唯一的开始状态s05、接受状态集合FS12开始a0abbab识别语言(a|b)*ab
的DFA2.3有限自动机
2.3有限自动机
例 DFA,识别{0,1}上能被5整除的二进制数 已读过 尚未读 已读部分的值 某时刻 101 0111000 5 读进0 1010 111000 52=10 读进1 10101 11000 102+1=21
5个状态即可,分别代表已读部分的值除以5的余数例 DFA,识别{0,1}上能被5整除的二进制数0123开始410010101012.3有限自动机
10102=10101112=710例 DFA,接受0和1的个数都是偶数的字符串00003211奇0奇1奇0偶11011开始偶0偶1偶0奇12.3有限自动机
2.3.3NFA到DFA的变换
子集构造法 1、DFA的一个状态是NFA的一个状态集合
2、读了输入a1a2…an后,
NFA能到达的所有状态:s1,s2,…,sk,则
DFA到达状态{s1,s2,…,sk}12a开始0abb{0}{0,1}aba{0,2}b2.3有限自动机
未画完19开始0abab6782345
例 (a|b)*ab,NFA如下,把它变换为DFA2.3有限自动机
19开始0abab6782345输入符号ab状态
2.3有限自动机
19开始0abab6782345输入符号abA状态
A={0,1,2,4,7}
2.3有限自动机
19开始0abab6782345输入符号abAB状态
A={0,1,2,4,7}B={1,2,3,4,6,7,8}
2.3有限自动机
19开始0abab6782345输入符号abABB状态
A={0,1,2,4,7}B={1,2,3,4,6,7,8}2.3有限自动机
19开始0abab6782345输入符号abABCB状态
A={0,1,2,4,7}B={1,2,3,4,6,7,8}C={1,2,4,5,6,7}
2.3有限自动机
19开始0abab6782345输入符号abABCBC状态
A={0,1,2,4,7}B={1,2,3,4,6,7,8}C={1,2,4,5,6,7}2.3有限自动机
19开始0abab6782345输入符号abABCBBC状态
A={0,1,2,4,7}B={1,2,3,4,6,7,8}C={1,2,4,5,6,7}2.3有限自动机
19开始0abab6782345输入符号abABCBBDC状态
A={0,1,2,4,7}B={1,2,3,4,6,7,8}C={1,2,4,5,6,7}D={1,2,4,5,6,7,9}
2.3有限自动机
19开始0abab6782345输入符号abABCBBDCD状态
A={0,1,2,4,7}B={1,2,3,4,6,7,8}C={1,2,4,5,6,7}D={1,2,4,5,6,7,9}
2.3有限自动机
19开始0abab6782345输入符号abABCBBDCBCD状态
A={0,1,2,4,7}B={1,2,3,4,6,7,8}C={1,2,4,5,6,7}D={1,2,4,5,6,7,9}
2.3有限自动机
19开始0abab6782345输入符号abABCBBDCBCDBC状态
A={0,1,2,4,7}B={1,2,3,4,6,7,8}C={1,2,4,5,6,7}D={1,2,4,5,6,7,9}
2.3有限自动机
19开始0abab6782345输入符号abABCBBDCBCDBC状态
BD开始aAabbabCba2.3有限自动机
19开始0abab6782345BD开始aAabbabCba12开始a0abbab识别语言(a|b)*ab
的自动机2.3有限自动机
19开始0abab6782345BD开始aAabbabCba12开始a0abbab识别语言(a|b)*ab
的自动机子集构造法不一定得到最简DFA2.3有限自动机
BD开始aAabbaa,bCbaEb2.3.4DFA的化简死状态在转换函数由部分函数改成全函数表示时引入左图需要引入死状态E;右图无须引入死状态BD开始aAabbabCba2.3有限自动机
可区别的状态A和B是可区别的状态
从A出发,读过单字符b构成的串,到达非接受状态C,而从B出发,读过串b,到达接受状态DA和C是不可区别的状态 无任何串可用来像上面这样 区别它们BD开始aAabbabCba2.3有限自动机
方法1.{A,B,C},{D}move({A,B,C},a)={B}move({A,B,C},b)={C,D}2.{A,C},{B},{D}move({A,C},a)={B}move({A,C},b)={C}BD开始aAabbabCba12开始a0abbab2.3有限自动机
从正规式建立识别器的步骤从正规式构造NFA(本节介绍) 用语法制导的算法,它用正规式语法结构来指导构造过程把NFA变成DFA(子集构造法,已介绍)将DFA化简(合并不可区别状态,也已介绍)2.4从正规式到有限自动机首先构造识别和字母表中一个符号的NFA重要特点:仅一个接受状态,它没有向外的转换i开始识别正规式的NFAafif开始识别正规式a的NFA2.4从正规式到有限自动机构造识别主算符为选择的正规式的NFA重要特点:仅一个接受状态,它没有向外的转换
fi开始识别正规式s|t的NFAN(s)N(t)2.4从正规式到有限自动机构造识别主算符为连接的正规式的NFA重要特点:仅一个接受状态,它没有向外的转换识别正规式st的NFAiN(s)f开始N(t)2.4从正规式到有限自动机构造识别主算符为闭包的正规式的NFA重要特点:仅一个接受状态,它没有向外的转换N(s)f开始识别正规式s*的NFAi2.4从正规式到有限自动机对于加括号的正规式(s),使用N(s)本身作为它的NFA2.4从正规式到有限自动机本方法产生的NFA有下列性质N(r)的状态数最多是r中符号和算符总数的两倍N(r)只有一个接受状态,接受状态没有向外的转换2.4从正规式到有限自动机19开始0abab6782345本方法产生的NFA有下列性质N(r)的每个状态有一个用的符号标记的指向其它结点的转换,或者最多两个指向其它结点的转换2.4从正规式到有限自动机19开始0abab67823452.4从正规式到有限自动机
19开始0abab6782345r9r7r8r4r3r5r6*)(r2r1a|bab(a|b)*ab的分解2.4从正规式到有限自动机
19开始0ab678ab2345r9r7r8r4r3r5r6*)(r2r1a|bab(a|b)*ab的分解2.4从正规式到有限自动机
19开始0abab6782345r9r7r8r4r3r5r6*)(r2r1a|bab(a|b)*ab的分解2.4从正规式到有限自动机
19开始0abab6782345r9r7r8r4r3r5r6*)(r2r1a|bab(a|b)*ab的分解2.4从正规式到有限自动机
19开始0abab6782345r9r7r8r4r3r5r6*)(r2r1a|bab(a|b)*ab的分解2.4从正规式到有限自动机19开始0abab6782345r9r7r8r4r3r5r6*)(r2r1a|bab(a|b)*ab的分解2.4从正规式到有限自动机
19开始0abab6782345r9r7r8r4r3r5r6*)(r2r1a|bab(a|b)*ab的分解
(a|b)*ab的两个NFA的比较12开始a0abb手工构造:算法构造:2.4从正规式到有限自动机19开始0abab6782345小结:从正规式建立识别器的步骤从正规式构造NFA把NFA变成DFA将DFA化简存在其它办法2.4从正规式到有限自动机
用Lex建立词法分析器的步骤Lex编译器Lex源程序lex.llex.yy.cC编译器lex.yy.ca.outa.out输入流记号序列2.5词法分析器的生成器Lex程序包括三个部分声明%%翻译规则%%辅助过程Lex程序的翻译规则p1 {动作1}p2 {动作2}… …pn {动作n}2.5词法分析器的生成器例——声明部分%{/*常量LT,LE,EQ,NE,GT,GE, WHILE,DO,ID,NUMBER,RELOP的定义*/%}/*
正规定义
*/delim [\t\n]ws {delim}+letter [AZaz]digit [09]id {letter}({letter}|{digit})*number {digit}+(\.{digit}+)?(E[+\]?{digit}+)?2.5词法分析器的生成器例——翻译规则部分{ws} {/*
没有动作,也不返回*/}while {return(WHILE);}do {return(DO);}{id} {yylval=install_id();return(ID);}{number} {yylval=install_num(); return(NUMBER);}“<” {yylval=LT;return(RELOP);}“<=” {yylval=LE;return(RELOP);}“=” {yylval=EQ;return(RELOP);}“<>” {yylval=NE;return(RELOP);}“>” {yylval=GT;return(RELOP);}“>=” {yylval=GE;return(RELOP);}2.5词法分析器的生成器例——辅助过程部分installId(){ /*
把词法单元装入符号表并返回指针。 yytext指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 超市消毒常见试题及详细答案
- 净餐馆测试题目及答案
- 2026年计算机网络设备配置与调试综合测试卷
- 2026年心理健康促进策略专项训练题库
- 2026年古代民俗与艺术素养测试
- 2026年管理学原理期末复习习题集
- 2026年心理素质提升策略与实践习题集
- 2026年金融风险管理实务模拟题
- 2026年国防教育与青少年成长专题训练题库
- 2026年计算机网络安全知识测试卷
- 【新教材】人教版(2024)九年级上学期物理(13-17章)必背知识清单
- 2026乐山市市中区国有企业第二批社会招聘6人考试模拟试题及答案详解
- 2026年周口市国有污水处理厂社会公开招聘19人笔试模拟试题及答案详解
- 体育教师教学基本功比赛理论考试试题及答案
- 小学一年级数学《分一分》跨学科主题式教学设计
- 镇江润扬交通工程有限责任公司招聘笔试题库2026
- 江苏《城镇供水水表安装及维护技术规程》
- 陕西省宝鸡市2026年初一新生入学分班数学考试真题及答案
- 《2026年》药品检验岗位高频面试题包含详细解答
- 高考日语基础归纳总结与练习(一轮复习)
- 2022年江苏苏州昆山市委老干部局招聘编外工作人员笔试备考题库及答案解析
评论
0/150
提交评论