编译原理分知识点习题-语法制导和翻译
编译原理分知识点习题 语法制导和翻译
规则语义动作
(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章语法制导的翻译
属性和文法符号相关联 规则和产生式相关联
根据需要,将文法符号和某些属性相关联, 并通过语义规则来描述如何计算属性的值
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)
四元式序列: (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 语法制导翻译
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个输入符号就能确定相对于某一产生式左部符号的句柄是否已在分析栈的顶部形成从而也就可以确定当前所应采取的分析动作移进还是按某一产生式进行归约等
编译原理课件语法制导翻译__翻译方案_SDD
描述一棵语法树中结点的属性之间的 相互依赖关系 词法分析 语法分析 依赖图 输入串 语法树 语义规则计算次序 ( 拓扑排序) 树遍历
一遍扫描:在语法分析的同时完成语义规则的 计算, 无需构造实际的语法树
1. 依赖图的拓扑排序
• 依赖图 • 拓扑排序
2. 树遍历的属性计算方法
练习: 以下SDD是L-属性的吗?
产生式 语义规则
ALM
AQR
L.i := l(A.i) M.i := m(L.s) A.s := f(M.s) R.i := r(A.i) Q.i := q(R.s) A.s := f(Q.s)
• 表达式2 ☆
dependencygraph edges can go from left to right
(2) 产生式 Xj 的左边符号 X1,X2,…,Xj-l 的属性
(3) Xj 自己的属性
• S-属性文法一定是L-属性文法 表达式 ☆
Example 非L-属性文法
产生式 A BC 语义规则 A.s = B.b B.i = f ( C.c , A.s )
Fig. Syntax-directed definition of a simple desk calculator
L-属性文法 D TL 和自上而下 T int 语法分析 T real
L L1, id D T .type = real real
综T.type T. type := integer T. type := real L1.in := L.in; addtype (id.entry,L.in ) addtype (id.entry,L.in )
(a)初始状态 (b)VisitNode(S)第一次调用后 (c)VisitNode(S)第二次调用后 (d)VisitNode(S)第三次调用后 的最终状态
程序设计语言_编译原理(第三版-习题库-答案)第五章 语法制导翻译及中间代码生成
第五章语法制导翻译及中间代码生成5.1说明属性文法与属性翻译文法有何异同?5.2考虑下面的属性文法:Z →sXattribution:Z.a=X.c;X.b=X.a;Z.p=X.b;Z →t Xattribution:X.b=X.d;Z.a=X.b;X →uattribution:X.d=1;X.c=X.d;X →Vattribuion:X.c=2;X.d=X.c;(1) 上述文法中的属性哪些是继承的?哪些是综合的?(2) 上述文法中的属性依赖是否出现了循环?5.3为什么说S属性文法一定是L属性文法?反之结论亦正确吗?5.4将下列中缀式改写为逆波兰式。
(1) -A*(B+C)↑(D-E)(2) ((a*d+c)/d+e)*f+g(3) a+x≤4∨(C∧d*3)(4) a∨b∧c+d*e↑f(5) s=0; i=1;while (i<=100) {s+=i*i; i++;}5.5将下列后缀式改写为中缀式。
(1) abc*+(2) abc-*cd+e/-(3) abc+≤a0>∧ab+0≠a0∧∨(4) ab<p1 BZ xab-c↑= p2 BR gh=↑↑p1p25.6设已给文法G[E]:E →E+T | -T | TT →T*F | FF →P ↑F | PP →(E) | i试设计一个递归下降分析器,要求此分析器在语法分析过程中,将所分析的符号串翻译成后缀式。
5.7设已给布尔表达式文法G[Z]:Z →EE →T{∨T}T →F{∧F}F → F | (E) | b试设计一个递归下降分析器,它把由G[Z]所描述的布尔表达式翻译为四元式序列。
5.8(1) 利用54节所给的属性翻译文法将赋值语句:X=A*(B+C)+D翻译成四元式序列,给出语法制导的翻译过程。
(2) 利用55节所给的属性翻译文法将布尔表达式:A∧(B∨(C∨D F))翻译成四元式序列,给出语法制导的翻译过程。
(3) 利用56节所给的属性翻译文法将语句:while A<C∧B>0 doif A=1 then C∶=C+1else while A<=D do A∶=A+2翻译成四元式序列,给出语法制导的翻译过程。
《编译原理》复习题及答案
《编译原理》课程复习资料一、判断题:1.一个上下文无关文法的开始符,可以是终结符或非终结符。
[ ]2.一个句型的直接短语是唯一的。
[ ]3.已经证明文法的二义性是可判定的。
[ ]4.每个基本块可用一个DAG表示。
[ ]5.每个过程的活动记录的体积在编译时可静态确定。
[ ]6.2型文法一定是3 型文法。
[ ]7.一个句型一定句子。
[ ]8.算符优先分析法每次都是对句柄进行归约。
[ ]9.采用三元式实现三地址代码时,不利于对中间代码进行优化。
[ ]10.编译过程中,语法分析器的任务是分析单词是怎样构成的。
[ ]11.一个优先表一定存在相应的优先函数。
[ ]12.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。
[ ]13.递归下降分析法是一种自下而上分析法。
[ ]14.并不是每个文法都能改写成 LL(1)文法。
[ ]15.每个基本块只有一个入口和一个出口。
[ ]16.一个 LL(1)文法一定是无二义的。
[ ]17.逆波兰法表示的表达试亦称前缀式。
[ ]18.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。
[ ]19.正规文法产生的语言都可以用上下文无关文法来描述。
[ ]20.一个优先表一定存在相应的优先函数。
[ ]21.3型文法一定是2 型文法。
[ ]22.如果一个文法存在某个句子对应两棵不同的语法树,则文法是二义性的。
[ ]二、填空题:1. 称为规范推导。
2.编译过程可分为,,,和五个阶段。
3.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是。
4.从功能上说,程序语言的语句大体可分为语句和语句两大类。
5.语法分析器的输入是,其输出是。
6.扫描器的任务是从中识别出一个个。
7.符号表中的信息栏中登记了每个名字的有关的性质,如等等。
8.一个过程相应的DISPLAY表的内容为。
9.一个句型的最左直接短语称为句型的。
10.常用的两种动态存贮分配办法是动态分配和动态分配。
编译原理(龙书)习题(5,6,7,8)章
6.2.1 将算术表达式 a+-(b+c) 翻译成
1)抽象语法树 2)四元式序列 3)三元式序列 4)间接三元式序列
PPT课件整理
15
1)抽象语法树:
PPT课件整理
16
2)四元式序列:
3)三元式序列:
4)间接三元式序列:
PPT课件整理
17
6.4.1 向图6-19的翻译方案中加入对应于下列产生式的规则: 1) EE1*E2 2) EE1(单目加 )
第5章 语法制导的翻译
5.2.3 假设我们有一个产生式 A。BAC,D B,C,D这四个非终 结符号都有两个属性:s是一个综合属性,而i是一个继承属 性。对于下面的每组规则,指出(i)这些规则是否满足S属性 定义的要求。(ii)这些规则是否满足L属性定义的要求。(iii) 是否存在和这些规则一致的求值过程?
1)一个repeat语句,repeat S while B 2)一个for循环语句,for (S1 ; B ; S2) S3
S-->repeat S1 while B
begin=newlabel() S1.next=newlabel() B.true=begin B.false = S.next S.code=label(begin)||
第四章-语法制导的翻译-复习+习题
9
例
题
1
为文法 S→(L)|a L→L,S|S 写一个语法制导定义,它输出括号的对数。 写一个语法制导定义,它输出括号的对数。
首先, 首先,分析问题 (1)需要定义哪些属性值 属性num, 属性num,表示相应符号中括号的对数 属性值为哪些符号定义? (2)属性值为哪些符号定义? L, S num属性属于综合属性还是继承属性 属性属于综合属性还是继承属性? (3)num属性属于综合属性还是继承属性?
3
计算表达式9- + 计算表达式 -5+2
E.val=6 E R.i=9 R.s=6 R
T.val=9 T
E → T { R.i:=T.val } R { E.val:=R.s } R→+ T { R1.i:=R.i+T.val } R1 { R.s:= R1.s } R→T { R1.i:=R.i-T.val } R1 { R.s:= R1.s } R → ε { R.s:=R.i } T → ( E ) { T.val:=E.val } T → num { T.val:=num.val }
12
例
题
1
top
) L ( ... ... state val L.num
为文法 S→(L)|a 栈 L→L,S|S 写一个语法制导定义,它输出括号的对数。 写一个语法制导定义,它输出括号的对数。 S′ → S S→(L) S→a L → L1 , S L→S
print (val[top]) val[top]) val[topval[top-2] := val[top-1] val[topS. num := 0 L. num := L1. num + S. num L. num := S.num
编译原理与技术 语法制导翻译(1)
Eid
E.nptr := mkleaf(‘ID’,id.entry)
2024/8/7
《编译原理与技术》讲义
15
e.g.4 构造表达式的语法树(DAG)
E.nptr - E的语法树(根结点指针)
mknode(op, left, right)-建立一个表达式语法 树结点,它的运算符为op,左、右运算对象 是left和right所指的语法树。如果建成DAG, 则需要检查是否已存在相应内部结点op,其 左右运算对象分别是left和right。若没有则新 建一个。
2024/8/7
《编译原理与技术》讲义
12
语法树 vs. 分析树
a := b* -c + b * -c
语法树
分析树
assign
算符 E
a
+
a
*
*
b@
b@
c
c
赋值语句
assign E
E+
E
E*E E*E
b @E b @E
c
c
2024/8/7
《编译原理与技术》讲义
13
语法树 vs. DAG
DAG(去除了公共子表达式的无环有向图)
2024/8/7
《编译原理与技术》讲义
21
翻译方案中的动作
-语义动作可放在产生式右端任何位置;这也就显式 地给出了动作的执行时刻。(可认为是在深度优先 遍历中的执行时刻)
e.g. 6将含有+和-运算的中缀表达式翻译为后缀形式: ET R R addop T { print( addop.lex_val) } R | T number { print( number.lex_val) }
编译原理 语法制导翻译
TinyC中的语法树
typedef enum {StmtK,ExpK} NodeKind; typedef enum {IfK,RepeatK,AssignK,ReadK,WriteK} StmtKind; typedef enum {OpK,ConstK,IdK} ExpKind; typedef enum {Void,Integer,Boolean} ExpType; #define MAXCHILDREN 3 typedef struct treeNode { struct treeNode * child[MAXCHILDREN]; struct treeNode * sibling; int lineno; NodeKind nodekind; union { StmtKind stmt; ExpKind exp;} kind; union { TokenType op; int val; char * name; } attr; ExpType type; /* for type checking of exps */ } TreeNode;
作为中间表示形式——分离分析与翻译
在进行语法分析的同时进行翻译存在缺
陷:
适合分析的文法可能未反映自然的语言结构 分析顺序可能与翻译顺序不一致
利用语法制导翻译方法来构造语法树
5.2.1 语法树
(抽象)语法树,压缩形式
关键字和运算符均在内部节点
链式结构会被压缩
语法树压缩例
digit.lexval:终结符只有综合属性,由词法分 析器提供 开始符号通常没有继承属性
5.1.2 综合属性
只有综合属性:S-属性定义
语法树自底向上计算属性
编译原理试题库
编译原理试题库* ? 一.名词解释: 1)前缀答:前缀——是指符号串任意首部。
2)可归前缀答:可归前缀——是指规范句型的一个前缀,这种前缀包含句柄且不含句柄之后的任何符号。
3)活前缀答:活前缀——规范句型的一个前缀,这种前缀不含句柄之后的任何符号。
或给定文法规范句型的可归前缀的任意首部。
4)简单短语答:简单短语——设G[Z]是给定文法,w=xuy ∈V +,为该文法的句型,如果满足下面两个条件:① Z xUy ;② U ?u ;则称句型xuy 中的子串u 是句型xuy 的简单短语。
5)扫描遍答:扫描遍——指编译程序对源程序或中间代码程序从头到尾扫描一次。
6)句柄答:句柄——给定句型中的最左简单短语就是句柄。
7)句型答:句型——设G 是一个给定的文法,S 是文法的开始符号,如果S x(其中x ∈V *),则称x 是文法的一个句型。
8)句子答:句子——设G 是一个给定的文法,S 是文法的开始符号,如果S x (其中x ∈V T *),则称x 是文法的一个句子。
9)非终结符答:非终结符—出现在文法产生式的左部且能派生出符号或符号串的那些符号称为非终结符号。
10)终结符答:终结符——出现在文法产生式的右部且不能派生出符号或符号串的那些符号称为终结符号。
11)属性文法答:一个属性文法形式的定义为一个三元组AG ,AG=(G ,V ,E )。
其中G 为一个上下文无关文法;V 为属性的有穷集;E 为一组语义规则。
12)语法制导翻译答:语法制导翻译——语法制导翻译就是在语法分析的过程中,当进行推导或归约时同步完成附加在所使用的产生式上的语义规则描述的动作,从而实现语义处理。
13)后缀式答:后缀式——一种把运算量(操作数)写在前面,把算符写在后面(后缀)的表示法。
14)短语答:短语——设G[Z]是给定文法,w=xuy ∈V +,为该文法的句型,如果满足下面两个条件:① Z xUy ;② U u ;则称句型xuy 中的子串u 是句型xuy 的短语。
编译原理试题
中间语言与语法制导翻译重点与难点重点:语法制导翻译的基本思想,属性文法,翻译模式,说明语句的翻译方案。
三地址码,各种语句的目标代码结构、属性文法与翻译模式。
难点:属性的意义,对综合属性,继承属性,固有属性的理解,属性计算,怎么通过属性来表达翻译。
布尔表达式的翻译,对各种语句的目标代码结构、属性文法与翻译模式的理解。
基本要求掌握语法制导翻译的基本思想,属性文法,综合属性,继承属性,固有属性,属性计算,S_属性文法,L_属性文法,说明语句的翻译方案,翻译模式、属性文法的实现掌握中间语言与语义分析的基本概念;熟练掌握语法(结构)树、三地址代码、赋值与控制语句的翻译、说明语句的翻译;掌握组合数据说明的翻译、过程调用翻译。
例题解析例1 给定文法 E --> T { R.i := T.p }R { E.p := R.s }R --> addopT { R1.i := mknode( addop.val, R.i, T.p ) }R { R.s := R1.s }R --> { R.s := R1.s }T --> ( E ) { T.p := E.p }T --> id { T.p := mkleaf( id, id.entry ) }T --> num { T.p := mkleaf( num, num.val ) }(1) 指出文法中的各非终结符具有哪些综合属性和哪些继承属性⑵画出按本翻译模式处理表达式 a + 20 + ( b - 10 ) 时所生成的语法树【解】(1)E的综合属性 p,R的继承属性i,综合属性s;T的综合属性p(2) 处理表达式 a + 20 + ( b - 10 ) 时所生成的语法树如下+(ID, a) +(NUM, 20) -( ID, b) (NUM, 10)例2 定义一个计算器的属性文法,完成一个输入表达式值的计算和显示,【解】计算器的文法L → EE → E1 + T | TT → T1 * F | FF → ( E ) | digit引进属性val,计算器的属性文法:L → E print( E.val )(L的虚属性)E → E1 + T E.val := E1.val + T.valE → T E.val := T.valT → T1 * F T.val := T1.val * F.valT → F T.val := F.valF → ( E ) F.val := E.valF → digit F.val := digit.lexvallexval 是单词 digit 的属性例3给出对输入串6-3 3*5+4 的分析树与属性计算【解】3*5+4 的分析树与属性计算例4定义一个说明语句的属性文法【解】说明语句的文法D → T LT → intT → realL → L1,idL → id要解决的问题:记录标识符的类型和类型信息传递方法:引进属性type,和in,用T.type记录类型信息,并传给L.in, 说明语句的属性文法如下:D → T L L.in := T.typeT → int T.type := ‘integer’T → real T.type := ‘real’L → L1,id L1.in := L.inaddtype( id.entry, L.in ) L → id addtype( id.entry, L.in )entry 单词 id 的属性addtype 在符号表中为变量填加类型信息例5 给出输入串real id1,id2,id3 的分析树和属性计算例6 设下列文法生成变量的类型说明D → id LL → , id L | : TT → integer | real试构造一个翻译模式,把每个标识符的类型存入符号表。
编译原理分知识点习题-语法制导和翻译
1.一般情况下,为什么语义分析部分仅产生中间代码解答:一般情况下,语义分析部分仅产生中间代码,其原因是:可使难点分解,分别解决。
可对语义分析产生的中间代码进行优化,以产生高效率的目标代码。
语义分析通常与机器无关,目标代码往往与机器有关。
把语义分析与目标代码生成分开,可让一个语义分析程序适用于多个目标代码生成程序。
2.(湖北省高等教育自学考试)什么是语法制导翻译为什么把这种方法叫语法制导翻译解答:所谓语法制导翻译,是指在语法规则的制导下,通过计算语义规则,完成对输入符号串的翻译。
由于使用属性文法时把语法规则和语义规则分开,但在使用语法规则进行推导或规约的同时又使用这些语义规则来知道翻译与最终产生目标代码,所以称为语法制导翻译。
3.'4.5.给出将附值语句翻译成四元式的语法制导定义,允许右部表达式含有加法、乘法、取负、括号运算。
生成赋值语句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)6.给出将布尔表达式翻译成四元式的语法制导定义。
解答:布尔表达式的语义子程序为:规则语义动作(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 =null】then begin::=NXQ;GEN ( J, __, __, 0)End;BP ( , NXQ );:=null; := }(6) E ::= E A E2 {if ≠null,then 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。
编译原理复习题(含考试)
编译原理复习题(含考试)————————————————————————————————作者:————————————————————————————————日期:*编译原理复习题一.简答题:1) 什么是句子? 什么是语言?解答:句子——设G 是一个给定的文法,S 是文法的开始符号,如果S x (其中x ∈V T *),则称x 是文法的一个句子。
语言——语言是句子的集合。
或——设G[S]是给定文法,则由文法G 所定义的语言L(G)可描述为:L(G)={x │Sx,x ∈V T *} 。
2) DFA 与NFA 有何区别 ?解答:DFA 与NFA 的区别表现为两个方面:一是NFA 可以有若干个开始状态,而DFA 仅只有一个开始状态。
另一方面,DFA 的映象M 是从K ×∑到K ,而NFA 的映象M 是从K ×∑到K 的子集,即映象M 将产生一个状态集合(可能为空集),而不是单个状态。
3) 自顶向下的语法分析方法的基本思想是什么?解答:从文法的开始符号开始,根据给定的输入串并按照文法的产生式一步一步的向下进行直接推导,试图推导出文法的句子,使之与给定的输入串匹配。
4) 自底向上的语法分析方法的基本思想是什么?解答:从给定的输入串(终结符串)开始,根据文法的规则一步一步的向上进行直接归约,试图归约到文法的开始符号。
5) 一个上下文无关文法G 包括哪四个组成部分?解答:一组非终结符号,一组终结符号,一个开始符号,以及一组产生式。
6) 在自底向上的语法分析方法中,分析的关键是什么?解答:关键是寻找句柄。
7) 在自顶向下的语法分析方法中,分析的关键是什么? 解答:关键是选择候选式。
8)什么是属性文法?答:是在上下文无关文法的基础上,为每个文法符号(含终结符和非终结符)配备若干个属性值,对文法的每个产生式都配备了一组属性计算规则(称为语义规则)。
在语法分析过程中,完成语义规则所描述的动作,从而实现语义处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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试写出一个语法制导定义,它输出配对括号个数。