第3章 词法分析和词法分析程序
- 格式:pps
- 大小:1.40 MB
- 文档页数:39
Lw.《编译原理》课后习题答案第一章第1章引论第1题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第2题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
盛威网()专业的计算机学习网站1《编译原理》课后习题答案第一章目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
编译原理作业集-第三章-修订版第三章词法分析本章要点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所对应的状态转换图为。
第一章编译程序概述1.1 什么是编译程序编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都含有不止一个高级语言的编译程序。
对有些高级语言甚至配置了几个不同性能的编译程序。
1.2编译过程概述和编译程序的结构编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。
从概念上来讲,一个编译程序的整个工作过程是划分成阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的。
一般一个编译过程划分成词法分析、语法分析、语义分析、中间代码生成,代码优化和目标代码生成六个阶段,这是一种典型的划分方法。
事实上,某些阶段可能组合在一起,这些阶段间的源程序的中间表示形式就没必要构造出来了。
我们将分别介绍各阶段的任务。
另外两个重要的工作:表格管理和出错处理与上述六个阶段都有联系。
编译过程中源程序的各种信息被保留在种种不同的表格里,编译各阶段的工作都涉及到构造、查找或更新有关的表格,因此需要有表格管理的工作;如果编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些编译程序还能自动校正错误,这些工作称之为出错处理。
图1.3表示了编译的各个阶段。
图1.3 编译的各个阶段1.3 高级语言解释系统为了实现在一个计算机上运行高级语言的程序,主要有两个途径:第一个途径是把该程序翻译为这个计算机的指令代码序列,这就是我们已经描述的编译过程。
第二个途径是编写一个程序,它解释所遇到的高级语言程序中的语句并且完成这些语句的动作,这样的程序就叫解释程序。
从功能上说,一个解释程序能让计算机执行高级语言。
它与编译程序的主要不同是它不生成目标代码,它每遇到一个语句,就要对这个语句进行分析以决定语句的含义,执行相应的动作。
右面的图示意了它的工作机理第二章:PL/0编译程序问答第1题PL/0语言允许过程嵌套定义和递归调用,试问它的编译程序如何解决运行时的存储管理。
编译原理第三章词法分析和词法分析程序设计扫描器时应考虑的问题▪词法分析程序亦称为扫描器▪任务:扫描程序,识别单词▪扫描器的输出是语法分析程序的输入词法分析的必要性▪描述单词的结构比其它语法结构简单,仅用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εεεε在实际的构造中,我们可省略一些ε矢线。