lect3lexical23.docx
《lect3lexical23.docx》由会员分享,可在线阅读,更多相关《lect3lexical23.docx(18页珍藏版)》请在冰豆网上搜索。
![lect3lexical23.docx](https://file1.bdocx.com/fileroot1/2022-11/27/7a108866-55b9-4e48-b0cf-a3d7af5f54bb/7a108866-55b9-4e48-b0cf-a3d7af5f54bb1.gif)
lect3lexical23
北京大学信息科学技术学院
2015年春季学期《编译技术》
第3章词法分析
(2)
LexicalAnalysis
【对应教材3.3-3.5】
上节内容回顾
☐词法分析器的作用
Token(词法单元)
源程序
☐词法单元的描述方法
⏹字母表、符号串和语言
⏹正则集合、正则表达式和正则定义
ReviewQuestions
☐写一个正则表达式,表示所有能被5整除的十进制数。
☐写一个正则表达式,表示所有能被5整除的不包含前导0的十进制数。
☐写一个正则表达式,表示所有能被5整除的二进制数。
☐词法分析器的作用
☐词法单元的规约
⏹串和语言;正则表达式、正则定义
☐词法单元的识别
☐词法分析器生成工具—LEX
☐有限自动机(FiniteAutomata)
☐正则表达式到有限自动机
☐词法分析器生成工具的设计
☐一般有两种方式:
⏹借助状态转换图(有限自动机的图形表示)手工构造词法分析器。
⏹通过LEX自动生成词法分析器。
o正则表达式
⇒NFA
⇒DFA
⇒minDFA
⇒词法分析器
☐状态转换图(transitiondiagram)
⏹状态(state):
表示在识别词素时可能出现的情况
o状态看作是已处理部分的总结
o某些状态为接受状态或最终状态,表明已找到词素
o加上*的接受状态表示最后读入的符号不在词素中
o开始状态(初始状态):
用“开始”边表示
⏹边(edge):
从一个状态指向另一个状态;边的标号是一个或多个符号
o当前符号为s,下一个输入符号为a,就沿着从s离开,标号为a的边到达下一个状态
eturn(relop,LE)return(relop,NE)return(relop,LT)
return(relop,GE)return(relop,GT)
letter或digit
开始letterother*
11
return(getToken(),
installId())
number→digit+(.digit+)?
(E(+|-)?
digit+)?
digit
E
digit
digit
digit
开始12digit13.
14digit15E
+/-
16
digit
1718
other
other
other
*
19
delim→blank|tab|newlinews→delim+
delim
手动编写词法分析程序:
以relop为例
TOKENgetRelop()
{TOKENretToken=new(RELOP);
while
(1){/*反复读入字符,直到return或遇到错误*/switch(state){
case0:
c=nextChar();
if(c=='<')state=1;elseif(c=='=')state=5;elseif(c=='>')state=6;
elsefail();/*非关系算符*/break;
case1:
……
……2
=
return(relop,LE)
case8:
retract();
retToken.attribute=GT;return(retToken);开始
1>
<
other
3
return(relop,NE)
4*return(relop,LT)
}0=
}>
5
return(relop,EQ)
}
2015年春季学期《编译技术》课程
=
6other
7
return(relop,GE)8*return(relop1,G1T)
o首先通过正则表达式来描述词法单元的模式
o基本目标:
判断一个串s是否属于一个正则表达式R表示的语言
s∈L(R)
o在现实中,还要能够连续识别多个不同类别的词法单元
if(a==b)…
(1)分别为每一类词法单元写出正则表达式Ri
(2)构造一个正则表达式R来匹配所有的词法单元
R=R1|R2|…|Rk
(3)
设输入为x1x2…xn,对1≤i≤n,检查是否x1…xi∈L(R)
(4)如果匹配成功,则存在j,使得
x1…xi∈L(Rj)
(5)把x1…xi从输入中移走,继续执行(3)
o如何确定匹配的长度?
n有可能多个前缀都可以产生匹配
n解决办法:
匹配最长可能的串
o选择哪个正则表达式来匹配?
n有可能多个正则表达式都可以匹配
n解决办法:
排在前面的正则表达式优先匹配
o如果所有正则表达式都不能匹配怎么办?
n怎么报错?
n解决办法:
可以构造一个ERROR正则表达式,放到所有表达式在后面,用来报告错误信息
14
Quiz:
选择题
o使用如下的词法描述,在识别字符串
“dictatorial”的过程中会如何进行分割?
dict
(1)
dictator
(2)
[a-z]*(3)
dictatorial(4)
a)4
b)3
c)1,3
d)2,3
内容提要
o词法分析器的作用
o词法单元的规约
n串和语言;正则表达式、正则定义
o词法单元的识别
o词法分析器生成工具—LEX
o有限自动机(FiniteAutomata)
o正则表达式到有限自动机
o词法分析器生成工具的设计
Lex简介
oLex是一种词法分析程序的自动构造工具。
n通常和Yacc一起使用,生成编译器的前端
o实现原理:
n根据给定的正则表达式自动生成相应的词法分析程序。
n利用正则表达式与DFA的等价性
o转换方式:
正则表达式⇒NFA⇒DFA⇒minDFA
用Lex建立词法分析程序的过程
LEX源程序lex.1
lex.yy.c
Lex.yy.cyylex
输入串单词序列
o一个LEX源程序主要由三个部分组成:
n声明
n转换规则及动作
n辅助子程序
o各部分之间用%%隔开
o声明包括变量,C语言常量和正则定义式。
o词法分析器返回给语法分析器一个单词,把单词的属性值存放于全局变量yylval中。
19
o转换规则及动作的形式为:
p1{动作1}
p2{动作2}
……
pn{动作n}
o每个pi是正则定义式的名字,每个动作i是正则定义式pi识别某类单词时,词法分析器应执行动作的程序段。
n动作用C语言书写。
o辅助子程序是执行动作所必需的。
n这些子程序用C语言书写,可以分别进行编译。
词法分析器的工作方式
oLex生成的词法分析器作为一个函数被调用
o在每次调用过程中,不断读入余下的输入符号
o发现最长的、与某个模式匹配的输入前缀时
,调用相应的动作;
n该动作进行相关处理,并把控制返回;
n如果不返回,则词法分析器继续寻找其它词素
22
{ws}{/*noactionandnoreturn*/}If{return(IF);}
then{return(THEN);}else{return(ELSE);}
{id}{yylval=(int)installID();rettirn(ID);}
{number}{yylval=(int)installNum();return(NUMBER);}
"<"{yylval=LT;return(RELOP);}"<="{yylval=LE;return(RELOP);}"="{yylval=EQ;return(RELOP)j}"<>"{yylval=NE;return(RELOP);}">"{yylval=GT;return(RELOP);}">="{yylval=GE;return(RELOP);}
%%
intinstallID()/*向符号表添加指向yytext,长度为yyleng的词法单元*/intinstallNum()/*把数字常量添加到另外一个单独的表格中*/
o冲突:
多个输入前缀与某个模式相匹配,或者一个前缀和多个模式匹配
oLex解决冲突的方法
n多个前缀可能匹配时,选择最长的前缀
☐E.g,保证词法分析器把<=当作一个词法单元
n某个前缀和多个模式匹配时,选择列在前面的模式
☐E.g,如果保留字的规则在标识符的规则之前,词法分析器将识别出保留字
o词法分析器的作用
o词法单元的规约
n串和语言;正则表达式、正则定义
o词法单元的识别
o词法分析器生成工具—LEX
o有限自动机(FiniteAutomata)
o正则表达式到有限自动机
o词法分析器生成工具的设计
o有限自动机是词法分析器生成工具(Lex)的关键技术。
n正则表达式→有限自动机→词法分析程序
o有限自动机与状态转换图类似,但是有限自动机是识别器,只能对每个可能的输入串简单地回答“yes”or“no”。
o有限自动机可以分为两类:
n确定的有限自动机(DFA)
n不确定的有限自动机(NFA)
确定的有限自动机(DeterministicFA)
定义一个确定的有限自动机M(记作DFAM)
是一个五元组M=(Σ,Q,qn,F,δ),其中
(1)Σ是一个有限字母表,它的每个元素称为一个输入符号。
(2)Q是一个有限状态集合。
(3)q0∈Q,q0称为开始状态。
(4)F⊆Q,F称为终止状态(或接受状态)集合。
(5)δ是一个从Q×Σ到Q的单值映射(称为转换函数)δ(q,a)=q'(q,q'∈Q,a∈Σ)
表示当前状态为q,输入符号为a时,自动机M将转换到下一个状态q',q'称为q的一个后继。
27
DFA的表示形式
可以使用转移矩阵来表示
使用状态转换图来表示
输入
状态
a
b
0
1
2
1
3
2
2
1
3
3
3
3
29
DFAM接受的语言
如果对所有w∈Σ*,以下述方式递归地扩展δ的定义
δ(q,ε)=q
δ(q,wa)=δ(δ(q,w),a)
对任何a∈Σ,q∈Q,则有
L(M)={w|w∈Σ*,若存在q∈F,
使δ(q0,w)=q}
对于前面例子中的DFAM和w=baa,有δ(0,baa)=δ(2,aa)=δ(1,a)=3
30
b
a
b
DFA示例-1
字母
0字母1
Pascal标识符
Pascal整数和实数
32
识别∑={0,1}上能被能5整除的二进制数
o画一个DFA,表示所有能被32整除的二进制数。
o画一个DFA,表示所有除32余1的二进制数
。
非确定的带ε_转移的有限自动机NFA
定义:
非确定的带ε_转移的有限自动机NFAM是一个五元组
M=(Σ,Q,q0,F,δ)
其中Σ,Q,q0,F的意义和DFA的定义一样,而δ是一个从Q×(Σ∪{ε})到Q的子集的映射,即
δ:
Q×Σ∪{ε}→2Q
和DFA类似,NFAM也可以用状态转换图表示,也可以定义NFAM接受的语言。
a
b
a
b
4
oNFA接受的字符串和语言
n如果在NFA中存在一个从开始状态到接受状态的路径,该路径上的符号序列构成的字符串是w,那么称该NFA可以接受字符串w
☐一个字符串在NFA中可能对应不同的接受路径
☐NFA接受的字符串可能存在其他不能接受的路径
☐如果在某个状态对于输入字符a不存在可用的转移动作
,那么不能通过该路径接受当前的字符串
n一个NFAM接受的所有字符串的集合构成该NFA所接受的语言L(M)
oDFA是NFA的一种特例
nDFA的表达能力与NFA是等价的
o给出接受(a|b)*a(a|b)(a|b)的DFA。
o指出下面的正则表达式描述的语言,并画出接受该语言的最简DFA的状态转换图。
(1|01)*0*
作业
o下周五交
☐Ex.3.6.2(本Ex.3.5.2)(1,2,3,6,9小题)