第3章 词法分析和词法分析程序
词法分析及词法分析程序

– w,p,n初值为0,e初值为1;
– 处理整数部分时,对于每个di ,令w=w10+di ; – 处理小数部分时,对于每个di ,令w=w10+di ;及n++;
– 处理指数时,E后若有‘-’号,令e=-1;计算指数值 p=p10+d;
– 在出口处,令ICON=w或FCON=w10^(e(p-n)).
(2)设当前处在Ai状态,所扫描的字符为ai+1,在结点Ai所 射出的诸矢线中,寻找标记为ai+1的矢线(若不存在,则 表明w有语法错误),读入ai+1,并进入状态Ai+1;
(3)重复(2),直到w中所有字符被读完且恰好进入终态F 时,宣告整个识别结束,w可被接受.
28
例:G[Z]:
状态转换图:
Z→0U∣1V
{return ( ICON= w ); {n++; w=w*10+d;}
{return (FCON =w*pow(10,e*p-n) ) ;} {n++;w=w*10+d;} error {p=p*10+d;}
e=-1; error {p=p*10+d;} error {p=p*10+d;} {return (FCON=w*pow(10,e*p-n) );
(1)对于G中形如Aa 的产生式,引矢线RA,且标记
为a;
(2)对于G中形如ABa 的产生式,引矢线 BA,且标
记为a。
34
由左线性文法构造状态转换图
已给文法G=({S,U},{0,1},{SS1 |U1, UU0 | 0},S)
R0
0
1
U1 S
《编译原理》第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. 词法分析程序算法
北京航空航天大学计算机学院
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
‘*’ : ‘,’ : ‘(’ : ‘)’ : ‘:’ :
第三章 词法分析及词法分析程序 课后答案【khdaw_lxywyl】

课 后 答 案 网
第三章 词法分析及词法分析程序 1 试用某种高级语言编写一个 FORTRAN 源程序的预处理子程序,其功能是: 每调用它一次, 即把源程序中的一个完整语句送入扫描缓冲区。要求删去语句中的注释行;删去续行标记字 符,把语句中的各行连接起来,并在语句的末端加上语句结束符。此外,还要求此程序具有 组织源程序列表输出的功能。 2 画出用来识别如下三个关键字的状态转移图。 STEP STRING SWITCH 3 假定有一个猎人带着一只狼、一头山羊和一棵白菜来到一条河的左岸,拟摆渡过河,而岸 边只有一条小船,其 大小仅能装载人和其余三件东西中的一件,也就是说,每一次猎人只 能将随行者中的一件带到彼岸。若猎人将狼和山羊留在同一岸上而无人照管,那么,狼就会 将羊吃掉;如果猎人把山羊和白菜留在同一岸,山羊也会把白菜吃掉。现在,请你用状态转
试找出一个长度最小的输入串,使得:
h (1) 在识别此输入串的过程中,每一状态至少经历一次;
(2) 每一状态转换至少经历一次。 9 对于下列的状态转换矩阵:[]a[]bS[]A[]SA[]A[]BB[]B[]B(i) 初态:S
k 终态:B[][][]a[]bS[]A[]BA[]B[]AB[]B[]B(ii) 初态:S
26 指出下列 LEX 正规式所匹配的字符串:
. (1) "{" [^{]*"}"
(2) ^[^a-z][A-Z][0-9]$ (3) [^0-9]|[\r\n]
w (4) \′([^′\n]|\′\′)+\′
(5) \"([^"\n]|\\["\n])*\"
a 27 写出一个 LEX 正规式,它能匹配 C 语言的所有无符号整数 (例如:OX89ab,0123,45,
编译原理词法分析及词法分析程序

状态图=>右线性文法
文法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 输出单分符/
注释处理
读字符
清华大学编译原理第二版课后习答案

Lw.《编译原理》课后习题答案第一章第1章引论第1题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第2题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
盛威网()专业的计算机学习网站1《编译原理》课后习题答案第一章目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
第3章 词法分析(3)

3.4 正规式与有穷自动机的等价性
1. NFA M正规式R
在消结过程中,逐步用正规式来标记弧, 规则如下:
1.对于
1
2.对于
R1
2
R2
代之为
3
1
R1 R2
3
代之为 R1 R1| R2 1 2 1 2 R2 R2 3.对于 代之为 R1R2﹡R3 R 1 R 3 1 3 1 2 3
例如:有NFA M如图3.14,求其等价的正规式R。
a,b a 3
x ε 0 b 1 a|b a|b x ε 0
aa
a
4
ε
b
y (a|b)*(aa|bb)(a|b)* x y ε 2 a,b a|b aa(a|b) * y bb(a|b) *
4
ε y x
bb
2
ε
a|b
ε
0
3.4 正规式与有穷自动机的等价性
课堂练习 求以下NFA的正规式 a a 3 a 1 2 b
第一步
a
5 6 b
b
4
b
a
a
3
a
a
s
1 2
b
5 b
4 b
6 b
z
3.4 正规式与有穷自动机的等价性
第二步
a|b s 1 2
aa bb aa|bb 5
a|b
6
z
第三步
s
第四步
(a|b)*
2
5
(a|b)*
z
s
(a|b)*(aa|bb)(a|b)*
z
课堂讲解
• 【例5.12】第72页 • 【例5.13】第73页
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理第三章词法分析和词法分析程序设计扫描器时应考虑的问题▪词法分析程序亦称为扫描器▪任务:扫描程序,识别单词▪扫描器的输出是语法分析程序的输入词法分析的必要性▪描述单词的结构比其它语法结构简单,仅用3型文法就够了;▪将单词识别从语法分析识别分离出来,可采用更有效的工具实现;▪有些语言的单词识别与前后文相关,不宜将其与语法分析合并;▪使编译程序各部分独立出来,有利于设计、调试和维护单词符号的内部表示▪常用的内部表示方法: (class,value)▪为便于阅读,常用助记符(或常量标识符、宏定义等)表示class。
▪在识别出变量名、函数(过程)名时,还应进行查填符号表的工作。
识别标识符的若干约定和策略▪在允许长度下,应按最长匹配原则进行识别▪有时需要超前扫描来进行单词识别。
由正规文法构造状态转换图例:正规文法如下:3.2 正规文法和状态转换图<无符号数> → d.<余留无符号数><无符号数> → .<十进小数><无符号数> → E<指数部分><余留无符号数> → d<余留无符号数> <余留无符号数> → .<十进小数><余留无符号数> → E<指数部分><余留无符号数> → ε<十进小数> → d<余留十进小数><余留十进小数> → d<余留十进小数> <余留十进小数> → E<指数部分><余留十进小数> → ε<指数部分> → d<余留整指数><指数部分> → +<整指数><指数部分> → -<整指数><整指数> → d<余留整指数><余留整指数> → d<余留整指数><余留整指数> → ε所对应的状态转换图123456dd••dd dd dEE+ | -无符号数的状态转换图3.2 正规文法和状态转换图由正规文法构造状态转换图▪程序设计语言的单词都能用正规文法描述▪一般说来,凡能用正规文法描述的语言,均可由某种有限状态算法——状态转换图进行分析▪状态转换图:▪有向图(一个初态+N个终态)▪射出结点,进入结点由右线性文法构造状态转换图1.|V N |=K ,则所要构造的状态转换图共有K+1个状态(结点)•构造规则:A →aB ,A →a ,A →εAFBaaA2. 识别串:字符串w=a1a2…a n, a i∈V T•实际:建立推导S⇒* w3.(1) 自顶向下(2) 从S出发:a1a2…a k A k(3) 对任一句子y,必存在一条路从S至F,各标记相连即y显然,若我们从初态出发,分别沿一切可能的路径到达终态结点,并将中径中矢线上所标记的字符依次连接起来,便得到状态转换图所能识别的全部符号串,这些符号串组成的集合构成了该文法识别的语言——句子必有一条从初态S到终态F的路径,此路径上各矢线的标记依次拼接起来所组成的符号串恰为该句子▪由左线性文法构造状态转换图▪初态R(∉V N )▪构造规则A →aA →Ba▪例:文法G=({S,U},{0,1},{S →S1 |U1, U →U0 | 0},S)•识别句子00011▪归约——对应的语法树BAaRAaRU1S1B ij :a 1…a mS 1B 11…B 1m S 2B 21…B 2m…S nB n1…B nmS iB ija j若无则置“出错”太浪费!!!用有效的数据结构如表3-1构造状态矩阵,控制程序对单词加以识别控制程序大都相同,状态矩阵不同开始初始化getchar()查状态矩阵(state, symbol )end?回退一个字符返回(R, N )实数类码二进制浮点正规表达式构造识别该正规表达式的带ε的自动机将ε-自动机转化为DFA,并且最小化根据最小化的DFA构造状态矩阵编写控制程序,对词法进行识别有限自动机▪状态转换图实际上是有限自动机的图形表示▪DFA NFA确定的有限自动机DFA▪五要素M=(K, ∑, f , S0, Z )状态集合字母表状态映射初态终态集状态映射f:K⨯∑→K可将f定义域推广为K⨯∑* →K(1) f^ (s,ε)=s, s∈K;(2) f^ (s,aw)=f^ ( f(s,a),w), s∈K, a∈∑, w∈∑*; 所以,f与f^不可区分▪DFA M识别∑*中的x:从初态S0出发,经一恰好标有x 的路径后可达到某终态S∈Z即:f(S0,x)=S,S∈Z▪M的接受集L(M)={ x| f(S,x) ∈Z, x∈∑* }▪DFA:给一状态,一字符,则唯一确定下一状态▪任一正规文法G,都存在一个DFA M,使得:L(G)=L(M)对于文法:G=({S,A,B,C,D}, {a,b,c,d},P,S),P由如下产生式组成:S→aA|B A→abS|bB B→b|cC C→DD→d|bB(1)构造该文法的状态转换图(2)构造一等价的左线性文法非确定的有限自动机▪NFA M=(K, ∑, f , S 0, Z )▪f :K ⨯∑→ρ(K),即将(Si ,a j )映射到K 的一个子集{S k 1,…,S k m } 即:下一状态不唯一▪可类似地,把f 的定义域拓广到K ⨯∑*(1) f^(S,ε)={S};(2) f^(S,aw)=f^(f(S,a),w) a ∈∑,w ∈∑*mi k k k k w S f w S S S f w a S f f aw S f i m 1^^^^),()},,,,({)),,((),(21====的接受集▪L(M)={x | f(S 0, x )∩Z ≠∅, x ∈∑}▪例:S ABCaa,b ab baa识别符号串ababbNFA 与DFA 的等价性▪NFA 的确定化:构造一DFA ,使得它们有相同的接受集▪思路:使DFA 的状态与NFA 某一状态子集相同S 0S 1abba|b定理3.1例:M=({S 0,S 1}, {a,b}, f, S 0, {S 1}) 此确定化算法的弱点具有ε动作的FA▪允许对ε作转移▪例:0123εεεa bbcf 也可以拓广到f ’: K ⨯∑* →ρ(K). f ’(S,x)是由这样的状态Q 组成,存在从S 到Q 的路径,该路径上的连线标记组成的符号串恰好为x ,其中,允许有有限个标记为ε串aacc 可被接受S的ε-闭包:ε-CLOSURE(S)▪定义(1)S∈ε-CLOSURE(S);(2)设S j∈ε-CLOSURE(S),且S j →εS k,则S k∈ε-CLOSURE(S);(3)有限地使用规则(2)所得的集合为ε-CLOSURE(S).▪例0123εεεabbc的定义Rq Rq KKKw S f q w q f w R f a q f a R f K R R f R f f a q f a w S f f P P CLOSURE wa S f S CLOSURE S f w a K S ∈∈∈==⊆∈∀→∑⨯==-=-=∑∈∑∈∈∀),(),()4(),(),(:)(2,22:)2(,)3(),()),,((,);(),()2();(),()1(,,^^*^),(^^^*^对的定义拓广到及将实际上其中εεεf与f^不相等f(S,a) ⊆ε-CLOSURE(f(S,a)) ⊆f^(S,a)只走一步a矢线| 多步,第一步必须走a矢线| 路径a :第一步可以是ε矢线ε-NFA的接受集:L(M)={w|f^(S0,w)∩Z≠∅} ε-NFA的用途:构造更复杂的FA5ε-FA 的确定化▪构造一DFA ,使得它与ε-FA 等价。
▪例0123εεεa bbc试将下面的ε-FA 确定化为DFA:S125634εεεεaaa abbbbF6DFA状态数的最小化▪对一个DFA M,构造另一个DFA M’,使得:L(M) = L(M’),后者有最小的状态数▪可区分状态:s,t ∈K,若∍w∈∑*,f(s, w) = q ∈Z,而f(t, w) = p ∉Z,则s,t为一串w所区分▪s和t等价:∀w,f(s,w) ∈Z,f(t,w) ∈Z▪所以,可以将等价的状态合并▪算法主要思想:将K划分为r个互不相交的子集,子集内任何两个状态是等价的,而不同子集任两个状态可区分。
▪例:S2S4b aaabbS0S1S3ba ab正规表达式及正规集▪L(G)≡L(M),即:正规文法与FA等价▪所以,现在来为一个正规表达式构造一等价的FA正规表达式及正规集的定义▪举例▪定义设∑是一字母表,则∑上的正规表达式(正则表达式,正规式)及其表示的正规集可递归定义如下:▪(1) φ是一正则表达式, 相应的正规集为φ;▪(2) ε是一正则表达式, 相应的正规集为{ε};▪(3) ∀a∈∑, a 是一正则表达式, 相应的正规集为{a};▪(4) 设r, s是正则表达式, 且它们所表示的正规集为Lr, Ls,则• 1. (r) •(s)是正则表达式, 相应的正规集为Lr•Ls;• 2. (r)|(s)是正则表达式, 相应的正规集为Lr ∪Ls;• 3. (r)*是正则表达式, 相应的正规集为Lr*▪有限地使用上面的规则(4),所得的表达式均是正规表达式▪a*, aa*, a|ba*, (a|b) (a|b) (a|b)*▪正规集1:n 正规式▪正规式r =正规式s L r =L sA1. r|s=s|r A2. r|r=rA3. r|φ=r A4. (r|s)|t=r|(s|t)A5. (rs)t=r(st)A6. r(s|t)=rs|rtA7. (s|t)r=sr|st A8. rφ=φr=φA9. rε=εr=r A10. r*=(ε|r)*=ε|rr*由正规文法构造相应的正规式▪例:S→aS | bA | b,A→aS 则所产生的正规集为▪论断3.1 方程x= rx + t 有解x= r*t▪例S→bS|aA A→aA|bBB→aA|bC|b C→bS|aA▪左线性文法:x=xr+t的方程,有解x=tr*正规式构造FA−Thompson法▪对运算符个数n进行递归▪算法:1、n=0时:r=φr=εr=a∈∑s f f s fa2、设当n=1,2,…,k-1时,M均可构造,当n=k时,根据正规式的定义,r只能是r1|r2, r1•r2, r1*这三种形式之一.其中, r1,r2中最多含k-1个运算符,且设相应的自动机为M1=(K1, ∑,f1,S01,{S f1})L(M1)=L r1M2=(K2, ∑,f2,S02,{S f2})L(M2)=L r2K1∩K2=∅法(续)(1) r= r 1|r 2,引入新开始状态S 0,终态S f ,将M 1,M 2并联:S 01S f1S 02S f2sS f εεεε(2) r=r 1∙r 2,将M 1,M 2串联S 01S f1S 02S f2ε(3) r=r*,引入新开始状态S 0,终态S f ,令原M 1构成循环S 01S f1S S fεεεε在实际的构造中,我们可省略一些ε矢线。