当前位置:首页 » 编程软件 » dag重构编译原理

dag重构编译原理

发布时间: 2023-02-16 14:18:12

编译原理,基本块的DAG中,“在基本块出口不活跃”是什么意思

就是说运行完基本块后,后面就不需要引用该变量了。

㈡ 编译原理——语法制导翻译1.2

语法树是分析树的压缩形式。在语法树中,运算符和关键字不再是叶节点,而是作为内部节点的父节点。

用以下函数建立带有二元运算符的表达式语法树节点,每个函数都返回一个指向新建节点的指针:

1.mknode(op,left,right)。它建立一个标记为op的运算符节点,其两个域left和right是指向其左右运算对象的指针。

2.mkleaf(id,entry)。它建立标记为id的标识符节点,其域entry是指向该标识符在符号表中的相应表项的指针。

3.mkleaf(num,val)。它建立标记为num的数节点,域val保存该数的值。

表达式的无环有向图(directed acyclic graph,简称dag)可以识别表达式中的公共子表达式。代表公共表达式的节点具有多个“父节点”。

㈢ (高分)编译原理的题,求高手,在线等,急急急!!!!!!

太多了,大概看了下考点:

若源程序是用高级语言编写的,目标程序是 机器语言程序或汇编程序 ,则其翻译程序称为编译程序.

何谓优化?按所涉及的程序范围可分为哪几级优化?
答:优化:对程序进行各种等价变换,使得从变换后的程序出发,能产生更有效的目标代码。
三种级别:局部优化、循环优化、全局优化。

简述常用的优化技术有哪些?
答:编译程序中常用的优化技术有:
(1) 删除公共子表示式;
(2) 复写传播;
(3) 删除无用代码;
(4) 代码外提;
(5) 强度削弱;
(6) 删除归纳变量;
(7) 合并常量。

一个句型中的最左 B 称为该句型的句柄。
可选项有:
A. 短语 B. 简单短语 C. 素短语 D. 终结符号

.递归下降法不允许任一非终极符是直接 左 递归的。

简单优先方法每次归约当前句型的 句柄 ,算符优先方法每次归约当前句型的 最左素短语 ,二者都是不断移进输入符号,直到符号栈顶出现 可归约串 的尾,再向前找到 可归约串 的头,然后归约。

算符优先文法——设有一不含ε产生式的算符文法G,如果对任意两个终结符对a,b之间至多只有 、 和 三种关系中的一种成立,则称G是一个算符优先文法。

常用的中间语言种类有哪几种?
答:有逆波兰式、三地址代码、抽象语法树和DAG。

㈣ 《编译原理》考试名词解释:无环路有向图(DAG)

字面意思,学过数据结构没,没学过估计你不知道,就是点到点的结构,叫做图,可以有数个点,点和点之间叫路径(弧),点A到点B和点B到点A事两个方向,从点A出发,又回到点A这叫环路

㈤ 编译原理四——代码优化

1、基本块的划分方法:

3、DAG图实现基本块的优化

1、程序流图与循环
控制流程图就是有唯一首节点的有向图,用三元组G=(N,E,n 0 )表示(节点集,边集,首节点)节点集就是基本块集,有向边表示如下:基本块i出口语句不是转向语句或停语句,i与紧随其后的基本块j有有向边。或者i出口转向j入口语句。
2、循环:程序流图里的一个节点序列强连通,任意两个节点都有至少一条通路,它们中有且只有一个入口节点。(从序列外某节点有一条有向边引导它,或他是程序流图的首节点。
3、找循环:
必经节点集:从流图首节点出发,到n的任意通路都要经过m,m是n的必经节点,记为mDOMn;流图中结点n的所有必经节点的集合称为节点n的必经结点集,极为D(n)。
DOM的性质:自反性:流图中任意节点a,都有aDOMa。传递性:aDOMb,bDOMc则aDOMc。反对称性:aDOMb,bDOMa,a=b。DOM是一个偏序关系,任何节点n的必经节点集是一个有序集。
必经节点的求法:一定包括自己好吧。。。。。。必经节点集就是前驱节点必经节点集的交集加自己没准。
找回边:假设a b是流图中的一条有向边,如果bDOMa,则a b是流图中的一条回边。已知有向边n d是一条回边,则由它组成的循环就是由结点d、结点n以及有通路到达n但该通路不经过d的所有结点组成的。
4、可规约流图:当且仅当一个流图除去回边后,其余边构成一个无环路流图。性质:1. 图中任何直观环路都是循环。2. 找到所有回边可以对应找出所有循环。3. 循环或嵌套或不相交(可能有公共入口节点),goto语句不可跳入循环。

5、循环优化

㈥ 如何将算术表达式转化为逆波兰式并求出其值

一个表达式E的后缀形式的定义:
(1)如果E是一个变量或常量,则E的后缀式是E自身;
(2)如果E是E1 * E2的形式(这里*代表任何二元运算),则E的后缀式是 E'1 E'2 *,E'1和E'2分别是E1和E2的后缀表达式;
(3)如果E是(E1)形式的表达式,则E的后缀式就是E1的后缀式。

所以求逆波兰表达式的时候与运算符的优先级没有关系。

具体算法比较困难,要使用到DAG图或者三元式,这个在编译原理中用的比较多。

对于根据逆波兰表达式求值就比较简单了,用到一个栈,将字符串依次读入栈中,遇到运算符的时候取出栈顶的两个元素进行运算,将运算结果压入栈中,直到将整个字符转读完就求出来结果了。

㈦ 给力!2011年新年散分啦。高分求助编译原理高手帮忙做几道模拟题

三、( 8 分)化简文法 G[S] :
S → ASe | BCaD | aD | AC
A → Cb | DBS
C → bC | d
B → Ac
D → Ad
化简后: S → ASe|AC A → Cb C → bC | d
四、( 12 分) 设 L í {a,b,c}* 是满足下述条件的符号串构成的语言:
(1)若出现 a ,则其后至少紧跟两个 c ;
(2)若出现 b ,其后至少紧跟一个 c 。
试构造识别 L 的最小化的 DFA ,并给出描述 L 的正规表达式。
答:DFA 如图所示。相应的正规式为 (c|acc|bc)* 。

五、( 12 分) 已给文法 G[S] : S → SaP | Sf | P P → qbP | q
将 G[S] 改造成 LL ( 1 )文法,并给出 LL ( 1 )分析表。
答:改造后的文法: S → PS' S' → aPS'| fS' | e P → qP' P' → bP | e
各候选式的 FIRST 集,各非终结符的 FOLLOW 集为
产生式 FIRST 集 FOLLOW 集
S → PS' {q} {#}
S' → aPS'
→ fS'
→ e {a}
{f}
{ e } {#}
P → qP' {q} {a,f,#}
P' → bP
→ e {b}
{ e } {a,f,#}
LL(1) 分析表为

六、( 12 分) 给定文法 G[S] : S → Aa|dAb|Bb|dBa A → c B → c
构造文法 G[S] 的 LR ( 1 )分析表。
分析表如下图所示

七、( 8 分) 将下面的条件语句表示成逆波兰式和四元式序列:
if a>b then x:=a+b*c else x:=b-a;
答:( 1 )逆波兰式:
,其中, BLE 表示汪或等于时的转向指令; [ … ] 表示标号。
( 2 )四元式:
(1) ( j>, a, b, (3))
(2) ( j, , , (7) )
(3) ( *, b, c, T1)
(4) ( +, a, T1, T2)
(5) ( :=, T2, , x)
(6) ( j, , , (9))
(7) ( -, b, a, T3)
(8) ( :=, T3, , x)
(9) ( … … )
八、( 8 分) 给定基本块:
A:=3*5
B:=E+F
C:=A+12
D:=E+F
A:=D+12
C:=C+1
E:=E+F
假定出基本块后,只有 A 、 C 、 E 是活跃的,给出用 DAG 图完成优化后的代码序列。
答:化简后的的四元式序列为
A :=D+12
E :=E+F
C :=28

㈧ 编译原理 题目

. 诺只有G, L, M在基本块后将要被引用,试写出优化后的基本块代码。
B : =3
D : =A+C
E : =A*C
F : =D+E
G : =B*F
H : =A+C
I : =A*C
J : =H+I
K : =B*5
L : =K+J
M : =L
问题补充:设基本块有如下语句构成
1. 试画出基本快DAG图
2. 诺只有G, L, M在基本块后将要被引用

㈨ 编译原理:何谓DAG

就是说运行完基本块后,后面就不需要引用该变量了。

㈩ 编译原理问题,高手进。

回答下列问题:(30分)
(6分)对于下面程序段
program test (input, output)
var i, j: integer;
procere CAL(x, y: integer);
begin
y:=y*y; x:=x-y; y:=y-x
end;
begin
i:=2; j:=3; CAL(i, j)
writeln(j)
end.
若参数传递的方法分别为(1)传值、(2)传地址,(3)传名,请写出程序执行的输出结果。
答: (1) 3 (2) 16 (3) 16 (每个值2分)

(6分)计算文法G(M)的每个非终结符的FIRST和FOLLOW集合,并判断该文法是否是LL(1)的,请说明理由。
G(M):
M → TB
T → Ba |
B → Db | eT |
D → d |

解答:
计算文法的FIRST和FOLLOW集合:(4分)
FIRST(M) = { a,b,e,d, } FIRST(T) = { a,b,e,d, }
FIRST(B) = {b,e,d, } FIRST(D) = {d,}
FOLLOW (M) = {#} FOLLOW (T) = { a,b,e,d,#}
FOLLOW (B) = {a,# } FOLLOW (D) = { b}

检查文法的所有产生式,我们可以得到:
1. 该文法不含左递归,
2. 该文法中每一个非终结符M,T,B,D的各个产生式的候选首符集两两不相交。
3. 该文法的非终结符T、B和D,它们都有候选式,而且
FIRST(T)∩FOLLOW(T)={ a,b,e,d }≠
所以该文法不是LL(1)文法。(2分)

(4分)考虑下面的属性文法
产 生 式 语 义 规 则
S→ABC

A→a
B→b
C→c B.u := S.u
A.u := B.v + C.v
S.v := A.v
A.v :=3*A.u
B.v := B.u
C.v := 1
画出字符串abc的语法树;
对于该语法树,假设S.u的初始值为5,属性计算完成后,S.v的值为多少。
答:(1) (2分)

(2) S.v的值为18 (2分)

(4分)运行时的DISPLAY表的内容是什么?它的作用是什么?
答:DISPLAY表是嵌套层次显示表。每当进入一个过程后,在建立它的活动记录区的同时建立一张嵌套层次显示表diaplay.假定现在进入的过程层次为i,则它的diaplay表含有i+1个单元,自顶向下每个单元依次存放着现行层、直接外层、…、直至最外层(主程序,0层)等每层过程的最新活动记录的起始地址。通过DISPLAY表可以访问其外层过程的变量。

(5分)对下列四元式序列生成目标代码:
A:=B*C
D:=E+A
G:=B+C
H:=G*D
其中,H在基本块出口之后是活跃变量, R0和R1是可用寄存器。
答: 目标代码序列
LD R0 B
MUL R0 C
LD R1 E
ADD R1 R0
LD R0 B
ADD R0 C
MUL R0 R1
ST R0 H

(5分)写出表达式a+b*(c-d)对应的逆波兰式、三元式序列和抽象语法树。
答:
逆波兰式:(abcd-*+) (1分)
三元式序列: (2分)
OP ARG1 ARG2
(1) - c d
(2) * b (1)
(3) + a (2)
抽象语法树:(2分)

(8分)构造一个DFA,它接受={a,b}上所有包含ab的字符串。
答:
(2分)构造相应的正规式:(a|b)*ab(a|b)*

(3分)
a a

a b
b b

(3分)确定化:
I
{0,1,2} {1,2,3} {1,2}
{1,2,3} {1,2,3} {1,2,4,5,6}
{1,2} {1,2,3} {1,2}
{1,2,4,5,6} {1,2,3,5,6} {1,2,5,6}
{1,2,3,5,6} {1,2,3,5,6} {1,2,4,5,6}
{1,2,5,6} {1,2,3,5,6} {1,2,5,6}
b b
b a
a a a a

a b b
b

最小化:
{0,1,2} {3,4,5}
{0, 2},1, {3,4,5}

(6分)写一个文法使其语言为L(G)={anbncm| m,n≥1,n为奇数,m为偶数}。
答:
文法G(S):

(8分)对于文法G(S):

1. 写出句型b(Ma)b的最右推导并画出语法树。
2. 写出上述句型的短语,直接短语和句柄。
答:
1. (4分)

2. (4分)
短语: Ma), (Ma), b(Ma)b
直接短语: Ma)
句柄: Ma)

(12分)对文法G(S):
S → a | ^ | (T)
T → T,S | S
(1) 构造各非终结符的FIRSTVT和LASTVT集合;
(2) 构造算符优先表;
(3) 是算符优先文法吗?
(4) 构造优先函数。
答:
(1) (4分)

(2) (4分)
a ^ ( ) ,
a > >
^ > >
( < < < = <
) > >
, < < < > >

(3) 是算符优先文法,因为任何两个终结符之间至多只有一种优先关系。 (1分)

(4) 优先函数(3分)
a ^ ( ) ,
F 4 4 2 4 4
G 5 5 5 2 3

(8分)设某语言的do-while语句的语法形式为
S do S(1) While E
其语义解释为:

针对自下而上的语法分析器,按如下要求构造该语句的翻译模式,将该语句翻译成四元式:
(1) 写出适合语法制导翻译的产生式;
(2) 写出每个产生式对应的语义动作。
答:(1). 适合语法制导翻译的文法(4分)
G(S):
R do
UR S(1) While
SU E
(2). (4分)
R do
{ R.QUAD:=NXQ }

UR S(1) While
{ U.QUAD:=R.QUAD;
BACKPATCH(S.CHAIN, NXQ) }

SU E
{ BACKPATCH(E.TC, U.QUAD);
S.CHAIN:=E.FC }

答案二:
(1) S do M1 S(1) While M2 E
M ε (4分)
(2) M ε { M.QUAD := NXQ } (4分)
S do M1 S(1) While M2 E
{
BACKPATCH(S(1).CHAIN, M2.QUAD);
BACKPATCH(E.TC, M1.QUAD);
S.CHAIN:=E. FC
}

(10分)将语句
while C>0 do if A B=0 then C:=C+D else C:=C*D
翻译成四元式。
答:
100 (j>, C, 0, 102)
101 (j, -, -, 112)
102 (jnz, A, -, 106)
103 (j, -, -, 104)
104 (j=, B, 0, 106)
105 (j, -, -, 109)
106 (+, C, D, T1)
107 (:=, T1, -, C)
108 (j, -, -, 100)
109 (*, C, D, T2)
110 (:=, T2, -, C)
111 (j, -, -, 100)
112

(10分)设有基本块如下:
T1:=3
T2:=A*B
T3:=9+T1
M:=A*B
T4:=C-D
L:=T3*T4
T2:=C+D
N:=T2
画出DAG图;
设L,M,N 是出基本块后的活跃变量,请给出优化后的四元式序列。
答:

1. (6分)
L

*
T2,M T4 T2,N

* - +

T1 T3
3 A B 12 C D

2. (4分)
M:=A*B
S1:=C-D
L:=12*S1
N:=C+D

(8分)文法G(S)及其LR分析表如下,请给出串baba#的分析过程。
(1) S → DbB (2) D → d (3) D → ε
(4) B → a (5) B → Bba (6) B → ε
LR分析表
ACTION GOTO
b D a # S B D
0 r3 s3 1 2
1 acc
2 s4
3 r2
4 r6 S5 r6 6
5 r4 r4
6 s7 r1
7 S8
8 r5 r5
解答:
步骤 状态 符号 输入串
0 0 # baba#
1 02 #D baba#
2 024 #Db aba#
3 0245 #Dba ba#
4 0246 #DbB ba#
5 02467 #DbBb a#
6 024678 #DbBba #
7 0246 #DbB #
8 01 #S # acc
哈哈,估计认识!!

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:748
制作脚本网站 发布:2025-10-20 08:17:34 浏览:1012
python中的init方法 发布:2025-10-20 08:17:33 浏览:718
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:878
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:774
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1127
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:351
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:229
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:911
python股票数据获取 发布:2025-10-20 07:39:44 浏览:875