编译原理分知识点习题-语法制导和翻译

合集下载

编译原理分知识点习题 语法制导和翻译

编译原理分知识点习题 语法制导和翻译
解答:布尔表达式的语义子程序为:
规则语义动作
(1) E::=I {E.TC:=null;E.FC:=NXQ;
GEN (Jez , ENTRY(i),__,0) }
(2) E::= i1rop i2{ E.TC:=null;E.FC:=NXQ;
GEN (Jnrop,ENTRY(i1), ENTRY(i2),0)}
S→R2E{BACKPATCH (E.FC, R2.QUAD); S.CHAIN:=E.TC}
8.为便于填写被说明的名字的性质,试修改下面关于变量类型说明的文法,并给出相应的语义动作。
待修改的类型说明文法为:
D→namelist integer|namelist
namelist→i,namelist|i
10.写出翻译过程调用语句的语义子程序。要求生成的四元式序列在转子指令之前的参数四元式par按反序出现(即和实在参数的顺序相反),在此情况下翻译过程调用语句时是否需要语义变量(队列)QUEUE呢?
解答:为使过程调用语句的语义子程序产生的参数四元式par按反序出现,过程调用语句的文法为:
S→call i (arglist)
2.(湖北省高等教育自学考试)什么是语法制导翻译?为什么把这种方法叫语法制导翻译?
解答:所谓语法制导翻译,是指在语法规则的制导下,通过计算语义规则,完成对输入符号串的翻译。
由于使用属性文法时把语法规则和语义规则分开,但在使用语法规则进行推导或规约的同时又使用这些语义规则来知道翻译与最终产生目标代码,所以称为语法制导翻译。
1.一般情况下,为什么语义分析部分仅产生中间代码?
解答:一般情况下,语义分析部分仅产生中间代码,其原因是:
可使难点分解,分别解决。
可对语义分析产生的中间代码进行优化,以产生高效率的目标代码。

编译原理第八章—语法制导翻译

编译原理第八章—语法制导翻译

语法制导翻译

属性文法 语法制导翻译概论

计算语义规则 S-属性文法和自下而上翻译 L-属性文法和自上而下翻译 L-属性文法和自下而上翻译
属性文法

属性文法的形式化定义 属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。 V:有穷的属性集,每个属性与文法的一个终结 符或非终结符相连。 F:关于属性的断言或谓词集。每个断言与一个 产生式相联。
综合属性

将属性附着在分析树对应文法符号上,形成注释分 析树。(属性作为分析树的注释) 8+5*2的分析树 L E
E
T F
+
T
T F digit F
digit
digit
综合属性

将属性附着在分析树对应文法符号上,形成注释分 析树。(属性作为分析树的注释) 8+5*2的注释分析树 L E.val E.val + T.val F.val T.val F.val digit.lexval
属性文法

属性的抽象表示 例如:E.val(值) E.type(类型) E.code(代码序列) E.place(存储空间)
属性文法

E
T
文法G:

+
T
ET1+T2|T1 or T2 Tnum|true|false
3
4
ET1+T2 {T1.t=int AND T2.t=int} ET1orT2{ T1.t=bool AND T2.t=bool} E{T1.t=T2.t} Tnum {T.t=int} T{T1.t=int} + Ttrue {T.t=bool} T{T2.t=int} Tfalse {T.t=bool}

编译原理课后习题答案

编译原理课后习题答案

(a) 0 ( 0 | 1)* 0
由0和1组成且以0开始和结束的符号串全体. (b) ( ( | 0 ) 1* ) * 由0和1组成的符号串全体.
(c) ( 0 | 1 )* 0 ( 0 | 1) ( 0 | 1) 由0和1组成且以000,001,010或011结束的符号串全体. 长度大于等于3且倒数第3个字符为0的01符号串全体.
R R ‘|’ S | S S ST | T T U* | U U (R) | a | b
a
a
a
28
4.5 dangling-else文法: stmt if expr then stmt | matched-stmt matched-stmt if expr then matched-stmt else stmt | other 试说明此文法是二义性的。 句子 if e1 then if e2 then s1 else if e3 then s2 else s3 if e1 then if e2 then s1 else if e3 then s2 else s3
0|1 B 1 D E 0 ABDE ABDE ABCDE ABDE 1 ABCDE ABCDE
start
A
1
C
NFA 0
start A' 1
0
B'
0
1
start
A'
1
最小化DFA
24
DFA
3.8 给定右线性文法G: S 0S | 1S | 1A | 0B A 1C |1 B 0C | 1 C 0C | 1C | 0 | 1 试求一个等价的左线性文法G’.
20
3.6 给出接受下列在字母表{0,1}上的DFA。 (a)所有以00结束的符号串的集合; (1|0)*00

编译第七章语法制导翻译

编译第七章语法制导翻译

16
第一节 概述
-------树形表示法
-------三元式
-------四元式:最常用的形式
精选PPT
第七章中间代码的生成 1 2
第一节 概述
❖ 二、翻译方法
1、语法制导翻译

----在语法分析的基础上进行边分析边翻译。
●注:1)语法制导翻译时会根据文法产生式右部符 号串的含义进行翻译,翻译的结果是生成相应中间 代码。
精选PPT
15
第一节 概述
❖ 四、常见的中间代码形式 ❖ 2.三元式 ❖ (Operator,Operand1, Operand2) ❖ 注:1)这里三元式本身作为存放结果的单元。
2)为了在其它三元式中利用当前三元式的结果, 需要对三元式进行遍号。三元式的编号就作为相应 三元式的结果值。
精选PPT
第七章语法制导翻 译和中间代码生成
精选PPT
1
第一节 概述
❖ 语法分析之后,编译的任务是由已识别为正确的源程 序生成一组规格一致,便于计算机加工的指令形式。
一、中间代码生成方法
语法制导翻译,属性文法制导翻译
二、中间代码
●中间代码:不是机器语言,便于生成机器语言,便于代 码优化。
●中间代码的形式:
-------逆波兰式
S3
S2
r4
r4
S3
S2
S3
S2
S4
S5
r1(S4) S5(r1)
r1(S4) r2(S5)
r3
r3
精选PPT
)#
acc
r4 r4
S9 r1 r1 r2 r2 r3 r3
GOTO S 1 6 7 8
13
步骤 状态

编译原理 第5章语法制导的翻译

编译原理 第5章语法制导的翻译

属性和文法符号相关联 规则和产生式相关联

根据需要,将文法符号和某些属性相关联, 并通过语义规则来描述如何计算属性的值


E→E1+T E.code=E1.code || T.code || ‘+’ code表示了我们关心的表达式的逆波兰表示,规则说明 加法表达式的逆波兰表示由两个分量的逆波兰表示并置, 然后加上‘+’得到。
digitlexval=3
18
适用于自顶向下分析的SDD


前面的表达式文法存在直接左递归,因 此无法直接用自顶向下方法处理。 消除左递归之后,无法直接使用属性val 进行处理:


比如规则:T→FT’ T’→*FT’ T对应的项中,第一个因子对应于F, 而运算符在T’中。
19
相同表达式的不同文法的比较
38
例5.15 分析栈实现的例子

假设语法分析栈存放在一个被称为stack 的记录数组中,下标top指向栈顶;


stack[top]指向这个栈的栈顶;stack[top-1] 指向栈顶下一个位置; 如果不同的文法符号有不同的属性集合,我 们可以使用union来保存这些属性值。(归 约时,我们知道栈顶向下的各个符号分别是 什么)
语义翻译的流程
输 入 符 号 串 分 析 树 依 赖 图




的 计
实际上,编译中语义翻译的实现并不是 按图中的流程处理的;而是随语法分析 的进展,识别出一个语法结构,就对它 的语义进行分析和翻译。

9
5.1 语法制导定义

4.什么是语法制导定义(SDD) 上下文无关文法和属性/规则的结合;

编译原理习题课(3)

编译原理习题课(3)

四元式序列: (1) + (2) (3) + (4) * (5) + (6) + (7) -
a b T1 T1 - T2 c d T3 T2 T3 T4 a b T5 T5 c T6 T4 T6 T7
23
赋值语句的翻译
简单算术表达式及赋值语句 数组元素的引用 产生有关类型转换的指令
24
P218-4. 按7.3节所说的办法,写出下面赋值句
L→En print(E.val)
E→E1+T E.val := E1.val+T.val
E→T
E.val :=T.val
T→T1*F T.val :=T1.val* F.val
T→F
T.val :=F.val
F→ (E) F.val :=E.val
F→digit F.val :=digit.lexval
5
digit.lexval=4
E → T { R.i:=T.val } R { E.val:=R.s }
P164-2. 对表达式((a)+(b))R:→ +
(的1)抽按象照语表法6树.4所;示的属性文R 法→ TR构- 1{ {造RR1..该i:s=:=R表.Ri+1达T.s.v式}al }
(式2)的按抽照象图语6法.17树所。示的翻译R模→式TR1,{{ RR构1.s.i::=造=R{RR.该.ii-.}sT表:.=vaR达l }1.s }
综合属性:“自下而上”传递信息 继承属性性文法的处理方法
依赖图 树遍历 一遍扫描
L-属性文法适合于一遍扫描的自上而下分析 S-属性文法适合于一遍扫描的自下而上分析
4
L
P164–1按照表6.1所

编译原理chapter5 语法制导翻译

编译原理chapter5 语法制导翻译

for 结点n所用产生式对应的每一条
语义规则 b:=f(c1,c2,…,ck ) do
精品文档
14
5.1.5 计算顺序
◆拓扑排序
一个有向非循环图的拓扑排序是图中
结点的任何顺序m1,m2,…,mk,使得
边必须是从序列中前面的结点指向后面的
结点,也就是说,如果mi→mj是mi到mj的
一条边,那么在 序列中mi必须出现在mj的
规则来计算综合属性值,即在 用哪个产生
式进行归约后,就执行那个产生式的s-属性
定义计算属性的值,从叶结点到根结点进行
计算。
5.1.3 继承属性
继承属性值是由此结点的父结点和/或兄
弟结点的某些属性值来决定的。
例5 . 3 变量说明的类性定义
int a,b,c
精品文档
11
表5.2 带有继承属性L.in的语法制导定义
精品文档
3
要求:随着语法分析,分析树逐步被构造出 来,进展到每一步,定义的文法符号的属性 值是可以计算出来的。一个重要的属性定义 类称作“L—属性”定义,满足上述要求。
精品文档
4


















图5.1 语法制导翻译的概观
精品文档
5
5.1 语法制导定义(Syntax-directed definitions) ◆语法制导定义是对上下文无关文法的推广 综◆合属属性性 继承属性 ◆依赖图 语义规则建立了属性之间的依赖关系,这些关 系可以用图来表示,这样的图称为依赖图。
语法树是常用的一种中间表示形式。

编译原理习题及答案

编译原理习题及答案

2. 正规式 M 1 和 M 2 等价是指_____。 A.( ) M1 和 M2 的状态数相等 C.( ) M1 和 M2 所识别的语言集相等 B.( ) M1 和 M2 的有向边条数相等 D.( ) M1 和 M2 状态数和有向边条数相等
3. 文法 G:S→xSx|y 所识别的语言是_____。 A.( ) xyx B.( ) (xyx)* C.( ) xnyxn(n≥0) D.( ) x*yx*
10.编译程序使用_____区别标识符的作用域。 A. ( ) 说明标识符的过程或函数名 B.( ) 说明标识符的过程或函数的静态层次 C.( ) 说明标识符的过程或函数的动态层次 D. ( ) 标识符的行号 三、填空题(每空 1 分,共 10 分) 1.计算机执行用高级语言编写的程序主要有两种途径:___解释__和__编译___。 2.扫描器是__词法分析器___,它接受输入的__源程序___,对源程序进行___词法分析__并识别出一个个 单词符号,其输出结果是单词符号,供语法分析器使用。 3.自上而下分析法采用___移进__、归约、错误处理、___接受__等四种操作。 4.一个 LR 分析器包括两部分:一个总控程序和___一张分析表__。 5.后缀式 abc-/所代表的表达式是___a/(b-c)__。 6.局部优化是在__基本块___范围内进行的一种优化。 四、简答题(20 分) 1. 简要说明语义分析的基本功能。 答:语义分析的基本功能包括: 确定类型、类型检查、语义处理和某些静态语义检 查。
4lr0分析器所谓lr0分析是指从左至右扫描和自底向上的语法分析且在分析的每一步只须根据分析栈当前已移进和归约出的全部文法符号并至多再向前查看0个输入符号就能确定相对于某一产生式左部符号的句柄是否已在分析栈的顶部形成从而也就可以确定当前所应采取的分析动作移进还是按某一产生式进行归约等
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.一般情况下,为什么语义分析部分仅产生中间代码解答:一般情况下,语义分析部分仅产生中间代码,其原因是:可使难点分解,分别解决。

可对语义分析产生的中间代码进行优化,以产生高效率的目标代码。

语义分析通常与机器无关,目标代码往往与机器有关。

把语义分析与目标代码生成分开,可让一个语义分析程序适用于多个目标代码生成程序。

2.(湖北省高等教育自学考试)什么是语法制导翻译为什么把这种方法叫语法制导翻译解答:所谓语法制导翻译,是指在语法规则的制导下,通过计算语义规则,完成对输入符号串的翻译。

由于使用属性文法时把语法规则和语义规则分开,但在使用语法规则进行推导或规约的同时又使用这些语义规则来知道翻译与最终产生目标代码,所以称为语法制导翻译。

3.给出将附值语句翻译成四元式的语法制导定义,允许右部表达式含有加法、乘法、取负、括号运算。

生成赋值语句X:=B*(C+D)+A 的四元式。

解答:赋值语句的自下而上的语法制导翻译过程描述为:规则语义动作(1)A::=i:=E {GEN (:=,,__,ENTRY(i) ) }(2)E::=E1+E2 {:=NEWTEMP;GEN(+,, ,}(3)E::= E1*E2 { :=NEWTEMP;GEN(*,, ,}(4)E::=-E1 { :=NEWTEMP;GEN(@,,__,}(5)E::=(E1) {:= }(6)E::=i {:= ENTRY(i) }生成的赋值语句X:=B*(C+D)+A的四元式为:(+,C,D,T1)(*,B,T1,T2)(+,T2,A,T3)(:=,T3,_,X)4.给出将布尔表达式翻译成四元式的语法制导定义。

解答:布尔表达式的语义子程序为:规则语义动作(1) E::=I {:=null;:=NXQ;GEN (Jez , ENTRY(i), __,0) }(2) E::= i1 rop i2 { :=null;:=NXQ;GEN (Jnrop,ENTRY(i1), ENTRY(i2),0)}(3) E::= (E1) {:=, :=; }(4) E::= ¬ E1 { :=NXQ;GEN ( J, __, __, 0); BP , NXQ);}(5) E A::=E1∧ { if =nullthen begin::=NXQ;GEN ( J, __, __, 0)End;BP ( , NXQ );:=null; := }(6) E ::= E A E2 {if ≠nullthen beginBP , NXQ);:=nullEnd:=; }(7) E0::=E1∨ { if :=nullthen begin:=NXQ;GEN ( J, __, __, 0)End;:=;BP ,NXG);}(8) E::=E0E2 { if ≠nullthen:=MERG,Else beginBP ,NXQ);:=End;:=}其中:NXQ指示器指向下一个将要形成但尚未形成的四元式的地址(编号),初值为1,每当执行GEN一次,NXQ自动加1。

GEN是一个语义过程,该过程把四元式加入四元式表区中。

和分别表示E所对应的四元式需回填“真”、“假”出口的四元式地址所构成的链。

MERG(P1,P2)为一函数,把以P1和P2为链首的两个链合二为一作为函数值,回送合并后的链首。

BP(P,t)为一语义过程,BP是BACKPATCH的缩写。

这是一“回填”过程,它把以P为链首所链接的每个四元式的第四区段都填为t。

Jrop是根据关系运算符rop定义的条件转移。

5.试写出PASCAL循环语句for I:=1 to N do S 的语义程序,假定该语句的文法为F1::= for i:= 1 to NS::= F1 do S1解答:根据题设文法,for语句的语义子程序为:F1::= for i:= 1 to N {:=entry (i); GEN(:=, ‘1’ ,__,;Final:=newtemp; GEN( :=,, __,final);:=NXQ; :=NXQ ;GEN( J>, ,final,0)}S::= F1 do S1{BACKPATCH ,NXQ); GEN (+,, ‘1’,;GEN (J, _, _,; BACKPATCH ,NXQ)}6.写出条件赋值语句i :=if B then E1 else E2的语义子程序。

其中B是布尔表达式,E1和E2是算术表达式,i代表与E1、E2类型相同的左部变量。

按写出的语义子程序生成条件赋值语句Z:=if A>C then x+y else x-y+的四元式序列。

解答:按条件赋值语句的语义给出该语句的文法如下:A1::=i:=A2::=A1 if B thenA3::=A2 E1 elseS::=A3 E2相应的语义子程序为:(1) A1::=i:= {:=entry (i) }(2) A2::=A1 if B then {BP , NXQ); :=; :=}(3) A3::=A2 E1 else {GEN (:=,, _,; :=NXQ;GEN ( J, _, _,0 );BP,NXQ);:=} (4) S::=A3E2 {GEN (:=,, _,;BP,NXQ) }按上述语义子程序,条件赋值语句Z:=if A>C then x+y else x-y+的四元式序列为:(1) ( J>,A,C, (3))(2) ( J ,(4) (:=,T1, _,Z)(7) (+,T2,,T3)(8) (:=,T3, _,Z)(9)7.写出编译PASCAL语言repeat语句repeatS1; S2; …; Snuntil E;的语义子程序.其中E是条件表达式.解答:PASCAL的repeat语句的文法为:R1→repeatL→S|L s SL s→L;R2→R1L untilS→R2E于是repeat语句各产生式的语义子程序为: R1→repeat {:=NXQ}L→S {:=}L s→L; {BACKPATCH ,NXQ)}L→L s S1 {:=}R2→R1L until {:=; BACKPATCH ,NXQ) }S→R2E {BACKPATCH , ; :=}8.为便于填写被说明的名字的性质,试修改下面关于变量类型说明的文法,并给出相应的语义动作。

待修改的类型说明文法为:D→namelist integer|namelistnamelist→i,namelist|i解答:(1)为便于填写名字的属性,将上述文法修改为:D→namelist,D1D→i integerD→i realnamelist→namelist1,inamelist→i于是,相应的语义动作为:D→i integer {FILL (ENTRY (i) , int ); :=int }D→i real {FILL (ENTRY (i) ,real ); :=real }D→namelist,D1 {for 队列的每一项 P do FILL (P,;:= }namelist→i {建立一个队列, 它只包含一项ENTRY (i) }namelist→namelist1,i {把ENTRY(i)排在的末端;:= }注意:其中FILL(P,A)是一语义过程,其功能是把属性A添进P 所指向的符号表入口的有关区段。

语义变量用以记录说明语句所规定的属性。

(2)若类型说明的文法为:D→namelist integerD→namelist realnamelist→namelist1,inamelist→i相应的语义动作为:D→namelist integer {for 队列的每一项P do FILL(P,int);}D→namelist real {for 队列的每一项P do FILL(P,real);}namelist→i {建立一个队列它只包含一项ENTRY(i) }namelist→namelist1,i {把ENTRY(i)排在的末端;:= }9.(中国科学院计算所1996年)某些语言允许给出名字表的一个属性表,也允许声明嵌在另一个声明里面,下面文法抽象这个问题:D →attrlist namelist|attrlist(D)Namelist→id,namelist|idAttrlist→A attrlist|AA →decimal|fixed|float|realD → attrlist (D) 的含义是:在括号中的声明提到的所有名字有attrlist中给出的属性,而不管声明嵌套多少层。

写一个翻译方案,它将每个名字的属性添入符号表。

解答:相应的翻译方案为:D’ →{=0; }DD →attrlist{=+; }namelistD →attrlist{=+; }(D1)Namelist →id{addattr ,; }Namelist →id,{=; }namelist1{addattr ,; }attrlist →A attrlist1 {= +1; }attrlist →A {=1; }10.写出翻译过程调用语句的语义子程序。

要求生成的四元式序列在转子指令之前的参数四元式par按反序出现(即和实在参数的顺序相反),在此情况下翻译过程调用语句时是否需要语义变量(队列)QUEUE呢解答:为使过程调用语句的语义子程序产生的参数四元式par按反序出现,过程调用语句的文法为:S →call i (arglist)Arglist →EArglist →arglist1,E按照该文法,语法制导翻译程序将不需要语义变量队列QUEUE,但需要一个语义变量栈STACK,用以实现按反序记录每个实在参数的地址。

翻译过程调用语句的语义子程序为:arglist →E {建立一个栈,它只包含一个项 }arglist →arglist1,E {把压入栈;:= }S →call i (arglist) {WHILE ≠null doBegin把栈顶上托出去,并放入P元中;GEN(par, _, _,P)End;GEN(call, _, _,ENTRY(i)) }11.(中国科学院计算所1994)设有文法G[S]:S::=(L)|aL::=L,S|S给此文法配上语义动作子程序(或者说为此文法写一个语法制导定义),它输出配对括号的个数,如对于句子(a,(a,)),输出是2。

解答:加入新的开始符号’S’和规则S’::=S,得到增广文法。

语法制导定义如下:S’::=S {print ; }S::=(L) {:=+1; }S::=a {:=0; }L::=L1,S {:=+; }L::=S {:=; }12.(中国科学院软件所1999)文法G[S]的产生式如下:S::= (L)|aL::= L,S|S试写出一个语法制导定义,它输出配对括号个数。

相关文档
最新文档