2019-2020年编译原理复习资料(1).doc

合集下载

《编译原理》期末复习资料(完整版)

《编译原理》期末复习资料(完整版)

1.给出语言{a n b n a m b m | n,m≥0}的一个上下文无关文法。

(6分)解:G[S]:S—>ABA—>aAb |εB—>aBb |ε2.给出语言{1 n 0 m 1 m0 n | n,m≥0}的一个上下文无关文法。

解:G[S]:S—>1S0 | AA—>0A1 |ε3.P48 第6题(5)、(6).画语法树6、已知文法G:<表达式>::=<项>|<表达式>+<项><项>::=<因子>|<项>*<因子><因子>::=(<表达式>)|i(5)i+(i+i) (6)i+i*i解:(5)语法树:(6)语法树:4.P48第13题直接短语等13、一个上下文无关文法生成句子abbaa的推导树如下:(3)求直接短语解:直接短语有:a ε bP102例题6.1及其分析.( 后加画语法树)例6.1 设文法G[S]为:(1)S—>aAcBe(2)A—>b(3)A—>Ab(4)B—>d对输入串abbcde#进行分析,检查该符号串是否是G[S]的句子。

步骤符号栈输入符号串动作(1)# abbcde# 移进(2)#a bbcde# 移进(3)#ab bcde# 归约(A—>b)(4)#aA bcde#移进(5)#aAb cde# 归约(A—>Ab)(6)#aA cde# 移进(7)#aAc de# 移进(8)#aAcd e# 归约(B—>d)(9)#aAcB e# 移进(10)#aAcBe # 归约(S—>aAcBe)(11)#S # 接受一、计算分析题(60%)1、正规式→ NFA→ DFA→最简DFAP72第1题(1)、(4);第一题1、构造下列正规式相应的DFA.(1)1(0|1)*101解:先构造NFA0 1S AA A ABAB AC ABAC A ABZABZ AC AB除S,A外,重新命名其他状态,令AB为B、AC为C、ABZ为D,因为D含有Z(NFA的终态),所以0 1S AA A BB C BC A DD C B(4) b((ab)*|bb)*ab解:先构造NFA得到DFA如下所示:P72第4题(a)4、把下图确定化和最小化解:确定化:a b0 01 101 01 11 0、{1},其中A为初态,A,B为终态,因此有:a bA B CB B CC A最小化::初始分划得终态组{A,B},非终态组{C}Π0:{A,B},{C},对终态组进行审查,判断A和B是等价的,故这是最后的划分。

编译原理复习材料

编译原理复习材料
a+b=5 a=7 x=5 y=3 b=3 z=7
(4) 所谓传名是在进入调用段之前不对实在参数预先进行计值,而 是过程中每当使用到相应的形参时才对它实行计值。因序),每当过程体中使用到相应 形参时就调用这个子程序。 因此,过程体执行y:=y+1;语句,实现时处理成为: a=a+1; 过程体执行z:=z+x;语句,实现时处理成为: a=a+(a+b); 执行上述两语句后,a的值是 9。因此,程序执行后输出 a的值是 9。 综上所述程序执行时a的输出: (1)传值:2 (2)传地址:8 (3)得结果:7 (4)传名:9 5、几个基本概念 考虑一个有穷字母表∑字符集,其中每一个元素称为一个符号,∑上的
程序是由函数或过程构成的,程序的任务是通过函数或过程之间的 协作(相互调用)l来完成的,函数或过程的调用有以下4种方式:传地 址(call-by-reference)、得结果(call by result)、传值(call-byvalue)和传名(call by name)。 定义函数Swap,其中M、N是形式参数,简称形参。 Void Swap(int M,int N) { int t; t=N; N=M; M=t; } 函数调用: Swap(I,J);其中I和J是实在参数,简称实参。下面我们以下面的 程序为例分别讨论4种参数传递的方式。
(2)这种类型的数据对象可以具有的值; (3)可以作用于这种类型的数据对象的操作。 一个程序语言必须提供一定的初等数据类型,包括这些数据类型上能 进行的运算的定义。不同的语言含有不同的初等数据成分。常见的初等 数据类型有: (1)数值类型:整型、实型、复数、双精度, 运算:+,-,*,/等 (2)逻辑类型:布尔运算:∨,∧,┑ (3)字符类型:符号处理 (4)指针类型:指针式把内存地址作为其值的数据类型,通过指针可 以操作内存空间。 程序语言中的各种名字都是用标识符表示的。标识符是指由字母、 下划线和数字组成的,以字母或下划线为开头的一个字符串。名字和标 识符在形式上难于区别,标识符是一个没有意义的的字符序列,而名字 则有明确的意义和属性。用计算机术语来说,每个名字可看成是代表一 个抽象的存储单元,这个单元可含有一位、一字节或相继的多个字节。 该单元的内容则被认为是名字的值。仅把名字看成代表一定的存储单元 还是不够的,我们还必须同时指出它的属性(数据类型)。只有指定了 属性的存储单元,其值才是可以理解的。 一个名字的属性包括类型和作用域。名字的类型决定了它能具有什 么样的值, 值在计算机内部的表示方式,以及对它能施加什么运算。 名字的作用域规定了它的值的存在范围。 除了初等数据类型外,有些语言还提供了由初等数据构造复杂数据 的手段。常见的复杂数据类型有: (1)数组。一个数组是由同一类型数据所组成的某种n维矩形结 构。数组在内存中占有一块连续的空间,系统采用基地址加偏移量的方 式来访问数组元素。 (2)记录。从逻辑上讲,记录是由已知的数据组合起来的一种结 构。一个记录通常含有若干个分量,每个分量称为记录的一个栏(或域 field)。每个分量都是一个确定类型的数据,不同的分量的数据类型可 以不同。 (3)字符串、表格、栈和队列。 (4)抽象数据类型。抽象数据类型封装了数据和操作,在面向对象 程序设计语言中,Ada通过程序包(package)提供了数据封装的支持, Smalltalk、C++和Java语言则通过类(class)对抽象数据类型提供支 持。 4、函数调用的方式

编译原理期末总结复习

编译原理期末总结复习

编译原理期末总结复习(经典版)编制人:__________________审核人:__________________审批人:__________________编制单位:__________________编制时间:____年____月____日序言下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!并且,本店铺为大家提供各种类型的经典范文,如公文写作、报告体会、演讲致辞、党团资料、合同协议、条据文书、诗词歌赋、教学资料、作文大全、其他范文等等,想了解不同范文格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, this shop provides you with various types of classic sample essays, such as official document writing, report experience, speeches, party and group materials, contracts and agreements, articles and documents, poems and songs, teaching materials, essay collections, other sample essays, etc. Learn about the different formats and writing styles of sample essays, so stay tuned!编译原理期末总结复习编译原理期末总结复习(精选3篇)编译原理期末总结复习篇1一、简答题1.什么是编译程序?答:编译程序是一种将高级语言程序(源程序)翻译成低级语言(目标程序)的程序。

编译原理总复习

编译原理总复习

编译原理总复习总复习■第1章1、编译程序是⼀种翻译程序,它将⾼级语⾔所写的源程序翻译成等价的机器语⾔或者汇编语⾔的⽬标程序。

2、编译程序是计算机系统中重要的系统软件!3、解释程序与编译程序的主要区别是解释程序在执⾏过程中不产⽣⽬标程序。

4、编译的各个阶段。

答:整个编译过程可以分为5个阶段:词法分析,语法分析,语义分析及中间代码⽣成,代码优化和⽬标代码⽣成。

5、编译程序的结构框图或步骤。

6、遍(趟):是对源程序或源程序的中间结果从头到尾扫描⼀遍,并作有关加⼯处理,⽣成新的中间结果或⽬标程序的过程。

■第2章1、符号串的基本运算。

2、简单的说⽂法由产⽣式组成;产⽣式中的符号分为两类:终结符号和⾮终结符号。

3、推导(最左、最右)、句型、句⼦、短语、句柄4、乔姆斯基层次中:L3 ? L2 ? L1 ? L0■第2章例题已知⽂法G[E]:E→T|E+T|E-TT→F|T*F|T/FF→(E)|i(1)该⽂法的开始符号是什么?(2)请给出该⽂法的终结符号集合VT和⾮终结符号集合VN。

(3)找出句型T+T*F+i的所有短语、直接(简单)短语、句柄。

■第3章1、词法分析程序的输出是单词符号序列。

2、DFA的三种表⽰形式——状态转移图、状态转换表和五元组表⽰(Q, ∑, f, S, Z );3、正规式向DFA的转换:(1)正规式——NFA;(转换原则见下页)(2)NFA——DFA;(3)DFA的最⼩化。

4、DFA向正规式的转换。

正则式向NFA转换的原则:例:构造与正则表达式R=ba(a|b)*等价的状态最少的DFA,并写出该DFA的五元组形式或状态转换表。

■第4章1、语法分析⽅法的各种分类;2、LL(1)分析⽅法。

提⽰:在此算法中注意First集和Follow集的求法。

并且⼀定要注意分析过程中步骤要完整。

(分析步骤见下页总结)例:⽂法:S?a|^|(T) T?T,S|S试判断该⽂法是否是LL(1)⽂法。

习题4:P100 4.3 4.7 4.9■LL(1)分析⽅法相关知识总结1、消除⽂法中的左递归或提取左因⼦;(1)简单直接左递归的消除A →βA’A →Aα| β→A’ →αA’| ε(2)将⽂法G:A→αβ|αγ提取左因⼦。

编译原理复习题集.docx

编译原理复习题集.docx

《编译原理》复习题集1.名词解释短语句柄文法上下文无关文法LL (1)文法LR (1)文法语法分析无环路冇向图(DAG) 后缀式语法制导翻译遍局部优化词法分析语法分析语义分析源语言源程序目标语言中间语言(中间表示)2.简答题(1)编译程序和高级语言有什么区别?(2)编译程序的工作分为那几个阶段?(3)简述自下而上的分析方法。

(4)口标代码有哪几种形式?生成口标代码吋通常应考虑哪几个问题?(5)何谓优化?按所涉及的程序范围可分为哪几级优化?(6)简述代码优化的目的和意义。

3.叙述下面的正规式描述的语言,并画岀接受该语言的最简DFA的状态转换图。

(1 101 )*0*4.Pascal语言无符号数的止规定义如卜•:num T digit (. digit) ? (E(+|—)? digit) ?其中digit表示数字,用状态转换图表示接受无符号数的确定有限自动机。

5.画出Pascal中实数(不带正负号,可带指数部分)的状态转换图。

6.用状态转换图表示接收(a|b)*aa的确定的冇限自动机。

7.处于/*和*/之间的串构成注解,注解屮间没有*/。

画出接受这种注解的DFA的状态转换图。

8.某操作系统下合法的文件名为device:name.extension其中第一部分(device:)和第三部分(.extension) 口J缺省,device, name和extension都是字母串,长度不限,但至少为1,画出识别这种文件名的确定有限自动机。

9.构造一个DFA,它接受Z={0, 1}± 0和1的个数都是偶数的字符串。

10.设有非确定的有自限动机NFAM二({A, B, C}, {0, 1}, 5, {A}, {C}),其中:5 (A, 0) = {C} 5(A, 1)二{A, B} 6 (B, 1) = {C} 5 (C, 1) = {C}。

请画出状态转换距阵和状态转换图。

11.设匕{a,b,c}*是满足下述条件的符号串构成的语言:(1)若出现a ,则其后至少紧跟两个c ;(2)若出现b,其后至少紧跟一个c o试构造识别L的最小化的DFA ,并给出描述L的正规表达式。

编译原理复习资料档

编译原理复习资料档

1》编译程序的框架图与功能块:(1)画出编译程序的总体结构,并简述各部分的主要功能:七个部分(2)编译程序的结构分为几个阶段,各阶段的任务是什么?答编译程序总框架(1)词法分析器,又称扫描器,输入源程序,进行词法分析,输出单词符号。

(2)语法分析器,简称分析器,对单词符号串进行语法分析(根据语法规则进行推导或规约),识别出各类语法单位,最终判断输入串是否构成语法上正确的“程序”。

(3)语义分析与中间代码产生器,按照语义规则对语法分析器归约出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间代码。

(4)优化器,对中间代码进行优化处理。

(5)目标代码生成器,把中间代码翻译成目标程序。

(6)表格管理,登记源程序的各类信息,编译各阶段的进展状况。

(7)出错管理,把错误信息报告给用户。

编译程序的结构分为五个阶段:(1)词法分析.任务是:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词(亦称单词符号或简称符号),如基本字,标识符,常熟,算符和界符。

(2)。

语法分析,任务是:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴)。

(3)语义分析与中间代码产生。

任务:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。

(4)优化。

任务在于对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码。

(5)目标代码生成。

任务是:把中间代码(或优化出理之后)变换成特定机械上的低级语言代码。

2》.重要概念:a. 编译程序:是指能够把源语言程序转换成逻辑上等价的目标语言程序的一个程序。

b. 单词符号:是语言的基本组成成分,是人们理解和编写程序的基本要素,是语言中具有独立意义的最基本结构,它一般包括:基本字、标识符、常数、运算符和界符等c. 中间代码:是一种含义明确,便于处理的记号系统,它通常独立于具体的硬件。

编译原理复习

编译原理复习

编译原理复习《编译原理》复习README来源⽹络&书本&PPT整理截取了⽼师课上讲解or布置的题⽬⼀些题⽬懒得贴答案了,写了些注意事项第1 章引论运⾏编译程序的计算机:宿主机运⾏编译程序所产⽣的⽬标代码的计算机:⽬标机第1 题解释下列术语:(1)编译程序:如果源语⾔为⾼级语⾔,⽬标语⾔为某台计算机上的汇编语⾔或机器语⾔,则此翻译程序称为编译程序。

(2)源程序:源语⾔编写的程序称为源程序。

(3)⽬标程序:⽬标语⾔书写的程序称为⽬标程序。

(4)编译程序的前端:它由这样⼀些阶段组成:这些阶段的⼯作主要依赖于源语⾔⽽与⽬标机⽆关。

通常前端包括词法分析、语法分析、语义分析和中间代码⽣成这些阶段,某些优化⼯作也可在前端做,也包括与前端每个阶段相关的出错处理⼯作和符号表管理等⼯作。

(5)后端:指那些依赖于⽬标机⽽⼀般不依赖源语⾔,只与中间代码有关的那些阶段,即⽬标代码⽣成,以及相关出错处理和符号表操作。

(6)遍:是对源程序或其等价的中间语⾔程序从头到尾扫视并完成规定任务的过程。

第2 题⼀个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。

(区别编译程序的六个阶段)答案:⼀个典型的编译程序通常包含8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码⽣成程序、中间代码优化程序、⽬标代码⽣成程序、表格管理程序和错误处理程序。

其各部分的主要功能简述如下。

词法分析程序:输⼈源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。

语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。

语义分析程序:进⾏语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

中间代码⽣成程序:按照语义规则,将语法分析程序分析出的语法单位转换成⼀定形式的中间语⾔代码,如三元式或四元式。

中间代码优化程序:为了产⽣⾼质量的⽬标代码,对中间代码进⾏等价变换处理。

编译原理 复习资料

编译原理 复习资料

教材资料授课顺序:1教学目的:正确理解什么是编译程序;了解编译程序工作的基本过程及其各阶段的基本任务;熟悉编译程序总框;了解编译程序的生成过程和构造工具。

教学重点与难点:编译程序工作的基本过程及其各阶段的基本任务,编译程序总框。

授课学时:2学时教学方式:多媒体讲授教学内容:第一章引论1.1什么是编译程序一、基本概念1、翻译程序:是指这样的一种程序,它能够把一种语言程序(源语言程序)转换成另一种功能等价的语言程序(目标语言程序)。

2、编译程序是一种翻译程序,其源程序是高级语言,目标语言程序是低级语言。

通常是一次性翻译方式。

如TC等高级语言编译程序。

3、解释程序也是一种翻译程序,它与编译程序的区别:立即执行源程序,通常是逐句翻译执行。

如BASIC、SQL、JA V A的BYTECODE解释程序等。

二、高级语言程序的处理过程高级程序设计语言程序的典型处理过程如下图所示:1.2编译过程和编译程序结构一、编译过程的阶段划分一般编译程序的工作过程按阶段进行,每个阶段将源程序从一种表示形式转换成另一种表示形式。

典型的阶段划分方法是将整个编译过程分为如下六个阶段:1、词法分析:任务:对构成源程序的字符串进行扫描和分解,识别出单词(如标识符等)符号。

输入:源程序输出:单词符号序列例子:有待分析源程序:main(){int x=10,y;}词法分析后的输出:1)保留字:main2)界符:左圆括号(3)界符:右圆括号)4)界符:左大括号{5)保留字:int6)标识符:x7)运算符:=8)常数:10 ,界符:,9)标识符:y10)界符:;11)界符:右大括号}2、语法分析任务:根据语言的语法规则对单词符号串(符号序列)进行语法分析,识别出各类语法短语(可表示成语法树的语法单位),判断输入串在语法上是否正确。

输入:单词序列输出:语法分析后的单词序列3、语义分析任务:按语义规则对语法分析器归约出的语法单位进行语义分析,审查有无语义错误,为代码生成阶段收集类型信息,并进行类型审查和违背语言规范的报错处理。

编译原理复习资料,基本概念.doc

编译原理复习资料,基本概念.doc

第一章1.编译的5个阶段:词法分析、语法分析、语义分析与中间代码生成、优化、目标代码生成2.翻译程序:能够把某种语言转换成另一种语言的程序,而两者在逻辑上是等价的3.解释程序:以源程序为输入,不产生目标程序,而是边解释边执行源程序本身的程序。

4.诊断编译程序:帮助程序开发和调试的程序。

5.优化编译程序:提高目标代码效率的程序。

6.运行编译程序的是宿主机,运行目标代码的是目标机。

7.交叉编译:编译程序产生不同于宿主机的目标代码。

8.可变编译程序:不需要重写编译程序中与机器无关的部分就能改变目标机。

9.程序语言由语法和语义两方面定义。

10.语句包括:说明性语句、执行性语句11.子程序传参方式:传值、传地址、传名12.空间分配分方式:静态存储分配、动态存储分配13.表格管理:对各种表格进行管理,包括表格的构造、查找、修改、删除、插入等;词法分析14.词法分析:把源程序作为字符串进行扫描,根据单词词法,识别出所有单词,过滤无用符,并检查是否为合法的单词。

15.词法分析的工具:正规式、有限自动机。

16.单词一般分为如下几种:基本字,标识符,常数,算符,界符。

17.词法规则:规定了形成单词的规则;如常数,标识符,基本字,算符等。

18.识别单词符号的方法:超前搜索19.源程序的预处理:过滤无关的符号。

20.状态图由三种结构构成:分支结构、循环结构、终结点21.LEX语言源程序由两部分组成:正规式辅助定义式、识别规则语法分析22.语法分析:根据语言的语法规则,从单词符号串中识别出各种语法单位,进行句子分析,并检查整个输入字串是否为合法的程序。

23.语法=词法规则+语法规则24.语法规则:规定了由单词构造更大语法单位的规则;如表达式,短语,语句,程序等。

25.语法分析方法:自上而下(算符优先)、自下而上(递归下降)26.重要的语法单位:程序,子程序,语句,短语,表达式等27.上下文无关文法组成:终结符号、非终结符号、开始符号、产生式28.句柄.:一个句型的最左直接短语。

编译原理总复习 (框架+例题)期末复习资料

编译原理总复习 (框架+例题)期末复习资料
{ambn|m>=0,n>0} S→AB A→aA | ε B→bB | b
{anbn | n>0} S→aSb | ab
{a2nbn| n>=0} S→aaSb|ε
S→Sab | ab
S→aS | aB B→Bb | b
S→aS | B B→bB | b
S→DSH|DH D→a H→b S→KSH | ε K→aa H→b 9
S→aS|bB B→aB|ε
例4.文法G[A]=({A},{a,b},{A→bA|a},A)所生成的 语言是什么? 分析 ∵ AbAbbAbbbA…bnAbna
∴ L(G[A])={bna|n≥0 }
7
语言和文法构造方法小结
语言 L(G)=L(G’)
{bn | n>0} {bn | n>=0} {abn | n>0}
1
题型
一.设计一个文法定义一个已知的语言 二.已知一个文法,确定该文法所定义的语言 三.求句型的短语、直接短语和句柄 四.文法二义性的判断
4
例1.设L1={a2nbn|n>=1},试构造生成L1的文法 G1。
【解】设n=1, L1 =aab n=2, L1 =aaaabb n=3, L1 =aaaaaabbb
22
…… 所以得:SaaSb Saab
5
例2.设L2={abna|n>=1},试构造生成L2的文法G2。 【解】首先固定不变的,有S→aAa 然后递归定义变化的,有A→bA∣b
【注】若改为n≥0,文法怎么改?
只修改最后一条规则: A→bA∣b∣ε
6
例3.给出语言L={amban|m,n>=0}的正规文法。
例4 已知文法G[E]:E→E+T | E-T | T T→T*F | T/F | T T→(E) | i

编译原理复习资料一

编译原理复习资料一

一.填空题(每空2分,共20分)1. 不同的编译程序关于数据空间的存储分配策略可能不同,但大部分编译中采用的方案有两种:静态存储分配方案和动态存储分配方案,而后者又分为和。

2. 规范规约是最规约。

3. 编译程序的工作过程一般划分为5个阶段:词法分析、、语义分析与中间代码生成,代码优化及。

另外还有和出错处理。

4.表达式x+y*z/(a+b)的后缀式为。

5.文法符号的属性有综合属性和。

6.假设二位数组按行存放,而且每个元素占用一个存储单元,则数组a[1..15,1..20]某个元素a[i,j]的地址计算公式为。

7.局部优化是局限于一个范围内的一种优化。

二.选择题(1-6为单选题,每题2分,7-8为多选题,每题4分,共20分)1. 一个上下文无关文法G包括四个组成部分:一组终结符,一组非终结符,一个(),以及一组()。

A.字符串 B.产生式 C.开始符号 D.文法2.程序的基本块是指()。

A.一个子程序 B.一个仅有一个入口和一个出口的语句C.一个没有嵌套的程序段 D.一组顺序执行的程序段,仅有一个入口和一个出口3. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于()分析方法。

A.自左向右 B.自顶向下 C.自底向上 D.自右向左4.在通常的语法分析方法中,()特别适用于表达式的分析。

A.算符优先分析法 B. LR分析法 C.递归下降分析法 D. LL(1)分析法5.经过编译所得到的目标程序是()。

A.四元式序列B.间接三元式序列 C.二元式序列 D.机器语言程序或汇编语言程序6.一个文法所描述的语言是();描述一个语言的文法是()。

A.唯一的 B.不唯一的 C.可能唯一,也可能不唯一7.如果在文法G中存在一个句子,当其满足下列条件()之一时,则称该文法是二义文法。

A.其最左推导和最右推导相同 B.该句子有两个不同的最左推导C.该句子有两个不同的最右推导 D.该句子有两棵不同的语法树E.该句子对应的语法树唯一8.下面()语法制导翻译中,采用拉链—回填技术。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理复习资料
1、某操作系统下合法的文件名为:device:name.extension ,其中第一部分(device:)和第三部分(.extension )可缺省,若device, name 和extension 都是字母串,长度不限,但至少为1,画出识别这种文件名的DFA 。

用标记d 表示任意字母。

2、用两个不同最左推导来说明下面的文法是二义的。

S
→ A S | b
A → S A | a 答:句型aSAS 的两个不同最左推导如下: S ⇒ AS ⇒ aS ⇒ aAS ⇒ aSAS S ⇒ AS ⇒ SAS ⇒ ASAS ⇒ aSAS 3、证明下面的文法
S → S A | A A → a
不是LL(1)文法,但是SLR(1)文法,并画出SLR(1)分析表。

答:该文法的第一个产生式表现出直接左递归,因此该文法不是LL(1)。

接受该文法的活前缀的DFA 见下面右边;Follow(S ') = {$},Follow(S ) = {$, a },Follow(A ) = {$, a };SLR(1)分析表见下面左边。

该表无冲突,所以该文法d d d
图1 接受文件名的DFA
4、用SLR(1)文
法能定义的语
言集合、用LR(1)
文法能定义的
语言集合和用LALR(1)文法能定义的语言集合之间有什么关系?
答:用SLR(1)文法能定义的语言集合⊂用LALR(1)文法能定义的语言集合,
用LALR(1)文法能定义的语言集合⊂用LR(1)文法能定义的语言集合。

5、下面是int i, j, k这样的类型声明的两种不同语法:
D → T L D → T L
T → int | real T → int | real
L → L , id | id L → id , L | id
如果用LL(1)分析方法,应该选择哪个文法?如果用某种LR分析方法,选择哪个文法更好?简要说明理由。

答:对于LL(1)分析方法,两个文法都不合适,左边的文法是左递归的,右边文法有公共左因子。

修改右边文法来适应LL(1)分析的要求,相对来说比较容易一些,因为只要提公共左因子。

对于LR的各种分析方法,两个文法都适用,但是采用左边的文法更好一些。

用左边的文法时,分析器一边扫描一边归约,占用分析栈的空间较少。

而用右边的文法时,分析器要把所有的标识符都移进栈后才进行归约,因此使用较多的分析栈空间。

(结合语法制导的翻译,采用左边的文法还有好处:便于确定T的类型属性在栈中的位置。


6、在C语言中,3++和( id + id )++这样的表达式被编译时,编译器都会报告如下的错误:invalid lvalue in increment
说明左值不能为数值或表达式。

现有如下简化的C语言表达式文法: E → E + E | ( E ) | E ++ | id | num
请写一个语法制导定义或翻译方案,检查++的运算对象是否合法。

答:给非终结符E一个综合属性v,其值可取lvalue或rvalue,分别表示E是左值标识符和右值表达式,那么语法制导定义如下(无输出则表示无错):E'→ E
E → E
1 + E
2
E.v := rvalue
E → ( E
1 ) E.v := E
1
.v
E → E
1 ++ if E
1
.v = rvalue then printf(“invalid lvalue in
increment”);
E.v := rvalue
E → id E.v := lvalue
E → num E.v := rvalue
7、 E → E+T | T
T → num.num | num
给出一个语法制导定义以确定每个子表达式的类型int/real。

答:E → E1+T { if ( E1.type=real or T.type=real )
then E.type=real else E.type=integer } E → T { E.type = T.type;}
T →num.num {T.type = real;}
T →num {T.type = integer;}
8、把下列C语言程序的可执行语句翻译为:
main()
{int i; int a[10];
while (i<=10) a[i] = 0; }
(a) 三地址代码
(b) 后缀式
答:(a) L0: if i<=10 goto L1
goto L2
L1: a[i]:=0
goto L0
L2:
(b) 后缀式:i 10 <= a[i] 0 assign while
9、试构造下面的程序的流图,并找出其中所有回边及循环。

read P
x := 1
c := P * P
if c < 100 goto L1
B := P * P
x := x + 1
B := B + x
write x
halt
L1: B:= 10
x := x + 2
B := B + x
write B
if B < 100 goto L2
halt
L2: x := x + 1
goto L1
答: 程序的流图如下
10、对本题中所示的流图,求出其各结点n的控制结点集D(n)、回边及循环(n
0为首结点)。

答:各结点n的控制结点集D(n)如下:
D(n
0) = {n
}
D(n
1) = {n
, n
1
}
D(n
2) = {n
, n
1
, n
2
}
D(n
3) = {n
, n
1
, n
2
, n
3
}
D(n
4) = {n
, n
1
, n
2
, n
4
}
D(n
5) = {n
, n
1
, n
2
, n
5
}
D(n
6) = {n
, n
1
, n
2
, n
5
, n
6
}
D(n
7) = {n
, n
1
, n
2
, n
5
, n
6
, n
7
}
回边和循环:
因为 D(n
5) = {n
, n
1
, n
2
, n
5
} ,且 n
5
-> n
2
,所以 n
5
-> n
2
为一条回
边。

根据它求出的循环 L
1 = {n
2
, n
5
, n
3
, n
4
}。

因为D(n
6) = {n
, n
1
, n
2
, n
5
, n
6
} ,且 n
6
-> n
1
,所以n
6
-> n
1
为一条
回边。

根据这条回边,求出的循环 L
2 = {n
6
, n
1
, n
5
, n
3
, n
4
, n
2
}。

11、考虑下面求矩阵A、B成绩的程序片段:
BEGIN
FOR i := 1 TO n DO
FOR j := 1 TO n DO
FOR k = 1 TO n DO
c[i, j] := c[i, j] + A[i, k} * B[k, j] END
(1)假定对数组A、B、C采用静态存储分配,每个字占用4个字节,存储器以字节为单位编址。

给出该程序的三地址代码序列。

(2)构造该程序相应的流图。

(3)删除流图中各基本块内的公共子表达式
(4)指出流图中所有回边及其相应循环,并且进行循环优化。

答:(1)设数组元素按行存放,A、B、C数组都是 n*n 的二维数组,各维的下界均为0,每个元素占一个字(4个字节),则数组元素(如A[i, j])的地址计算公式为:
D(A[i, j]) = addr(A) + ((i - 0) * n + (j - 0)) * 4
= addr(A) + 4 * ( i * n + j )
该程序的三地址代码序列被划分成基本块后如下:。

相关文档
最新文档