lect3lexical23.docx

上传人:b****5 文档编号:4097157 上传时间:2022-11-27 格式:DOCX 页数:18 大小:405.26KB
下载 相关 举报
lect3lexical23.docx_第1页
第1页 / 共18页
lect3lexical23.docx_第2页
第2页 / 共18页
lect3lexical23.docx_第3页
第3页 / 共18页
lect3lexical23.docx_第4页
第4页 / 共18页
lect3lexical23.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

lect3lexical23.docx

《lect3lexical23.docx》由会员分享,可在线阅读,更多相关《lect3lexical23.docx(18页珍藏版)》请在冰豆网上搜索。

lect3lexical23.docx

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小题)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1