dag重構編譯原理
㈠ 編譯原理,基本塊的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
哈哈,估計認識!!
