编译原理第一章练习和答案

合集下载

编译原理-第1章 编译概述--习题答案

编译原理-第1章 编译概述--习题答案

第1章编译概述1.判断下面的陈述是否正确。

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

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

(3)编译程序和解释程序的根本区别在于解释程序对源程序并没有真正进行翻译。

(4)因为编译程序和解释程序具有不同的功能,所以它们的实现技术也完全不同。

(5)编译程序的五个组成部分缺一不可。

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

(7)高级语言程序到低级语言程序的转换是基于语义的等价变换。

(8)含有优化部分的编译程序的执行效率高。

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

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

(11)无论一遍扫描的编译器还是多遍扫描的编译器都要对源程序至少扫描一遍。

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

(13)取编译程序前端改写其后端以生成不同机器上的目标代码,目前技术上还难以实现。

(14)支持程序设计人员进行程序计开发的工具,除了编译程序以外,还需要编辑程序、链接程序和调试程序等其他一些工具。

2. 指出下列错误信息是编译的哪个阶段报告的A. 词法B. 语法C. 语义(1)else没有匹配的if(2)使用的标识符没有定义(3)标识符中出现?号(4)赋值语句写成:x+y=1;(5)float a=1.1, b=2, c ; c=a%b;(6)数组下标越界3. 阅读教材第1章,回答以下问题:(1)计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?(2)画出编译程序的总体逻辑结构图,以语句“Area=3.14*r*r”编译过程为例,简述编译各个阶段的主要任务。

习题答案1.(1) × (2) × (3) × (4) × (5) × (6) √ (7) √(8) × (9) × (10) × (11) √ (12) √ (13) × (14) √2.BCABCC。

编译原理习题答案

编译原理习题答案

第一章习题解答1.解:源程序是指以某种程序设计语言所编写的程序。

目标程序是指编译程序(或解释程序)将源程序处理加工而得的另一种语言(目标语言)的程序。

翻译程序是将某种语言翻译成另一种语言的程序的统称。

编译程序与解释程序均为翻译程序,但二者工作方法不同。

解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行解释、执行,如此反复。

即边解释边执行,翻译所得的指令序列并不保存。

编译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行之。

即先翻译、后执行。

2.解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。

3.解:C语言的关键字有:auto break case char const continue default do doubleelse enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while。

上述关键字在C语言中均为保留字。

4.解:C语言中括号有三种:{},[],()。

其中,{}用于语句括号;[]用于数组;()用于函数(定义与调用)及表达式运算(改变运算顺序)。

C语言中无END关键字。

逗号在C语言中被视为分隔符和运算符,作为优先级最低的运算符,运算结果为逗号表达式最右侧子表达式的值(如:(a,b,c,d)的值为d)。

第二章习题解答1.(1)答:26*26=676(2)答:26*10=260(3)答:{a,b,c,...,z,a0,a1,...,a9,aa,...,az,...,zz,a00,a01,...,zzz},共26+26*36+26*36*36=34658个2.构造产生下列语言的文法(1){anbn|n≥0}解:对应文法为G(S) = ({S},{a,b},{ S→ε| aSb },S)(2){anbmcp|n,m,p≥0}解:对应文法为G(S) = ({S,X,Y},{a,b,c},{S→aS|X,X→bX|Y,Y→cY|ε},S)(3){an # bn|n≥0}∪{cn # dn|n≥0}解:对应文法为G(S) = ({S,X,Y},{a,b,c,d,#}, {S→X, S→Y,X→aXb|#,Y→cYd|# },S) (4){w#wr# | w?{0,1}*,wr是w的逆序排列}解:G(S) = ({S,W,R},{0,1,#}, {S→W#, W→0W0|1W1|# },S)(5)任何不是以0打头的所有奇整数所组成的集合解:G(S) = ({S,A,B,I,J},{-,0,1,2,3,4,5,6,7,8,9},{S→J|IBJ,B→0B|IB|e, I→J|2|4|6|8, Jà1|3|5|7|9},S)(6)所有偶数个0和偶数个1所组成的符号串集合解:对应文法为 S→0A|1B|e,A→0S|1C B→0C|1S C→1A|0B3.描述语言特点(1)S→10S0S→aAA→bAA→a 解:本文法构成的语言集为:L(G)={(10)nabma0n|n, m≥0}。

编译原理-第1-5章习题课答案解析

编译原理-第1-5章习题课答案解析
二义性的含义: 如果文法存在某个句子对应两棵以上
不同的语法树,或者两种以上不同的最 左/右推导,则称这个文法是二义的。
首先:找到此文法对应的一个句子 iiiei 其次:构造与之对应的两棵语法树
S
S
i SeS
iS
iS
i
i S eS
i
ii
结论:因为该文法存在句子iiiei对应两棵 不同的语法树,因而该文法是二义的。
思路:先写出满足条件的正规式,由正规式构造 NFA,再把NFA确定化和最小化。
满足条件的正规式:(0|10)*
(0|10)*
x
y
1
0
1
0
0
1
2
0
x 1
y
编译原理
确定化: 给状态编号:
0
1
2
0
x 1
{X,1,Y} {1,Y} {2}
0
{1,Y} {1,Y} {1,Y}
0
0
1
1
1
2
1
chapter1~5习题
(1){0,1}上的含有子串010的所有串。 正规式:(0 | 1)* 010 (0 | 1)*
(2) {0,1}上不含子串010的所有串。 正规式:1*(0|11*1)* 1*( 0 | 11)*1* 1*0*1* (0 | 11)*(0 | 1) DFA做法同第7题。
编译原理
chapter1~5习题
编译原理
chapter1~5习题
8、给出下面正规表达式 (5)沒有重複出現的數字的數字符號串的全體
令ri=i| ,i=0,1,2...9 R0|R1|R2|...|R9記為∑Ri i (0,1,2...,9) P(0,1,2...,9)表示0,1,2...,9的全排列

编译原理练习及答案

编译原理练习及答案

第一章练习题(绪论)一、选择题1.编译程序是一种常用的B软件。

A) 应用B) 系统C) 实时系统D) 分布式系统2.编译程序生成的目标代码程序 B 是可执行程序。

A) 一定B) 不一定3.编译程序的大多数时间是花在 D 上。

A) 词法分析B) 语法分析C) 出错处理D) 表格管理4.将编译程序分成若干“遍”将 B 。

A)提高编译程序的执行效率;B)使编译程序的结构更加清晰,提高目标程序质量;C)充分利用内存空间,提高机器的执行效率。

5.编译程序各个阶段都涉及到的工作有 D 。

A) 词法分析B) 语法分析C) 语义分析D) 表格管理6.词法分析的主要功能是 C 。

A) 识别字符串B) 识别语句C) 识别单词D) 识别标识符7.若某程序设计语言允许标识符先使用后说明,则其编译程序就必须A 。

A) 多遍扫描B) 一遍扫描8.编译方式与解释方式的根本区别在于 B 。

A) 执行速度的快慢B) 是否生成目标代码C) 是否语义分析9.多遍编译与一遍编译的主要区别在于D。

A)多遍编译是编译的五大部分重复多遍执行,而一遍编译是五大部分只执行一遍;B)一遍编译是对源程序分析一遍就立即执行,而多遍编译是对源程序重复多遍分析再执行;C)多遍编译要生成目标代码才执行,而一遍编译不生成目标代码直接分析执行;D)多遍编译是五大部分依次独立完成,一遍编译是五大部分交叉调用执行完成。

10.编译程序分成“前端”和“后端”的好处是 DA)便于移植B)便于功能的扩充C)便于减少工作量D)以上均正确第二章练习题(文法与语言)1、直接推导、+推导、*推导2、句型和句子, 文法定义(搞清楚)G=(VT,VN,S,P)3、语言的形式定义: L(G[S])={x | S -> x 且x∈VT*}若L是无穷的,则G一定是递归的4、最左推导、最右推导(规范推导)5、归约、规范归约6、递归:规则递归、文法递归(1) A->BA,B->CA,…(2) A->B,B->CA,…7、文法的等价性:G1=G28.(1)每棵子树的叶子组成一个短语;(2)每棵简单子树的叶子组成一个直接短语;简单子树:只有单层分支的子树(3)最左边简单子树的叶子是句柄一个句型不一定只对应一棵唯一的语法树。

《编译原理》课后习题答案

《编译原理》课后习题答案

第7 题证明下述文法G[〈表达式〉]是二义的。

〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉〈运算符〉∷=+|-|*|/答案:可为句子a+a*a 构造两个不同的最右推导:最右推导1 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉a=>〈表达式〉* a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a最右推导2 〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉〈表达式〉=>〈表达式〉〈运算符〉〈表达式〉〈运算符〉a=>〈表达式〉〈运算符〉〈表达式〉* a=>〈表达式〉〈运算符〉a * a=>〈表达式〉+ a * a=>a + a * a第8 题文法G[S]为:S→Ac|aB A→ab B→bc该文法是否为二义的?为什么?答案:对于串abc(1)S=>Ac=>abc (2)S=>aB=>abc即存在两不同的最右推导。

所以,该文法是二义的。

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

第9 题考虑下面上下文无关文法:S→SS*|SS+|a(1)表明通过此文法如何生成串aa+a*,并为该串构造语法树。

(2)G[S]的语言是什么?答案:(1)此文法生成串aa+a*的最右推导如下S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*(2)该文法生成的语言是:*和+的后缀表达式,即逆波兰式。

第10 题文法S→S(S)S|ε(1) 生成的语言是什么?(2) 该文法是二义的吗?说明理由。

答案:(1)嵌套的括号(2)是二义的,因为对于()()可以构造两棵不同的语法树。

第11 题令文法G[E]为:E→T|E+T|E-T T→F|T*F|T/F F→(E)|i证明E+T*F 是它的一个句型,指出这个句型的所有短语、直接短语和句柄。

(完整版)编译原理课后答案(第三版蒋立源康慕宁编)

(完整版)编译原理课后答案(第三版蒋立源康慕宁编)

编译原理课后答案(第三版蒋立源康慕宁编)第一章习题解答1解:源程序是指以某种程序设计语言所编写的程序。

目标程序是指编译程序(或解释程序)将源程序处理加工而得的另一种语言(目标语言)的程序。

翻译程序是将某种语言翻译成另一种语言的程序的统称。

编译程序与解释程序均为翻译程序,但二者工作方法不同。

解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行解释、执行,如此反复。

即边解释边执行,翻译所得的指令序列并不保存。

编译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行之。

即先翻译、后执行。

2解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。

3解:C语言的关键字有:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while。

上述关键字在C语言中均为保留字。

4解:C语言中括号有三种:{},[],()。

其中,{}用于语句括号;[]用于数组;()用于函数(定义与调用)及表达式运算(改变运算顺序)。

C语言中无END关键字。

逗号在C语言中被视为分隔符和运算符,作为优先级最低的运算符,运算结果为逗号表达式最右侧子表达式的值(如:(a,b,c,d)的值为d)。

5略第二章习题解答1.(1)答:26*26=676(2)答:26*10=260(3)答:{a,b,c,...,z,a0,a1,...,a9,aa,...,az,...,zz,a00,a01,...,zzz},共26+26*36+26*36*36=34658个2.构造产生下列语言的文法(1){anbn|n≥0}解:对应文法为G(S) = ({S},{a,b},{ S→ε| aSb },S)(2){anbmcp|n,m,p≥0}解:对应文法为G(S) = ({S,X,Y},{a,b,c},{S→aS|X,X→bX|Y,Y→cY|ε},S)(3){an # bn|n≥0}∪{cn # dn|n≥0}解:对应文法为G(S) = ({S,X,Y},{a,b,c,d,#}, {S→X, S→Y,X→aXb|#,Y→cYd|# },S)(4){w#wr# | w?{0,1}*,wr是w的逆序排列}解:G(S) = ({S,W,R},{0,1,#}, {S→W#, W→0W0|1W1|# },S)(5)任何不是以0打头的所有奇整数所组成的集合解:G(S) = ({S,A,B,I,J},{-,0,1,2,3,4,5,6,7,8,9},{S→J|IBJ,B→0B|IB|e, I→J|2|4|6|8, Jà1|3|5|7|9}, S)(6)所有偶数个0和偶数个1所组成的符号串集合解:对应文法为S→0A|1B|e,A→0S|1C B→0C|1S C→1A|0B3.描述语言特点(1)S→10S0S→aAA→bAA→a解:本文法构成的语言集为:L(G)={(10)nabma0n|n, m≥0}。

编译原理考题答案(一二三章)

编译原理考题答案(一二三章)

第一章能够完成从一种语言到另一种语言的变换的软件称为翻译器编译器是一种翻译器,他进行语言变换的特点是目标语言比源语言低级编译的各个阶段:字符流-词法分析器-记号流-语法分析器-语法树-中间代码生成器-中间表示-独立与机器的代码优化器-中间表示-代码生成器-目标机器代码-依赖于机器的代码优化器-目标机器代码第二章语法分析器的任务是把构成源程序的字符流翻译成词法记号流。

2.1词法分析是编译的第一阶段,它的主要任务是扫描输入字符流,产生用于词法分析的词法记号序列。

完成的其他任务(实验一)其一是剥去源程序的注解和由空格、制表或换行符等引起的空白,另一任务是把来自编译器各个阶段的错误信息和源程序练习起来。

2.12词法记号的属性必考略2.21 字母表上的串是该字母表符号的有穷序列术语语言表示字母表上的一个串集,属于该语言的串称为该语言的句子或字。

如果x和y都是串,那么x和y的链接(xy)是吧y加到x后边形成的串。

对连接运算而言,空串是一个恒等元素。

表2.2 语言运算的定义(未打印)例2.2 略2.3 语言的识别器是一个程序,它取串x作为输入,当x是语言的句子时,他回答是,否则回答不是。

可以通过构造称为优先自动机的更一般的转换图,把正规式翻译成识别器。

有限自动机分为确定的和不确定的两种情况。

不确定的含义是:存在这样的状态,对于某个输入符号,它存在不止一种转换。

NFA转化为DFA 略DFA 化简略课后习题:第三章源程序 图3.1 分析器在编译器模型中的位置3.1 一个上下文无关文法G是一个四元组(Vt,Vn,S,P),其中:Vt是一个终结符集合,Vn是非终结符集合Vt并Vn=空集,S是一个终结符,称为开始符号,P是产生式的有限集合。

3.1.2代换句型中最左边非终结符的推导,这样的推导叫做最左推导。

最右推导,略。

3.14二义性一个文法如果存在某个句子有不止一颗分析树与之对应,那么称这个文法是二义的。

3.2.5 消除二义性。

编译原理习题及答案(整理后)

编译原理习题及答案(整理后)

第一章1、将编译程序分成若干个“遍”是为了。

b.使程序的结构更加清晰2、构造编译程序应掌握。

a.源程序b.目标语言c.编译方法3、变量应当。

c.既持有左值又持有右值4、编译程序绝大多数时间花在上。

d.管理表格5、不可能是目标代码。

d.中间代码6、使用可以定义一个程序的意义。

a.语义规则7、词法分析器的输入是。

b.源程序8、中间代码生成时所遵循的是- 。

c.语义规则9、编译程序是对。

d.高级语言的翻译10、语法分析应遵循。

c.构词规则二、多项选择题1、编译程序各阶段的工作都涉及到。

b.表格管理c.出错处理2、编译程序工作时,通常有阶段。

a.词法分析b.语法分析c.中间代码生成e.目标代码生成三、填空题1、解释程序和编译程序的区别在于是否生成目标程序。

2、编译过程通常可分为5个阶段,分别是词法分析、语法分析中间代码生成、代码优化和目标代码生成。

3、编译程序工作过程中,第一段输入是源程序,最后阶段的输出为标代码生成程序。

4、编译程序是指将源程序程序翻译成目标语言程序的程序。

一、单项选择题1、文法G:S→xSx|y所识别的语言是。

a. xyxb. (xyx)*c.x n yx n(n≥0) d. x*yx*2、文法G描述的语言L(G)是指。

a. L(G)={α|S+⇒α , α∈V T*}b. L(G)={α|S*⇒α, α∈V T*}c. L(G)={α|S*⇒α,α∈(V T∪V N*)} d. L(G)={α|S+⇒α, α∈(V T∪V N*)}3、有限状态自动机能识别。

a. 上下文无关文法b. 上下文有关文法c.正规文法d. 短语文法4、设G为算符优先文法,G 的任意终结符对a、b有以下关系成立。

a. 若f(a)>g(b),则a>bb.若f(a)<g(b),则a<bc. a~b都不一定成立d. a~b一定成立5、如果文法G是无二义的,则它的任何句子α。

a. 最左推导和最右推导对应的语法树必定相同b. 最左推导和最右推导对应的语法树可能不同c. 最左推导和最右推导必定相同d. 可能存在两个不同的最左推导,但它们对应的语法树相同6、由文法的开始符经0步或多步推导产生的文法符号序列是。

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

例1设有文法G[S]:
S →a|(T )| T →T,S|S (1) 试给出句子(a,a,a)的最左推导。

(2) 试给出句子(a,a,a)的分析树 (3) 试给出句子(a,a,a)的最右推导和最右推导的逆过程(即最左规约)的每一步的句柄。

【解】(1) (a,a,a)的最左推导
S=>(T) =>(T,S) =>( T,S,S) =>( S,S,S) =>(a,S,S) =>(a,a,S) =>(a,a,a) (2)(a,a,a)的分析树
S
( T ) T , S S T ,
S a
a
(3) (a,a,a)最右推导 最左规约每一步的句柄
S=>(T) 句柄为:(T) =>(T,S) 句柄为:T,S =>(T,a) 句柄为:a =>(T,S,a) 句柄为:T,S =>(T,a,a) 句柄为:第一个a =>(S,a,a) 句柄为:S
=>(a,a,a) 句柄为:第一个a
例2已知文法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
Z
1
V
由Z 推导出10或01后就终止或进入递归,而Z 的每次递归将推导出相同的符号串:10或
01。

所以G[Z]产生的语言L(G[Z])={x|x∈(10|01)+ }
(3)该文法属于3型文法。

例3 已知文法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}.
例4 构造描述语言L(G[S])={(n)n|n≥0} 的文法。

【解】(1)找出语言的一些典型句子:
n=0 ε
n=1 ( )
n=2 (())

所以, L(G[S])={ ε、( ) (())、((()))、…}
(2)分析句子的特点:
只含有(和),(和)的个数相同且对称, 句子中所含的符号数可无限, 句子的个数可无限。

(3)凑规则:由 S→ε|() 得到ε|(),由 A→ (S) 得到 (()),(()) 是在()的两边再加上一对()得到,((()))是在(())的两边再加上一对()得到,…所以将上述产生式合并为S→(S) |ε。

(4)得到文法 G[S]: S→(S) |ε
(5)检验:语言所有的句子均可由文法G[S]推导出来, 文法G[S]推导出来的所有终结符号串均为语言的句子.
例5 构造描述语言L(G[S])={a m b n |n>m>0} 的文法。

【解】找出语言的一些典型句子:abb、abbb、…、aabbb、aabbbb、…,语言的句子的特点是仅含有a、b, a在b的左边,b的个数大于a的个数,a的个数至少是1。

单独生成c k, k>1 可用产生式 C→c |Cc
句子中要求b的个数大于a的个数,所以得到文法:
G[S]: S →Ab |Sb
A →aAb |ab
检验:语言所有的句子均可由文法G[S]推导出来, 文法G[S]推导出来的所有终结符号串均为语言L(G[S])的句子.
例6设有文法G[S]:
S →S*S|S+S|(S)|i
该文法是否为二义文法?
【解】该文法是二义文法,因为该文法存在句子i*i+i,该句子有两棵不同的语法树如图2所示.。

S
S S S S (1)
+
S
S + S S S (2)
*
i
i
i
图2句子i*i+i 的语法树
例7写一个文法,使其语言是奇数集,且每个奇数不以0开头。

【解】解题思路
首先分析题意,本题是希望构造一个文法,由它产生的句子是奇数,并且不以0开头,也就是说它的每个句子都是以1、3、5、7、9中的某个数结尾。

如果数字只有一位,则1、3、5、7、9就满足要求,如果有多位,则要求第1位不能是0,而中间有多少位,每位是什么数字(必须是数字)则没什么要求,因此,我们可以把这个文法分3部分来完成。

分别用3个非终结符来产生句子的第1位、中间部分和最后一位。

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

解答:
G(S):S →CD |D C →CB |A B →A |0
A →2|4|6|8|D D →1|3|5|7|9
例8写一个上下文无关文法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
例9证明下面的文法是二义的:
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
例10某程序设计语言的表达式由运算符θ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
F→(E)|I
d. E→T|Tθ3 E
T→F|Fθ1T|Fθ2T
F→(E)|I
【解】对于一个包含运算符的语言,运算符的结合顺序、运算符的优先级在文法中反映为递归的方向和推导(或规约)的先后,左递归表明左边的运算先处理,对应的运算符左结合;右递归表明右边的运算先处理,对应的运算符右结合。

两个运算符连续出现,后推导出(或先被规约)的,表明其运算先被处理,因此优先级高;反之,先推导出(或后被规约)的,表明其运算后被处理,因此优先级低。

题意要求:θ1和θ2的优先级相同,θ3的优先级低于θ1、θ2的优先级,因此θ3比
θ1、θ2先推导出来,即应为图3所示的四种情形。

U
U
θ3 U V
V
(1)
θ1
U
U
θ3 U V
V (2)
θ1
U
U θ3 U V
V
(3)
θ2
U
U
θ3 U V
V
(4)
θ2
图3可能的文法推导顺序
因此a 和b 不成立。

又因为优先级相同的运算符从右往左计算,应采用右递归,即应为图4所示的情形。

U
U
θ1 V W
V
(1)
θ1
U
U
2 V W
V
(2
θ2
U
U
θ3 V W
V
(3)
θ3
图4可能的文法递归结构
故c 不成立,应为d 。

相关文档
最新文档