编译原理

编译原理
编译原理

第一章引论

本章要点:

1. 正确理解什么是编译程序;

2. 了解编译程序工作的基本过程及各阶段的基本任务;

3. 熟悉编译程序的总体结构框图;

4. 了解编译程序的构造过程和构造工具。

本章目标:

1. 掌握本章的“编译程序”、“交叉编译程序”、“编译前端与编译后端”等基本概念,并能在以后的学习熟练运用;

2. 掌握T形图表示。

本章重点:

1. 概念比较:

①编译程序、解释程序;

②诊断编译程序、优化编译程序;

③交叉编译程序、可变目标编译程序;

④编译前端与编译后端;

2. 编译工作过程的五个阶段;

3. 编译程序总框;

4. 编译程序“移植”。

本章难点

1. 编译程序“移植”;

作业题及参考答案

一、单项选择题:

(按照组卷方案,至少8道小题)

1. 如果一个编译程序能产生不同于其宿主机的机器代码,则称它为:。

a. 诊断编译程序

b. 优化编译程序

c. 交叉编译程序

d. 可变目标编译程序

2. 编译程序将高级语言程序翻译成。

a. 机器语言程序或高级语言程序

b. 汇编语言或机器语言程序

c. 汇编语言程序或高级语言程序

d. 中间语言程序或高级语言程序

3. 下面的四个选项中,__________不是编译程序的组成部分。

a. 词法分析程序

b. 代码生成程序

c. 设备管理程序

d. 语法分析程序

4. 现代多数实用编译程序所产生的目标代码都是一种可重定位的指令代码,在运行前必须借助于一个把各个目标模块,包括系统提供的库模块连接在一起,确定程序变量或常数在主存中的位置,装入内存中制定的起始地址,使之成为一个可运行的绝对指令代码的程序。

a. 重定位程序;

b. 解释程序;

c. 连接装配程序;

d. 诊断程序;

5. 从编译程序的角度说,源程序中的错误通常分为两大类。

a. 词法错误和语法错误;

b. 语法错误和语义错误;

c. 编辑错误和诊断错误;

d. 词法错误和语义错误;

6. 下面对编译原理的有关概念正确描述的是:。

a. 目标语言只能是机器语言

b. 编译程序处理的对象是源语言。

c. Lex是语法分析自动生成器

d. 解释程序属于编译程序

7. 目标代码生成阶段所生成的目标代码的形式不可能是。

a. 绝对指令代码

b. 可充定位的指令代码。

c. 汇编指令代码

d. 三地址代码

8. 语义错误是指源程序中不符合语义规则的错误,不包括:

a. 非法字符错误

b. 类型不一致错误。

c. 作用域错误

d. 说明错误

一.答案:1. c; 2. b;3. c; 4. c;5. b;6. d;7. d;8.a;

二、填空题:

(按照组卷方案,至少8道小题)

1.我们有时把编译程序划分为编译前端和编译后端。前端主要由与有关但与

无关的那些部分组成。

2.对编译程序而言,输入数据是;输出数据是。

3. 编译后端通常不依赖于源语言而仅仅依赖于。

4. 如果不需改写编译程序中与机器无关的部分就可以把编译程序移植到另外一个目标机上,则称该编译程序是。

5. 描述程序设计语言词法的有效工具是。

6. 编译过程的每一个阶段都能检测出错误,其中,绝大多数错误在_______ 阶段检测出来的。

7. 为了使编译后的Java程序从一个平台移到另外一个平台上执行,Java定义了一种称为ByteCode的虚拟机代码。只要实际使用的操作平台上实现了执行ByteCode的Java解释器,这个操作平台就可以执行各种Java程序。这就是所谓Java语言的。

8.在一个程序设计环境中,起着中心作用。连接程序、调试程序、程序分析等工具的工作直接依赖于它所产生的结果。

二.答案:1. 源程序,目标机;2. 源程序,目标程序;3. 中间语言;4. 可变目标编译程序;5. 正规式和有限自动机;6. 词法分析、语法分析和语义分析;7. 操作平台无关性;8.编译程序。

三、判断题:

(按照组卷方案,至少8道小题)

1. 在编译过程中,既可以将几个不同的阶段合为一遍,也可以把一个阶段的工作分为若干遍。()

2. 编译程序生成的目标程序都是可执行的程序。()

3. 编译前端主要由与源语言和目标机相关的那些部分组成。()

4. 优化的任务在于对前端编译所产生的中间代码进行加工和变换,以其能产生运行结果更为准确的目标代码。()

5. 为了让编译程序可改变目标机,通常需要一种良好定义的中间语言支持。()

6. 汇编器将高级语言程序翻译成汇编语言程序。()

7. 许多编译程序在识别出语法单位后并不真正构造语法树。()

8. 取编译程序前端改写其后端以生成不同机器上的目标代码,目前技术上还难以实现。()三.答案 1. √;2. ×;3. ×;4. ×;5. √;6. ×;7. √;8. ×;

四、名词解释:、

(按照组卷方案,至少3道小题)

1. 诊断编译程序、优化编译程序;

2. 交叉编译程序、可变目标编译程序;

3. 编译程序的“遍”

4. 程序设计环境

四.答案:

1.诊断编译程序:专门用于帮助程序开发和调试的编译程序。

优化编译程序:着重于提高目标代码效率的编译程序。

2.交叉编译程序:能产生不同于其宿主机的机器代码的编译程序。

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

3. 编译程序的“遍”:就是对源程序或者中间结果从头到尾的一次扫描,并做有关的加工处理,生成新的中间结果或者目标程序。

4. 程序设计环境:支持程序设计人员进行程序设计开发所需要的如编辑程序、编译程序、连接程序和调试程序等软件工具,一起构成程序设计环境。

五、简答题:

(按照组卷方案,至少3道小题)

1. 什么是编译程序的“遍”?

2. 什么编译程序、解释程序?编译程序和解释程序有什么区别?

3. 前端编译和后端编译是如何划分的?

4. 什么是标识符,什么是名字,它们的区别是什么?

5. 如果机器A上已有一个用A机器代码实现的某高级语言L1的编译程序,则可以用L1编写另一种高级语言L2的编译程序,画出这个实现过程的T形图表示。

6. 如何采用“移植”的办法,利用A机器上已有的高级语言L编写能够在B机器上运行的高级语言L的编译程序?画出T形图表示。

五.答案:

1. 编译程序的“遍”,就是对源程序或者中间结果从头到尾的一次扫描,并做有关的加工处理,生成新的中间结果或者目标程序。

既可以将几个不同阶段合为一遍,也可以把一个阶段的工作分为若干遍。当一遍中包含若干阶段时,各阶段的工作是穿插进行的。

一个编译程序究竟应分为几遍、如何划分,是与源语言、设计要求、硬件设备等诸因素有关的,难以统一规定。

2. 编译程序:把某一种高级语言源程序转换成汇编语言程序或机器语言程序的程序。

解释程序:对高级语言源程序并不生成汇编程序或机器语言程序,而是边解释边执行的程序。

编译程序把源语言程序翻译成目标代码,然后由操作系统加载执行;而解释程序则是边翻译边执行,不生成目标代码。

3. 前端编译和后端编译是如何划分的?

根据编译器的工作是与源语言相关还是目标机器有关来进行划分。

编译前端:编译程序中包括词法分析、语法分析、语义分析和中间代码产生等主要与源语言程序有关但与目标机无关的那些部分叫编译前端。

编译后端:编译程序中包括目标代码生成、目标代码优化等与目标机有关而与源语言无关的那些部分部分叫编译后端。

4. 标识符是由字母或数字以及某些特殊符号(因不同的高级语言而不同)组成的,但是必须以字母开头的一个字符串。

当给某标识符以确切的含义时,这个标识符就叫做名字。程序语言中的各种名字都是用标识符表示的。

名字和标识符具有相同的形式,名字使用标识符来描述,但标识符是没有意义的字符序列,而名字却有确切的意义和属性(即类型和作用域)。 5.

L 1语言 L 2语言 A 代码 A 代码

L 2语言 A 代码

A 代码

L 1语言 A 代码

6.

L 语言

L 语言 B 代码

B 代码

L 语言 B 代码

L 语言 L 语言 B 代码 A 代码

L 语言 B 代码 A 代码

L 语言 A 代码

第二章 高级语言及其语法描述

本章要点

1. 程序语言的定义;

2. 高级程序语言一般结构和主要共同特征;

3. 正确理解上下文无关文法基本概念,包括:

文法的定义、推导、句型、句子、语言、语法树、二义性等;

4. Chomsky文法分类;

本章目标

掌握和理解程序语言的定义、高级语言的一般特征及程序语言的语法描述。

本章重点

1. 语法,词法规则与语法规则;

2. 语义和语义规则;

3. 数据类型与操作;

4. 推导,最左推导和最右推导;

5. 语法分析树和二义性;

本章难点

1. 二义性文法;

2. Chomsky各个文法类;

作业题

一、单项选择题:

(按照组卷方案,至少15道小题)

1. Chomsky把文法分成四种类型,0型、1型、2型和3型。3型文法也称为,2型文法也称为。

a.上下文无关文法

b.上下文相关文法

c.正则文法

d.短语文法

2. 许多广为使用的语言,如Fortran、C、Pascal等,属于。

a. 强制式语言

b. 应用式语言

c. 基于规则的语言

d. 面向对象的语言

3. 设G是一个文法,S是开始符号。若S?*α,α∈(V T∪V N)*,则称α是一个。

a. 句子

b. 句型

c. 推导

d. 语言

4. 一个数据类型通常包括的三种要素中,没有下面的。

a. 用于区别这种类型的数据对象的属性;

b. 这种类型的数据对象可以具有的值;

c. 对这种类型的数据对象的内存分配;

d. 可以作用于这种类型的数据对象的操作;

5. Chomsky把文法分成四种类型,其中,也称正规文法

a. 0型

b. 1型

c. 2型

d. 3型

6. 语言的词法规则一般用Chomsky的型文法来描述:

a. 0

b. 1

c. 2

d. 3

7. 文法

S→(L)|a

L→L,S|S

中,下面是该文法中的终结符号。

a. S

b. ,

c. L

d. |

8. 文法G所描述的语言是的集合。

a. 文法G的字母表∑中的所有符号组成的符号串;

b. 文法G的字母表∑的闭包∑*中的所有符号串;

c. 文法G的识别符号推出的所有符号串;

d. 文法G的识别符号推出的所有终结符号串;

9. 语言L={αcα | α∈(a|b)*},该语言是_____________语言。

a. 3型语言,

b. 2型语言,

c. 1型语言,

d. 0型语言

10. 设有文法G:

I→I1 | I0 | Ia | Ic | a | b | c |

下面符号串中不是该文法的句子是:

a. ab0,

b. a0c01,

c. aaa,

d. bc10

11. 给定文法A→bA|cc,下面的符号串中,是该文法句子的是________。

a. bcbc,

b. bbbcc,

c. bcbcc,

d. bccbcc;

12. Chomsky定义的四种形式语言文法中,2型文法可由(G )识别。

a. 图灵机;

b. 确定性有限自动机;

c. 下推自动机;

d. 非确定性有限自动机;

13. 若文法G定义的语言是无限集,则文法必然是。

a. 上下文无关的

b. 递归的

c. 二义性的

d. 无二义性的

14. 文法S→aaS|abc 定义的语言是。

a. {a2k bc|k>0}

b. {a k bc|k>0}

c. {a2k-1bc|k>0}

d. {a k a k bc|k>0}

15. 文法:G:S→xSx | y所识别的语言是()。

a. xyx

b. (xyx)*

c. x*yx*

d. x n yx n(n≥0)

一.答案:1. c.;2. a.;3. b;4. c;5. d;6. d;7. b;8. d;9. d;10. a;11. b;12. c;13. b;

14. c;15. d;

二、填空题:

(按照组卷方案,至少15道小题)

1. 假设G是一个文法,α是由终结符和非终结符组成的串,S是文法的开始符号,如果S=>*α,则称α是。

2. 在赋值语句中,赋值号‘:=’左右两边的变量名扮演着两种不同的角色,为了区分一个名字的这两种特征,我们把一个名字所代表的称为该名的左值,把一个名字的称为该名字的右值。

3. 对于文法G,仅含终结符号的句型称为。

4. 设有文法G[S],其部分产生式:

E→E+T | T

T→T*F | F

F→(E) | a

则V N ={ },V T={ }。

5. 由文法产生的集合是文法产生的语言。

6. Chomsky语法定义的3型文法又可以分为。

7. 一个上下文文法G的四个组成部分分别是:。

8. 已知语言:{a n b n a m b m|n,m≥0},其语法定义为:G=({a,b},{S,A,B},S,P),其中P为:。

9. 已知某语言的语法定义为:G=({a},{S}S, P ),且P: S→aS | ε,则该语言为。

10. 已知某语言为{ωcw R|ω∈{a,b}*},其语法定义为G=({a,b,c},{S},S,P),其中P

为:。

11. 所谓最右推导是指。

12. 已知文法G(Z):

E→ET+|T

T→TF*|F

F→FP↑|P

P→E|i

试写出其识别的一个句子:_____________________。

13. 文法G[S]:S→aA|a, A→aS为_______型文法,其确定的语言的为:_______ 。

14. 在一棵语法树生长过程中的任何时刻,就是一个句型。

15. 我们说G=(V T,V N,S,P)是一个0型文法,如果它的每一个产生式α→β是这样一种结构:。

二.答案:1. 句型;2. 单元的地址(或者:单元、存储单元的地址),值(或者:单元的内容)3. 句子;4. V N={E,T,F},V T={+,*,(,),a};5. 句子;6. 右线性文法和左线性文法;7. 开始符号,产生式集合,终结符集合,非终结符集合;8. S→AB;A→aAb|ε;B→aBb|ε;

9. {a n|n≥0};10. S→aSa|bSb|ε;11. 任何一步α?β都是对α中的最右非终结符进行替换。12. iii↑*+;13. {a2n+1|n≥0};14. 所有那些没有后代的末端结点从左到右排列起来;15. α∈(V N∪V T)*且至少含有一个非终结符,而β∈(V N∪V T)*。

三、判断题:

(按照组卷方案,至少15道小题)

1. 一棵语法树表示了一个句型所有的不同推导过程,包括最右推导和最左推导。()

2. 可能有两个不同的文法G和G′,期中一个是二义的而另一个是无二义的,但是却有L(G)=L(G′)。()

3. 变量既持有左值又持有右值,而常数和带有算符的表达式一般认为只持有右值。()

4. 文法G:

S→bA

A→aA|a

定义的语言是所有以b开头的后跟至少一个a的字符串的集合。()

5. 设有文法G:

S→S*S | S+S | (S) | a

该文法是二义的。()

6. 正则文法一定不是二义的。()

7. 上下文无关文法可以产生语言L={ a n b n c i | i>=1,n>=1 }。()

8. 不存在任何正规文法能产生语言L={a n b n | n>=1}。()

9. 对于每一个左线性文法G1,都存在一个右线性文法G2,使得L(G1)=L(G2)。()

10. 正规文法产生的语言都可以用上下文无关文法来描述。()

11. 上下文无关文法比正规文法有更强的描述能力。()

12. 文法的二义性和语言的二义性在概念上是相同的,也就是说,对于某个语言,不可能存在两个以上的文法来描述它。()

13. 二义性是可以判定的,也就是说,可以编这么一个程序,输入该文法后,该程序能确切地给出该文法是否二义的答案。()

14. 说明语句旨在定义名字的性质。编译程序把这些性质登记在符号表中,并检查程序中名字的引用和说明是否一致。实际上,许多说明语句并不能翻译成相应的目标代码。()

15. C语言是一个允许子程序嵌套定义的语言。()

三.答案:1. √;2. √;3. √;4. √;5. √;6. ×;7. √;8. √;9. √;10. √;11. √;12. ×;13. ×;14. √;15. ×;

四、名词解释:

(按照组卷方案,至少3道小题)

1. 二义性文法;

2. 推导和直接推导;

3. 句型,句子和语言;

4. 上下文无关文法;

5. 语法;

6. 正规文法(左线性文法和右线性文法);

四.答案:

1. 如果一个文法存在某个句子对应两棵以上不同的语法树,则称这个文法是是二义性文法。

2. 设A→γ是一个产生式,且α、β∈(VT?VN)*,若αAβ=>αγβ,则称αAβ直接推出αγβ;或者说,αγβ是αAβ的一个直接推导。

如果α1=>α2=>……=>αn,则称这个序列是从α1到αn的一个推导。

3. 设G是一个文法,S是它的开始符号。如果S=>*α,则称α是一个句型。

仅含终结符的句型叫句子。

文法G所产生的句子的全体叫文法G的语言,记为L(G),L(G)={α| S=>*α,α∈V T*}。

4. 上下文无关文法G是一个四元式(V T,V N,S,P),其中:

V T是一个非空有限集合,其中的每一个元素称为终结符;

V N是一个非空有限集合,其中的每一个元素称为非终结符,V N∩V T=?;

S是一个非终结符,称为开始符号;

P是一个产生式有限集合,每个产生式的形式是P→α,其中P∈V N,α∈(V T?V N)*。开始符号S至少必须在某个产生式的左部出现一次。

5. 若文法G= (V T,V N,S,P)的任何产生式为A→αB或A→α,其中,α∈V T*,A,B∈V N,则称G是右线性文法;

若文法G= (V T,V N,S,P)的任何产生式为A→Bα或A→α,其中,α∈V T*,A,B∈V N,则称G是左线性文法;

左线性文法和右线性文法均为正规文法。

五、简答题:

(按照组卷方案,至少3道小题)

1. 作为描述程序语言的上下文无关文法,对它有哪些限制?

答:

第一点:文法中不含任何下面形式的产生式:P→P;

第二点:每个非终结符P都必须有用处。也就是说,必须存在含P的句型;或者说,对P 不存在永不终结的回路。

2. 什么是二义性文法?从输入串abab来说明下面文法二义吗?

S→aSbS|bSaS|ε

该文法产生的语言是什么?

答:

如果一个文法存在某个句子对应两棵以上不同的语法树,则称这个文法是二义的。

例如输入串abab,它有两棵语法树如下:

S

a S

b S

b S a S

ε

ε

ε

S

a S

b S

a S

b S

ε

ε

ε

所以,该文法是二义的。

此文法产生的语言是:所有a 的个数与b 的个数相等的由a 和b 组成的字符串。 3. 文法 G[S]为:

S →Ac|aB A →

ab

B →bc

该文法是否为二义的?为什么? 答: 对于串 abc

(1)S=>Ac=>abc (2)S=>aB=>abc

即存在两不同的最右推导。所以,该文法是二义的。 或者:

对输入字符串 abc ,能构造两棵不同的语法树,所以它是二义的。

4已知文法G=({A,B,C},{a,b,c},P ,A), P 由以下产生式组成:

A →abc A →aBbc

Bb →bB Bc →Cbcc bC →Cb aC →aaB

aC →aa

此文法所表示的语言是什么? 答:

分析文法的规则:

每使用一次Bc →Cbcc ,b 、c 的个数各增加一个; 每使用一次aC →aaB 或aC →aa, a 的个数就增加一个;

产生式Bb →bB 、 bC →Cb 起连接转换作用。

由于A 是开始符号,由产生式A →abc 推导得到终结符号串abc ;由产生式A →aBbc 推导得到B 后,每当使用产生式Bb →bB 、Bc →Cbcc 、bC →Cb 、aC →aaB 就会递归调用B 一次,所产生的a 、b 、c 的个数分别增加一个,因此推导所得的终结符号串为abc 、aabbcc 、aaabbbccc 、…所以文法描述的语言为{ a n b n c n |n>0}. 5已知文法G[Z]:

Z →0U|1V U →1Z|1 V →0Z|0

(1)请写出此文法描述的只含有4个符号的全部句子。 (2)G[Z]产生的语言是什么?

(3)该文法在Chomsky 文法分类中属于几型文法? 答:

(1)0101,0110,1010, 1001

(2)分析G[Z]所推导出的句子的特点:由Z 开始的推导不外乎图1所示的四种情形。

图 1文法G[Z]可能的几种推导

Z

1

U Z U

Z

1

Z

1

V 0

Z

Z

1

V

由Z 推导出10或01后就终止或进入递归,而Z 的每次递归将推导出相同的符号串:10或01。所以G[Z]产生的语言L(G[Z])={x|x ∈(10|01)+ } (3)该文法属于3型文法。

七、应用题:

1. 试分析下面给出的if-then-else 语句的文法,它的提出原本是为了矫正dangling-else(else 悬挂)文法的二义性:

stmt → if expr then stmt | matched-stmt

matched-stmt → if expr then matched-stmt else stmt | other expr →e

考虑句子if e then if e then other else if e then other else other ,试说明此文法仍然是二义性的。 答:

1. 考虑句子if e then if e then other else if e then other else other 它具有如下所示的两种分析树

stmt if

expr then stmt

matched-stmt

if

expr then esle matched-stmt stmt matched-stmt

if

expr then esle matched-stmt stmt other

other

e

other

matched-stmt e

e

stmt

expr then stmt matched-stmt if

expr then esle matched-stmt stmt

matched-stmt if

expr then esle matched-stmt stmt other

other

e

other

matched-stmt e

e

if

则上面给出的if-then-else文法仍是二义性的。

2. 考虑文法G[bexpr]:

bexpr→bexpr or bterm | bterm

bterm→bterm and bfactor | bfactor

bfactor→not bfactor| ( bexpr ) | true | false

(a) 请指出此文法的终结符号、非终结符号和开始符号。

(b) 试对于句子not(true or false)构造一棵分析树。

(c) 试说明此文法所产生的语言是全体布尔表达式。

答:

(a) 终结符号为:{or, and, not, (, ), true, false}

非终结符号为:{bexpr, bterm, bfactor}

开始符号为:bexpr

(b) 句子not(true or false)的分析树为:

(c) 用归纳法说明如下:

(1) 不含运算的布尔表达式,常数true和false由此文法产生:

bexpr => bterm => bfactor => true

bexpr => bterm => bfactor => false

(2) 设结论对于少于n(n≥1)个运算的布尔表达式成立,即

若be1和be2是含有少于n个运算的布尔表达式,则有:bexpr=>+be1,bexpr=>+be2。

(3) 对于含有n个运算的布尔表达式,可表示成下面三种

形式:

(a) (be1) or (be2)

(b) (be1) and (be2)

(c) not (be1)

对于(a):bexpr => bexpr or bterm

=> bterm or bterm => bfactor or bterm

=> (bexpr) or bterm =>+(be1) or bterm

=> (be1) or bfactor => (be1) or (bexpr)

=>+ (be1) or (be2)

同理,有:

Bexpr=>+ (be 1) and (be 2) Bexpr=>+ not (be 1)

综上所述,此文法所产生的语言是全体布尔表达式。 3. 已知文法G[S],其产生式为:S →(S)| ε

(a )L(G)是什么?

(b )对于(a)的结果,请给出证明。 答:

(a) 解:0}n |){(L(G )n

n

≥= (b)证明:

首先证明0}n |){(L(G )n n

≥? 对推导次数进行归纳

1):当推导次数为1时,使用产生式S →ε,此时左括号与右括号个数为0 2):假设推导次数为n 时(a)成立,即: 1

n 1

n 1

n 1

n ...)))(((......)))S (((...S ----+

??

则推导次数为n+1次时,多使用一次产生式S →(S)即:

n

n

n

n

1

n 1

n ...)))(((......)))S (((......)))S (((...S ???--+

推导次数为n+1次时(a)成立。

根据(1)(2)可得:0}n |){(L(G )n

n

≥? 其次证明L(G )0}n |){(n

n

?≥ 对n 进行归纳

1):当n=0时,使用产生式S →ε 即可;

2):假设当n=k 时,结论成立,即L(G ))(k

k

∈,下面证n=k+1时结论成立。 由L(G ))(k

k

∈,其推导过程如下:

k

k

k

k

...)))(((......)))S (((...S ??+

当n=k+1时,推导过程如下:

1

k 1k 1k 1k k k ...)))(((......)))(((...S ...)))S (((...S +++++

???

故L(G ))(1

k 1k ∈++

根据(1)(2)可得:L(G )0}n |){(n

n

?≥ 根据1,2可知:0}|){(L(G )n

n

≥= 4. 试构造生成下列语言的上下文无关文法: (1) { a n b n c i | n≥1, i≥0 }

(2) { w | w ∈{a,b}+,且w 中a 的个数恰好比b 多1 } (3) { w | w ∈{a,b}+,且|a|≤|b|≤2|a| } 答:

(1)把a n b n c i 分成a n b n 和c i 两部分,分别由两个非终结符号生成,因此,生成此文法的产生式为: S → AB A → aAb|ab B → cB|ε

(2)令S 为开始符号,产生的w 中a 的个数恰好比b 多一个,令E 为一个非终结符号,产生含相同个数的a 和b 的所有串,则产生式如下: S → aE|Ea|bSS|SbS|SSb E → aEbE|bEaE|ε

(3) 设文法开始符号为S ,产生的w 中满足|a|≤|b|≤2|a|。因此,可想到S 有如下的产生式 (其中B 产生1到2个b ): S → aSBS|BSaS |ε B → b|bb

5. 已知文法G[S]:

S→AB

A→aA|a

B→bB|b

求该文法所定义的语言。

答:

从规则2可推出: a,aa,aaa,……

从规则3可推出: b,bb,bbb,……

再从规则1可推出句子:

ab, aab, aabb, aaab, abbb,……

即,从S出发可推出多个a后跟多个b的字符串,且a的个数与b的个数不尽相同。故:L(G)={a m b n| m,n≥1}

6. 考虑下面上下文无关文法G[S]:

S→SS*|SS+|a

(1) 对于符号串aa+a*分别给出最左推导和最右推导过程,并为该串构造语法树。

(2)G[S]的语言是什么?

答:

(1)此文法生成串aa+a*的最右推导:

S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*

此文法生成串aa+a*的最左推导:

S=>SS*=>SS+S*=>*=>aS+S*=>aa+S*=>aa+a*

(2)该文法生成的语言是:*和+的后缀表达式,即逆波兰式。

7 令文法G为

N→D | ND

D→0 | 1 | 2 | 3 | 4 | 5 | 6| 7 | 8 | 9

(1) G的语言L(G)是什么?

(2) 给出句子0127、34和568的最左推导和最右推导。

答:

(1)

∵N N?ND?NDD?NDDD?NDDDD……?DD……D

∴L(G)={d(n+1)|n≥0, d∈{0, 1, …, 9}}

允许以0开头的自然数(十进制无符号整数);

(2)

0127最左推导:N?ND?NDD?NDDD?DDDD?0DDD?01DD?012D?0127

0127最右推导:N?ND?N7?ND7?N27?ND27?N127?D127?0127

8 写一个文法,使其语言是奇数集,且每个奇数不以0开头。

答:(首先分析题意,本题是希望构造一个文法,由它产生的句子是奇数,并且不以0开头,也就是说它的每个句子都是以1、3、5、7、9中的某个数结尾。如果数字只有一位,则1、3、5、7、9就满足要求,如果有多位,则要求第1位不能是0,而中间有多少位,每位是什么数字(必须是数字)则没什么要求,因此,我们可以把这个文法分3部分来完成。分别用3个非终结符来产生句子的第1位、中间部分和最后一位。

引入几个非终结符,其中,一个用作产生句子的开头,可以是1-9之间的数,不包括0;一个用来产生句子的结尾,为奇数;另一个则用来产生以非0整数开头后面跟任意多个数字的数字串,进行分解之后,这个文法就很好写了。)

令S表示不以0开始的奇数集合。

S → 〈奇数头〉〈整数〉〈奇数尾〉|〈奇数头〉〈奇数尾〉|〈奇数尾〉

〈奇数尾〉→ 1|3|5|7|9

〈奇数头〉→ 2|4|6|8|〈奇数尾〉

〈整数〉→ 〈整数〉〈数字〉|〈数字〉

〈数字〉→ 0|〈奇数头〉

9写一个上下文无关文法CFG,使其语言是能被5整除且不以0开头的无符号整数的集合。(如{5,10,15,….})

答:

能被5整除的数从形式上看,是以0和5结尾的数字串。题目要求的不以0开头,并要注意0不是该语言的句子。所求文法为:

G(S):S→MF|5

F→5|0

M→MD|N

D→N|0

N→1|2|3|4|5|6|7|8|9

10证明下面的文法是二义的:

S→iSeS|iS|i

答:(根据文法的二义性的定义,如果要证明该文法是二义的,必须找到一个句子,使得该句子具有两个不同的最右推导或两个不同的语法树。我们首先分析这个文法,根据我们对程序语言的了解,不难发现,这个文法应该是用来表示if….else….结构的(用“i”代表“if”或语句集,“e”代表“else”)。因此我们就要到if….else…结构中去找二义性。我们知道,程序语言一般都规定else部分是和它前面离它最近的没有被匹配的的if语句进行匹配。而上面的这个文法体现不出这种限制,因此我们可以找这样一个句子,在else前面有两个if (如句子iiiei),else和不同的if进行匹配时就会产生不同的语义。)

解答:

考虑句子iiiei,存在如下两个最右推导:

S => iSeS => iSei => iiSei => iiiei

S => iS => iiSeS => iiSei => iiiei

11 某程序设计语言的表达式由运算符θ1、θ2、θ3、标识符、(、)组成,其中θ1和θ2的优先级相同,θ3的优先级低于θ1、θ2的优先级,优先级相同的运算符从右往左计算,可以用括号改变运算的顺序,则下述四种文法中哪一个可以描述上述的表达式文法?

设E为识别符号,终结符号集={θ1、θ2、θ3、(、)、I},非终结符号集={E、T、F}。

a. E→T|Eθ1T|Eθ2T

T→F|Tθ3F

F→(E)|I

b. E→T|Tθ1E|Tθ2E

T→F|Fθ3T

F→(E)|I

c. E→T|Eθ3T

T→F|Tθ1F|Tθ2F

编译原理课程设计-词法语法分析器

编译原理课程设计Course Design of Compiling (课程代码3273526) 半期题目:词法和语法分析器 实验学期:大三第二学期 学生班级:2014级软件四班 学生学号:2014112218 学生姓名:何华均 任课教师:丁光耀 信息科学与技术学院 2017.6

课程设计1-C语言词法分析器 1.题目 C语言词法分析 2.内容 选一个能正常运行的c语言程序,以该程序出现的字符作为单词符号集,不用处理c语言的所有单词符号。 将解析到的单词符号对应的二元组输出到文件中保存 可以将扫描缓冲区与输入缓冲区合成一个缓冲区,一次性输入源程序后就可以进行预处理了 3.设计目的 掌握词法分析算法,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解 4.设计环境(电脑语言环境) 语言环境:C语言 CPU:i7HQ6700 内存:8G 5.概要设计(单词符号表,状态转换图) 5.1词法分析器的结构 词法分析程序的功能:

输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词. 为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序: 1) ch 存放最新读进的源程序字符 2) strToken 存放构成单词符号的字符串 3) Buffer 字符缓冲区 4)struct keyType 存放保留字的符号和种别 5.2待分析的简单词法 (1)保留字 break、case、char、const、int、do、while… (2)运算符和界符 = 、+、-、* 、/、%、,、;、(、)、?、# 5.3各种单词符号对应的种别码

编译原理语法分析实验报告

编译原理语法分析实验报告 - 班级:XXX 学号:XXX 姓名:XXX 年月日 1、摘要: 用递归子程序法实现对pascal的子集程序设计语言的分析程序 2、实验目的: 通过完成语法分析程序,了解语法分析的过程和作用 3、任务概述 实验要求:对源程序的内码流进行分析,如为文法定义的句子输出”是”否则输出”否”,根据需要处理说明语句填写写相应的符号表供以后代码生成时使用 4、实验依据的原理 递归子程序法是一种自顶向下的语法分析方法,它要求文法是LL(1)文法。通过对文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时,程序能够按LL(1)形式唯一地确定选择某个候选式进行推导,最终识别输入串是否与文法匹配。 递归子程序法的缺点是:对文法要求高,必须满足LL(1)文法,当然在某些语言中个别产生式的推导当不满足LL(1)而满足LL(2)时,也可以采用多向前扫描一个符号的办法;它的另一个缺点是由于递归调用多,所以速度慢占用空间多,尽管这样,它还是许多高级语言,例如PASCAL,C等编译系统常常采用的语法分析方法。

为适合递归子程序法,对实验一词法分析中的文法改写成无左递归和无左共因子的,,,如下: <程序>?<程序首部><分程序>。 <程序首部>?PROGRAM标识符; <分程序>?<常量说明部分><变量说明部分><过程说明部分> <复合语句> <常量说明部分>?CONST<常量定义><常量定义后缀>;|ε <常量定义>?标识符=无符号整数 <常量定义后缀>?,<常量定义><常量定义后缀> |ε <变量说明部分>?VAR<变量定义><变量定义后缀> |ε <变量定义>?标识符<标识符后缀>:<类型>; <标识符后缀>?,标识符<标识符后缀> |ε <变量定义后缀>?<变量定义><变量定义后缀> |ε <类型>?INTEGER | LONG <过程说明部分>?<过程首部><分程序>;<过程说明部分后缀>|ε <过程首部>?PROCEDURE标识符<参数部分>; <参数部分>?(标识符: <类型>)|ε <过程说明部分后缀>?<过程首部><分程序>;<过程说明部分后缀>|ε <语句>?<赋值或调用语句>|<条件语句>|<当型循环语句>|<读语句> |<写语句>|<复合语句>|ε <赋值或调用语句>?标识符<后缀> <后缀>?:=<表达式>|(<表达式>)|ε <条件语句>?IF<条件>THEN<语句> <当型循环语句>?WHILE<条件>DO <语句> <读语句>?READ(标识符<标识符后缀>)

编译原理词法分析习题集带答案

《编译原理》习题(一)——词法分析 一、是非题(请在括号内,正确的划√,错误的划×) 1.编译程序是对高级语言程序的解释执行。(× ) 2.一个有限状态自动机中,有且仅有一个唯一的终态。(×) 9.两个正规集相等的必要条件是他们对应的正规式等价。(× ) 二、选择题 1.词法分析器的输出结果是_____。 A.( ) 记号 B.( ) 相应条目在符号表中的位置 C.( ) 记号和属性二元组D.( ) 属性值 2.正规式 M 1 和 M 2 等价是指_____。 A.( ) M1和M2的状态数相等 B.( ) M1和M2的有向边条数相等 C.( ) M1和M2所识别的语言集相等D.( ) M1和M2状态数和有向边条数相等3.语言是 A.句子的集合 B.产生式的集合 C.符号串的集合 D.句型的集合 4.编译程序前三个阶段完成的工作是 A.词法分析、语法分析和代码优化 B.代码生成、代码优化和词法分析 C.词法分析、语法分析、语义分析和中间代码生成 D.词法分析、语法分析和代码优化 5.扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即 A.字符 B.单词 C.句子 D.句型 6.构造编译程序应掌握______。 A.( )源程序B.( ) 目标语言 C.( ) 编译方法D.( ) 以上三项都是 7.词法分析的任务是 A.识别单词 B.分析句子的含义 C.识别句子 D.生成目标代码 三、填空题 1.计算机执行用高级语言编写的程序主要有两种途径:___解释__和__编译___。 3.编译过程可分为(词法分析),(语法分析),(语义分析与中间代码生成),(优化)和(目标代码生成)五个阶段。 6.扫描器的任务是从(源程序中)中识别出一个个(单词符号)。 17.一张转换图只包含有限个状态,其中有一个被认为是(初)态;而且实际上至少要有一个(终)态。 1.编译程序首先要识别出源程序中每个(单词),然后再分析每个(句子)并翻译其意义。3.通常把编译过程分为分析前端与综合后端两大阶段。词法、语法和语义分析是对源程序的(分析),中间代码生成、代码优化与目标代码的生成则是对源程序的(综合)。 5.对编译程序而言,输入数据是(源程序),输出结果是(目标程序)。

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

编译原理词法分析器语法分析器实验报告

编译技术 班级网络0802 学号3080610052姓名叶晨舟 指导老师朱玉全2011年 7 月 4 日

一、目的 编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。 二、任务及要求 基本要求: 1.词法分析器产生下述小语言的单词序列 这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值 DIM IF DO STOP END 标识符 常数(整)= + * ** , ( )1 2 3 4 5 6 7 8 9 10 11 12 13 14 $DIM $IF $DO $STOP $END $ID $INT $ASSIGN $PLUS $STAR $POWER $COMMA $LPAR $RPAR - - - - - - 内部字符串 标准二进形式 - - - - - - 对于这个小语言,有几点重要的限制: 首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。 再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为

编译原理-编写递归下降语法分析器

学号107 成绩 编译原理上机报告 名称:编写递归下降语法分析器 学院:信息与控制工程学院 专业:计算机科学与技术 班级:计算机1401班 姓名:叶达成 2016年10月31日

一、上机目的 通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、基本原理和上机步骤 递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。 递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。 每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。 自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。 无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。 无左递归:既没有直接左递归,也没有间接左递归。 无回溯:对于任一非终结符号U的产生式右部x1|x2|…|x n,其对应的字的首终结符号两两不相交。 如果一个文法不含回路(形如P?+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。 三、上机结果 测试数据: (1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i# (2)输出结果:i+i*i#为合法符号串 (3)输入一符号串如i+i*#,要求输出为“非法的符号串”。 程序清单: #include #include char str[50]; int index=0; void E(); //E->TX; void X(); //X->+TX | e void T(); //T->FY void Y(); //Y->*FY | e void F(); //F->(E) | i int main() /*递归分析*/ { int len; int m;

编译原理 语法分析器 (java完美运行版)(精选.)

实验二语法分析器 一、实验目的 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。 二、实验内容 ◆根据某一文法编制调试LL (1 )分析程序,以便对任意输入的符号串 进行分析。 ◆构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分 析程序。 ◆分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号 以及LL(1)分析表,对输入符号串自上而下的分析过程。 三、LL(1)分析法实验设计思想及算法 ◆模块结构: (1)定义部分:定义常量、变量、数据结构。 (2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等); (3)控制部分:从键盘输入一个表达式符号串; (4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

四、实验要求 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 2、如果遇到错误的表达式,应输出错误提示信息。 3、对下列文法,用LL(1)分析法对任意输入的符号串进行分析:(1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 输出的格式如下:

五、实验源程序 LL1.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.sql.*; import java.util.Vector; public class LL1 extends JFrame implements ActionListener { /** * */ private static final long serialVersionUID = 1L; JTextField tf1; JTextField tf2; JLabel l; JButton b0; JPanel p1,p2,p3; JTextArea t1,t2,t3; JButton b1,b2,b3;

编译原理实验报告

编译原理实验报告 班级 姓名: 学号: 自我评定:

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。 输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。 输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。例如,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码;VALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。 三、实现方法与环境 词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应的状态矩阵,该状态矩阵同控制程序便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具。 总的来说,开发一种新语言时,由于它的单词符号在不停地修改,采用LEX等工具生成的词法分析程序比较易于修改和维护。一旦一种语言确定了,则采用手工编写词法分析程序效率更高。 四、实验设计 1)题目1:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。 语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。 单词的分类:构造上述语言中的各类单词符号及其分类码表。 表I 语言中的各类单词符号及其分类码表 单词符号类别编码类别码的助记符单词值

编译原理实验报告(语法分析器)

. 编译原理实验专业:13级网络工程

语法分析器1 一、实现方法描述 所给文法为G【E】; E->TE’ E’->+TE’|空 T->FT’ T’->*FT’|空 F->i|(E) 递归子程序法: 首先计算出五个非终结符的first集合follow集,然后根据五个产生式定义了五个函数。定义字符数组vocabulary来存储输入的句子,字符指针ch指向vocabulary。从非终结符E函数出发,如果首字符属于E的first集,则依次进入T函数和E’函数,开始递归调用。在每个函数中,都要判断指针所指字符是否属于该非终结符的first集,属于则根据产生式进入下一个函数进行调用,若first集中有空字符,还要判断是否属于该非终结符的follow集。以分号作为结束符。 二、实现代码 头文件shiyan3.h #include #include

#include using namespace std; #define num 100 char vocabulary[num]; char *ch; void judge_E(); void judge_EE(); void judge_T(); void judge_TT(); void judge_F(); 源文件 #include"shiyan3.h" void judge_E() { if(*ch==';') { cout<<"该句子符合此文法!"<

int a=0; cout<<"按1结束程序"<>a; if(a==1) exit(0); } else if(*ch=='('||*ch=='i') { judge_T(); judge_EE(); } else { cout<<"该句子不匹配此文法!"<>a; if(a==1) exit(0); }

编译原理词法分析和语法分析报告 代码(C语言版)

词法分析 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图: 扫描子程序主要部分流程图 其他

词法分析程序的C语言程序源代码: // 词法分析函数: void scan() // 数据传递: 形参fp接收指向文本文件头的文件指针; // 全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。 void scan() { char ch; int flag,j=0,i=-1; while(!feof(fp1)) { ch=fgetc(fp1); flag=judge(ch); printf("%c",ch);//显示打开的文件 if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;} else if(flag==4) {i++;buffer[i]='?';line[i]=row;} else if(flag==5) {i++;buffer[i]='~';row++;} else if(flag==7) continue; else cout<<"\n请注意,第"<

编译原理知识点汇总

编译原理的复习提纲 1.编译原理=形式语言+编译技术 2.汇编程序: 把汇编语言程序翻译成等价的机器语言程序 3.编译程序: 把高级语言程序翻译成等价的低级语言程序 4.解释执行方式: 解释程序,逐个语句地模拟执行 翻译执行方式: 翻译程序,把程序设计语言程序翻译成等价的目标程序 5.计算机程序的编译过程类似,一般分为五个阶段: 词法分析、语法分析、语义分析及中间代码生成、代码优化、目标代码生成 词法分析的任务: 扫描源程序的字符串,识别出的最小的语法单位(标识符或无正负号数等) 语法分析是: 在词法分析的基础上的,语法分析不考虑语义。语法分析读入词法分析程序识别出的符号,根据给定的语法规则,识别出各个语法结构。 语义分析的任务是检查程序语义的正确性,解释程序结构的含义,语义分析包括检查变量是否有定义,变量在使用前是否具有值,数值是否溢出等。

语法分析完成之后,编译程序通常就依据语言的语义规则,利用语法制导技术把源程序翻译成某种中间代码。所谓中间代码是一种定义明确、便于处理、独立于计算机硬件的记号系统,可以认为是一种抽象机的程序 代码优化的主要任务是对前一阶段产生的中间代码进行等价变换,以便产生速度快、空间小的目标代码 编译的最后一个阶段是目标代码生成,其主要任务是把中间代码翻译成特定的机器指令或汇编程序 编译程序结构包括五个基本功能模块和两个辅助模块 6.编译划分成前端和后端。 编译前端的工作包括词法分析、语法分析、语义分析。编译前端只依赖于源程序,独立于目标计算机。前端进行分析 编译后端的工作主要是目标代码的生成和优化后端进行综合。独立于源程序,完全依赖于目标机器和中间代码。 把编译程序分为前端和后端的优点是: 可以优化配置不同的编译程序组合,实现编译重用,保持语言与机器的独立性。 7.汇编器把汇编语言代码翻译成一个特定的机器指令序列 第二章 1.符号,字母表,符号串,符号串的长度计算P18,子符号串的含义,符号串的简单运算XY,Xn, 2.符号串集合的概念,符号串集合的乘积运算,方幂运算,闭包与正闭包的概念P19,P20A0 ={ε} 3.重写规则,简称规则。非xx(V

编译原理-语法分析-算符优先文法分析器

编译原理实验报告 实验名称:编写语法分析分析器实验类型: 指导教师: 专业班级: 学号: 电子邮件: 实验地点: 实验成绩:

一、实验目的 通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。 1、选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序,至少选一题。 2、选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。 二、实验过程 编写算符优先分析器。要求: (a)根据算符优先分析算法,编写一个分析对象的语法分析程序。读者可根据自己的能力选择以下三项(由易到难)之一作为分析算法中的输入: Ⅰ:通过构造算符优先关系表,设计编制并调试一个算法优先分析程序Ⅱ:输入FIRSTVT,LASTVT集合,由程序自动生成该文法的算符优先关系矩阵。 Ⅲ:输入已知文法,由程序自动生成该文法的算符优先关系矩阵。(b)程序具有通用性,即所编制的语法分析程序能够使用于不同文法以及各种输入单词串,并能判断该文法是否为算符文法和算符优先文法。 (c)有运行实例。对于输入的一个文法和一个单词串,所编制的语法分析程序应能正确地判断,此单词串是否为该文法的句子,并要求输出分析过程。 三、实验结果 算符优先分析器: 测试数据:E->E+T|T T->T*F|F F->(E)|i 实验结果:(输入串为i+i*i+i)

四、讨论与分析 自下而上分析技术-算符优先分析法: 算符文法:一个上下无关文法G,如果没有且没有P→..QR...(P ,Q ,R属于非终结符),则G是一个算符文法。 FIRSTVT集构造 1、若有产生式P →a...或P →Qa...,则a∈FIRSTVT(P)。 2、若有产生式P→...,则FIRSTVT(R)包含在FIRSTVT(P)中。由优先性低于的定义和firstVT集合的定义可以得出:若存在某个产生式:…P…,则对所有:b∈firstVT(P)都有:a≦b。 构造优先关系表: 1、如果每个非终结符的FIRSTVT和LASTVT集均已知,则可构造优先关系表。 2、若产生式右部有...aP...的形式,则对于每个b∈FIRSTVT(P)都有

编 译 原 理 实 验 报 告

编译原理实验报告 课程:编译原理 系别:计算机系 班级:11网络 姓名:王佳明 学号:110912049 教师:刘老师 实验小组:第二组 1

实验一熟悉C程序开发环境、进行简单程序的调试 实验目的: 1、初步了解vc++6.0环境; 2、熟悉掌握调试c程序的步骤: 实验内容: 1、输入下列程序,练习Turbo C 程序的编辑、编译、运行。 #include main() { printf(“Programming is fun.\n”); } 2、分析程序,预测其运行结果,并上机检测你的预测。 #include main() { printf(“*\n”); printf(“* * *\n”); printf(“* * * * *\n”); printf(“* * * * * * *\n”); } 3、下面是一个加法程序,程序运行时等待用户从键盘输入两个整数,然后求出它们的和并输出。观察运行结果(程序输出),上机验证该程序。 #include main() { int a,b,c; printf(“Please input a,b:”); scanf(“%d,%d”,&a,&b); c=a+b; printf(“%d+%d=%d\n”,a,b,c); } 2

实验二词法分析器 一、实验目的: 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 二、实验要求: 1.对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。 2.本程序自行规定: (1)关键字"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat" (2)运算符:"+","-","*","/","=" (3)界符:"{","}","[","]",";",",",".","(",")",":" (4)其他标记如字符串,表示以字母开头的标识符。 (5)空格、回车、换行符跳过。 在屏幕上显示如下: ( 1 , 无符号整数) ( begin , 关键字) ( if , 关键字) ( +, 运算符) ( ;, 界符) ( a , 普通标识符) 三、使用环境: Windows下的visual c++6.0; 四、调试程序: 1.举例说明文件位置:f:、、11.txt目标程序如下: begin x:=9 if x>0 then x:=x+1; while a:=0 do 3

编译原理习题

编译原理习题 Revised as of 23 November 2020

一、填空题: 1-01.编译程序的工作过程一般可以划分为词法分析,语法分析,语义分析,之间代码生成,代码优化等几个基本阶段,同时还会伴有表格处理和出错处理 . 1-02.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序 ,则其翻译程序称为编译程序. 1-03.编译方式与解释方式的根本区别在于是否生成目标代码 . 1-04.翻译程序是这样一种程序,它能够将用甲语言书写的程序转换成与其等价的用乙语言书写的程序 . 1-05.对编译程序而言,输入数据是源程序 ,输出结果是目标程序 . 1-06.如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段: 编译阶段和运行阶段 .如果编译程序生成的目标程序是汇编语言程序,则源程序的执行分为三个阶段: 编译阶段 , 汇编阶段和运行阶段 . 1-07.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序。 1-08.一个典型的编译程序中,不仅包括词法分析、语法分析、中间代码生成、代码优化、目标代码生成等五个部分,还应包括表格处理和出错处理。其中,词法分析器用于识别单词。 1-09.编译方式与解释方式的根本区别为是否生成目标代码。 2-01.所谓最右推导是指:任何一步αβ都是对α中最右非终结符进行替换的。 2-02.一个上下文无关文法所含四个组成部分是一组终结符号、一组非终结符号、一个开始符号、一组产生式。 2-03.产生式是用于定义语法成分的一种书写规则。 2-04.设G[S]是给定文法,则由文法G所定义的语言L(G)可描述为: L(G)={x│S x,x∈*} 。 V T 2-05.设G是一个给定的文法,S是文法的开始符号,如果S x(其中x∈V*),则称x是文法的一个句型。 *),则称x是文法2-06.设G是一个给定的文法,S是文法的开始符号,如果S x(其中x∈V T 的一个句子。 3-01.扫描器的任务是从源程序中识别出一个个单词符号。 4-01.语法分析最常用的两类方法是自上而下和自下而上分析法。 4-02.语法分析的任务是识别给定的终极符串是否为给定文法的句子。 4-03.递归下降法不允许任一非终极符是直接左递归的。 4-04.自顶向下的语法分析方法的关键是如何选择候选式的问题。 4-05.递归下降分析法是自顶向上分析方法。 4-06.自顶向下的语法分析方法的基本思想是:从文法的开始符号开始,根据给定的输入串并按照文法的产生式一步一步的向下进行直接推导,试图推导出文法的句子,使之与给定的输入串匹配。 5-01.自底向上的语法分析方法的基本思想是:从给定的终极符串开始,根据文法的规则一步一步的向上进行直接归约,试图归约到文法的开始符号。 5-02.自底向上的语法分析方法的基本思想是:从输入串入手,利用文法的产生式一步一步地向上进行直接归约,力求归约到文法的开始符号。

编译原理实验报告一

实验一词法分析程序实现 一、实验目得与要求 通过编写与调试一个词法分析程序,掌握在对程序设计语言得源程序进行扫描得过程中,将字符流形式得源程序转化为一个由各类单词符号组成得流得词法分析方法 二、实验内容 基本实验题目:若某一程序设计语言中得单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符与四个算术运算符,试构造能识别这些单词得词法分析程序(各类单词得分类码参见表I)。 表I语言中得各类单词符号及其分类码表 输入:由符合与不符合所规定得单词类别结构得各类单词组成得源程序文件。 输出:把所识别出得每一单词均按形如(CLASS,VALUE)得二元式形式输出,并将结果放到某个文件中。对于标识符与无符号常数,CLASS字段为相应得类别码得助记符;V AL UE字段则就是该标识符、常数得具体值;对于关键字与运算符,采用一词一类得编码形式,仅需在二元式得CLASS字段上放置相应单词得类别码得助记符,V ALUE字段则为“空". 三、实现方法与环境 词法分析就是编译程序得第一个处理阶段,可以通过两种途径来构造词法分析程序.其一就是根据对语言中各类单词得某种描述或定义(如BNF),用手工得方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应得状态矩阵,该状态矩阵连同控制程序一起便组成了编译器得词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序得另外一种途径就是所谓得词法分析程序得自动生成,即首先用正规式对语言中得各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程

编译原理填空

1.编译程序的工作过程一般可以划分为 词法分析_、_语法分析_、_语义分析、_中间代码生成、_代码优化_等几个基本阶段,同时还会伴有表格处理和出错处理(6分)。 2. 在目标代码生成阶段,符号表是地址分配的依据。(2分)。 3. 符号表的数据结构可以是无序符号表、有序符号表、栈式符号表。 4. 词法分析阶段的错误主要是单词拼写错误,可通过最小距离匹配的办法纠正错误。 5. 在大部分现有编译中采用的方案主要有两种:动态分配方案和 静态分配方案。 1.编译程序与具体的机器无关,与具体的语言有关。 2.SLR(1)分析法中,L的含义是自左向右进行分析,R含义是采用最右推导的逆过程,S含义是简单的,“1”的含义是向貌似句柄的符号串的查看一个输入符号。 4.确定的有穷自动机是一个五元组,通常表示为M(Q,∑,t,q0,F)。 5.在大部分现有编译中采用的方案主要有两种:动态分配方案和___静态____分配方案。 6.假定G是一个文法,S是它的开始符号,如果S * α,则称_α__是一个句型,仅含终结符号的句型是一个句子。文法G所产生的句子的全体是一个语言,将它记为L(G)。 1.程序的翻译方式有两种,分别是_编译方式_和_解释方式_。 2.字的前缀是指该字的任意首部。(2分) 3.LR(1)分析法中,L的含义是自左向右进行分析,R含义是采用最右推导的逆过程-最左归约,“1”的含义是向貌似句柄的符号串后查看一个输入符号。 4.编译过程中,常见的中间语言形式有三元式、逆波兰式和四元式。 5.程序的可再入性指的是:当程序在执行时,可以_随时中断__它的执行,也可随时_执行进程__恢复其原来的_执行进程_;而且可以在_中断时间里_,又从该程序的_头上开始一个新的执行过程。 1. 编译程序工作过程中,第一段输入是源程序,最后阶段的输出为目标程序。 2.若二个正规式所表示的正规集相同,则认为二者是等价的(2分)。 3. 符号表中名字的有关信息在词法分析和语法语义分析过程中陆续填入。 4. 自顶向下语法分析方法的基本思想是:从识别符号出发,利用文法的规则不断建立直接推导,试图构造一个推导序列,最终由它推导出与输入符号串的符号串。 5. 堆式动态分配策略允许用户动态的申请和释放存储空间存储。。

编译原理标准实验报告

电子科技大学 实验报告 学生姓名:学号:指导教师: 实验地点:实验时间: 一、实验室名称:计算机学院软件工程实验室 二、实验项目名称:词法分析器的设计与实现 三、实验学时:4学时 四、实验原理 1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序。 2.词法分析的功能是从左到右逐个地扫描源程序字符串,按照词法规则识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关信息。 3.状态转换图是有限有向图,是设计词法分析器的有效工具。 五、实验目的 通过设计词法分析器的实验,使同学们了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力。 六、实验内容 实现求n!的极小语言的词法分析程序,返回二元式作为输出。 七、实验器材(设备、元器件) 1.操作系统:Windows XP

2.开发工具:VC6.0 3.普通PC即可 八、实验步骤 (1)启动VC6.0,创建空白工程项目。选择菜单中的“文件”->“新建”->“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“Visual C++ 项目”,在右边框中,选择“空项目(.Net)”,在对话框下边,选择工程文件存放目录及输入名称,如Example1,单击“确定”。 (2)建立相应的单词符号与种别对照表; (3)根据状态转换图编写相应的处理函数; (4)完成词法分析器; (5)编译与调试以上程序; (6)生成相应的*.dyd文件,作为后面语法分析的输入文件。 九、实验数据及结果分析

可以对源程序进行词法分析,如果有错给出出错信息和所在行数,如果无错则生成二元式文件。 十、实验结论 本实验程序较好地完成了词法分析程序的设计与实现,能够对所给文法的程序进行词法分析,在没有词法错误的时候生成相应的二元式文件。该实验程序可一次性给出源程序中的词法错误。 十一、总结及心得体会 通过该实验,对词法分析程序的设计,以及运用C语言进行编程有了更深刻的理解,同时加深了自己对词法分析程序的原理的理解与掌握,提高了自己的动手能力。 十二、对本实验过程及方法、手段的改进建议 程序设计合理,代码可进一步优化。 报告评分: 指导教师签字:

昆明理工大学 编译原理 实验二 语法分析器

昆明理工大学信息工程与自动化学院学生实验报告 (2011 —2012 学年第 1 学期) 课程名称:编译原理开课实验室: 445 2011年 12 月 19日年级、专业、 班 计科093 学号200910405310 姓名孙浩川成绩 实验项目名称语法分析器指导教师严馨 教 师评语 该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□ 该同学的实验能力: A.强□ B.中等□ C.差□ 该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□ 实验报告是否规范: A.规范□ B.基本规范□ C.不规范□ 实验过程是否详细记录: A.详细□ B.一般□ C.没有□ 教师签名: 年月日 一、实验目的及内容 实验目的:编制一个语法分析程序,实现对词法分析程序所提供的单词序列进行语法检 查和结构分析。 实验内容:在上机(一)词法分析的基础上,采用递归子程序法或其他适合的语法分析方法,实现其语法分析程序。要求编译后能检查出语法错误。 已知待分析的C语言子集的语法,用EBNF表示如下: <程序>→main()<语句块> <语句块> →‘{’<语句串>‘}’ <语句串> → <语句> {; <语句> }; <语句> → <赋值语句> |<条件语句>|<循环语句> <赋值语句>→ID=<表达式>

<条件语句>→if‘(‘条件’)’<语句块> <循环语句>→while’(‘<条件>’)‘<语句块> <条件> → <表达式><关系运算符> <表达式> <表达式> →<项>{+<项>|-<项>} <项> → <因子> {* <因子> |/ <因子>} <因子> →ID|NUM| ‘(’<表达式>‘)’ <关系运算符> →<|<=|>|>=|==|!= 二、实验原理及基本技术路线图(方框原理图或程序流程图)

编译原理语法分析器实验

语法分析器的设计 一、实验内容 语法分析程序用LL(1)语法分析方法。首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT 集的交集是不是都为空,如果是,则输入文法符合LL(1)文法,可以进行分析。对于文法: G[E]: E->E+T|T T->T*F|F F->i|(E) 分析句子i+i*i是否符合文法。 二、基本思想 1、语法分析器实现 语法分析是编译过程的核心部分,它的主要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。 语法分析程序的流程图如图5-4所示。 语法分析程序流程图 该程序可分为如下几步: (1)读入文法 (2)判断正误 (3)若无误,判断是否为LL(1)文法 (4)若是,构造分析表; (5)由句型判别算法判断输入符号串是为该文法的句型。 三、核心思想 该分析程序有15部分组成: (1)首先定义各种需要用到的常量和变量;

(2)判断一个字符是否在指定字符串中; (3)读入一个文法; (4)将单个符号或符号串并入另一符号串; (5)求所有能直接推出&的符号; (6)求某一符号能否推出‘& ’; (7)判断读入的文法是否正确; (8)求单个符号的FIRST; (9)求各产生式右部的FIRST; (10)求各产生式左部的FOLLOW; (11)判断读入文法是否为一个LL(1)文法; (12)构造分析表M; (13)句型判别算法; (14)一个用户调用函数; (15)主函数; 下面是其中几部分程序段的算法思想: 1、求能推出空的非终结符集 Ⅰ、实例中求直接推出空的empty集的算法描述如下: void emp(char c){ 参数c为空符号 char temp[10];定义临时数组 int i; for(i=0;i<=count-1;i++)从文法的第一个产生式开始查找 { if 产生式右部第一个符号是空符号并且右部长度为1, then将该条产生式左部符号保存在临时数组temp中 将临时数组中的元素合并到记录可推出&符号的数组empty中。 } Ⅱ、求某一符号能否推出'&' int _emp(char c) { //若能推出&,返回1;否则,返回0 int i,j,k,result=1,mark=0; char temp[20]; temp[0]=c; temp[1]='\0'; 存放到一个临时数组empt里,标识此字符已查找其是否可推出空字 如果c在可直接推出空字的empty[]中,返回1 for(i=0;;i++) { if(i==count) return(0); 找一个左部为c的产生式 j=strlen(right[i]); //j为c所在产生式右部的长度 if 右部长度为1且右部第一个字符在empty[]中. then返回1(A->B,B可推出空) if 右部长度为1但第一个字符为终结符,then 返回0(A->a,a为终结符) else

相关文档
最新文档