版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第八章語法制導(dǎo)翻譯和中間代碼生成源程序的結(jié)構(gòu)分析詞法分析ch4語法分析ch5、ch6、ch7語義分析由語法分析程序直接調(diào)用相應(yīng)的語義子程序首先生成語法樹(或該結(jié)構(gòu)的某種表示),再進(jìn)行語義處理生成中間代碼編譯中的邏輯階段源語言程序代碼優(yōu)化目標(biāo)代碼(匯編或機(jī)器碼)詞法分析語義分析語法分析中間代碼生成目標(biāo)代碼生成前端處理后端處理語義處理語義處理的任務(wù):靜態(tài)語義檢查靜態(tài)語義:語法結(jié)構(gòu)
靜態(tài)語義檢查:審查靜態(tài)語義動(dòng)態(tài)語義處理動(dòng)態(tài)語義:程序單元執(zhí)行的操作
動(dòng)態(tài)語義處理:生成(中間/目標(biāo))代碼語義處理的實(shí)現(xiàn):屬性文法:描述語義規(guī)則。--工具語法制導(dǎo)翻譯:在語法分析的同時(shí),執(zhí)行語義規(guī)則描述的動(dòng)作:檢查靜態(tài)語義生成中間代碼/目標(biāo)代碼語義處理的環(huán)境:符號(hào)表為語義分析提供類型、作用域等信息。為代碼生成提供類型、作用域、存儲(chǔ)類別、存儲(chǔ)(相對(duì))位置等信息。
本章引入屬性文法和語法制導(dǎo)翻譯方法的基本思想,介紹幾種典型的中間代碼形式,最后討論一些語法成分的翻譯工作。
第8章語法制導(dǎo)翻譯和中間代碼生成
8.1屬性文法8.2語法制導(dǎo)翻譯概論
8.3中間代碼的形式
8.4簡單賦值語句的翻譯
8.5布爾表達(dá)式的翻譯
8.6控制結(jié)構(gòu)的翻譯8.7說明語句的翻譯
8.8數(shù)組和結(jié)構(gòu)的翻譯
8.1屬性文法
屬性文法:語法制導(dǎo)翻譯工具,說明程序設(shè)計(jì)語言的意義。屬性文法構(gòu)成:上下文無關(guān)文法+語義規(guī)則語義規(guī)則附在文法的產(chǎn)生式上,在語法分析過程中,完成附加在所使用產(chǎn)生式上的語義規(guī)則描述的動(dòng)作,從而實(shí)現(xiàn)語義處理。
定義:
一個(gè)屬性文法是一個(gè)三元組:
A=(G,V,F(xiàn))其中:G:上下文無關(guān)文法V:屬性的有窮集。每個(gè)屬性與文法的某個(gè)非終結(jié)符或終結(jié)符相聯(lián)F:關(guān)于屬性的斷言或謂詞的有窮集。
--屬性的計(jì)算規(guī)則每個(gè)斷言與文法的某產(chǎn)生式相聯(lián)。
例如G:E→T1+T2|T1orT2
T→num|true|false
屬性文法記號(hào)中常使用N.t的形式表示與非終結(jié)符N相聯(lián)的屬性。E→T1+T2{T1.t=intANDT2.t=int}E→T1orT2{T1.t=boolANDT2.t=bool}T→num{T.t=int}T→true{T.t=bool}T→false{T.t=bool}可進(jìn)行類型檢查的屬性文法(表達(dá)式)
對(duì)輸入串3+4的語法樹:
E{T1.t=T2.t}
{T1.=int}TT{T2.=int}3
4+
如果對(duì)G中的某一輸入串而言,A中的所有斷言對(duì)該輸入串的語法樹的結(jié)點(diǎn)的屬性全為真,則該串也是A語言中的句子。編譯程序的靜態(tài)語義審查工作就是驗(yàn)證關(guān)于所編譯的程序的斷言是否全部為真。
A為屬性文法例8.2
描述說明語句中各種變量的類型信息的語義規(guī)則產(chǎn)生式語義規(guī)則(1)DTLL.in:=T.type(2)TintT.type:=integer(3)TrealT.type:=real(4)LL1,idL1.in:=L.in;addtype(id.entry,L.in)(5)Lidaddtype(id.entry,L.in)要解決的問題:紀(jì)錄標(biāo)識(shí)符的類型類型信息傳遞方法:用T.type記錄類型信息,并傳給L.inentryid的屬性:可以是它在符號(hào)表中的地址addtype在符號(hào)表中為變量填加類型信息8.2語法制導(dǎo)翻譯概論
語法制導(dǎo)翻譯:首先,使用屬性文法為工具,描述程序設(shè)計(jì)語言的語義規(guī)則。在語法分析時(shí),每應(yīng)用一個(gè)產(chǎn)生式(推導(dǎo)或歸約),同時(shí)完成該產(chǎn)生式上所附的語義規(guī)則描述的動(dòng)作,從而完成語義處理。在進(jìn)行語法分析的同時(shí),完成相應(yīng)的語義處理
語法制導(dǎo)翻譯的具體實(shí)現(xiàn)途徑不難。如有一個(gè)LR分析器,擴(kuò)充它的分析棧,使得每個(gè)文法符號(hào)都跟有語義值。同時(shí)擴(kuò)充LR分析器功能,使它不僅執(zhí)行語法分析任務(wù),且能在用某個(gè)產(chǎn)生式進(jìn)行歸約的同時(shí)調(diào)用相應(yīng)語義子程序。
例算術(shù)表達(dá)式求值的語義描述
(0)L→Eprint(E.val)(1)E→E1+T
E.val:=E1.val+T.val(2)E→TE.val:=T.val(3)T→T1*FT.val:=T1.val*F.val(4)T→FT.val:=F.val(5)F→(E)F.val:=E.val(6)F→digitF.val:=digit.lexval
輸入串2+3*5,語義處理是計(jì)算表達(dá)式的值,采用LR分析法,LR分析表如下:
LR分析表如下狀態(tài)ACITON(動(dòng)作)GOTO(轉(zhuǎn)換)d+*()#ETF0S5
S4
1231
S6
acc
2
r2S7
r2r2
3
r4r4
r4r4
4S5
S4
8235
r6r6
r6r6
6S5
S4
937S5
S4
108
S6
S11
9
r1S7
r1r1
10
r3r3
r3r3
11
r5r5
r5r5
LR分析輸入串2+3*5步驟狀態(tài)棧語義棧(值棧)符號(hào)棧剩余輸入串歸約動(dòng)作10-#2+3*5#205--#2+3*5#303-2#F+3*5#
r6402-2#T+3*5#r4501-2#E+3*5#r26016-2-#E+3*5#70165-2--#E+3*5#
步驟狀態(tài)棧語義棧(值棧)符號(hào)棧剩余輸入串歸約動(dòng)作80163-2-3#E+F*5#r690169-2-3#E+T*5#r41001697-2-3-#E+T*5#11016975-2-3--#E+T*5#1201697(10)-2-3-5#E+T*F#r6130169-2-(15)#E+T#r31401-(17)
#E#
r115接受
按照上述實(shí)現(xiàn)辦法,若把語義子程序改為產(chǎn)生中間代碼的動(dòng)作,則可在語法制導(dǎo)下生成中間代碼。(選作實(shí)驗(yàn))
8.3中間代碼的形式
中間代碼有多種形式,常見的有逆波蘭式三元式四元式
樹形表示
一、逆波蘭記號(hào)
最簡單的一種中間代碼形式。將運(yùn)算對(duì)象寫在前面,運(yùn)算符號(hào)寫在后面如a+b寫成ab+,也稱后綴式。后綴表示法表示表達(dá)式的最大優(yōu)點(diǎn)是計(jì)算機(jī)處理表達(dá)式方便。如B@CD*+(@表示一元減,中綴表示為-B+C*D)
逆波蘭表示很容易擴(kuò)充到表達(dá)式以外的范圍,只要遵守運(yùn)算對(duì)象后直接跟它們的運(yùn)算符這條規(guī)則即可。
如GOTOL寫為LjumpifEthenS1else
S2
表示為ES1S2¥,把if-then-else看成三目運(yùn)算符,用¥表示。但要注意,要對(duì)新添加的運(yùn)算符的含義正確處理。
二、三元式和樹形表示
組成:(OP,ARG1,ARG2)OP為算符,ARG1和ARG2分別為第一、第二運(yùn)算對(duì)象。
如:a:=b*c+c/d表示為:
(1)
(*,b,c)(2)
(/,c,d)(3)
(+,(1),(2))(4)(:=,(3),a)
三元式中的(1)、(2)表示第一和第二個(gè)三元式的結(jié)果。
對(duì)一元運(yùn)算符,規(guī)定只用ARG1。
樹形表示是三元式的翻版。表達(dá)式的樹形表示很容易實(shí)現(xiàn):簡單變量或常數(shù)的樹是自身,如果表達(dá)式e1和e2的樹分別為T1和T2,那么e1+e2、e1*e2,-e1的樹為:
e1+e2+T1T2*T1T2-T1e1*e2
-e1二目運(yùn)算對(duì)應(yīng)二叉子樹,多目運(yùn)算對(duì)應(yīng)多叉子樹。
三、四元式
普遍采用的一種中間代碼形式。組成:(OP,ARG1,ARG2,RESULT)其中:OP,ARG1,ARG2的含義同三元式
RESULT是運(yùn)算結(jié)果。
有時(shí)為了直觀,也把四元式的形式寫成簡單賦值形式,例如把上述四元式寫成:
(1)t1:=b*c(2)t2:=c/d(3)t3:=t1+t2(4)a:=t3
如,a:=b*c+c/d的四元式表示如下:
(1)(*,b,c,t1)(2)(/,c,d,t2)(3)(+,t1,t2,t3)(4)(:=,t3,-,a)
四元式和三元式的主要不同在于:四元式對(duì)中間結(jié)果的引用必須通過給定的名字,三元式是通過產(chǎn)生中間結(jié)果的三元式編號(hào)。
四元式表示類似于三地址指令,有時(shí)也把這種表示稱為三地址代碼,它對(duì)代碼優(yōu)化和目標(biāo)代碼生成都較有利。
8.4簡單賦值語句的翻譯
說明:
在實(shí)際實(shí)現(xiàn)中,四元式的ARG1和ARG2、RESULT,或者是一個(gè)指針,指向符號(hào)表的某一登錄項(xiàng);或者是一個(gè)臨時(shí)變量的整數(shù)碼。
語義變量id.name:id表示的單詞的一屬性語義變量E.place:表示存放E值的變量名在符號(hào)表的登錄項(xiàng)或一整數(shù)碼語義過程emit:表示輸出四元式到輸出文件上語義過程newtemp:表示生成一臨時(shí)變量。函數(shù)Lookup(id.name):查id.name是否在符號(hào)表中,如在,則返回指向該登錄項(xiàng)指針,否則返回nil。
下面列出了翻譯賦值語句到四元式的語義描述,這里的語義工作包括對(duì)變量進(jìn)行“先定義后使用”的檢查。
(1)S→id:=E{p:=Lookup(id.name);
ifp≠nil
then
emit(p‘:=’E.place)
elseerror}四元式采用賦值形式,即result:=arg1oparg2(2)E→E1+E2
{E.place:=newtemp;
emit(E.place‘:=’E1.place‘+’E2.place)
}(3)E→E1*E2
{E.place:=newtemp;
emit(E.place‘:=’E1.place‘*’E2.place)
}(4)E→-E1{E.place:=newtemp;
emit(E.place‘:=’‘uminus’E1.place)
}(5)E→(E1)
{E.place:=E1.place}(6)E→id{p:=Lookup();
ifp≠nil
then
E.place:=pelseerror}
編譯程序還可對(duì)表達(dá)式中的運(yùn)算對(duì)象進(jìn)行類型檢查、類型轉(zhuǎn)換。約定:當(dāng)兩個(gè)不同類型的量進(jìn)行運(yùn)算時(shí),先將整型量轉(zhuǎn)換為實(shí)型量,并增加E.type表示E的類型信息,值為int或real,用+i(*i)、+r(*r)區(qū)別整型加和實(shí)型加。
帶類型轉(zhuǎn)換的語義處理如下:(E→E1*E2)
E→E1*E2
{E.place:=newtemp;
ifE1.type=intANDE2.type=intthenbeginemit(E.place,‘:=’,E1.place,‘*i’,E2.place);
E.type:=intendelseifE1.type=realANDE2.type=realthen
beginemit(E.place,‘:=’,E1.place,‘*r’,E2.place);E.type:=realend
elseifE1.type=int/*E2.type=real*/thenbegint:=newtemp;
emit(t,‘:=’,itr,E1.place);
emit(E.place,‘:=’,t,‘*r’,E2.place);
E.type:=realendelse/*E1.type=realANDE2.type=int*/begint:=newtemp;
emit(t,‘:=’,itr,E2.place)
emit(E.place,‘:=’,E1.place,‘*r’,t);
E.type:=realend;}
語義值的設(shè)計(jì)是與語義處理的描述相關(guān)的,如非終結(jié)符E,有語義值E.place、E.type或E.kind(見PL/0編譯程序)
8.5布爾表達(dá)式的翻譯
在程序設(shè)計(jì)語言中,布爾表達(dá)式的作用有兩個(gè):一是用作邏輯賦值語句的邏輯運(yùn)算,二是用作控制語句中的條件表達(dá)式。
布爾表達(dá)式的形式為:E1ropE2,E1和E2是算術(shù)表達(dá)式,rop是關(guān)系符=、〈=、>=、〈、〉、≠。為簡單起見,只考慮如下文法生成的布爾表達(dá)式:
E→EandE|EorE|notE|idropid|true|false布爾運(yùn)算符的優(yōu)先順序?yàn)椋簄ot、and、or,并且and和or服從左結(jié)合。一、布爾表達(dá)式的翻譯方法
計(jì)算布爾表達(dá)式的值有兩種辦法:
第一種:同算術(shù)表達(dá)式的計(jì)算一樣,按步計(jì)算各部分的真假值,最后計(jì)算整個(gè)表達(dá)式的值。例如:1or(not0and0)or0=1or(1and0)or0=1or0or0=1or0=1采取哪種方法取決于程序設(shè)計(jì)語言的語義。
第二種:采取某種優(yōu)化措施,只計(jì)算部分表達(dá)式,如AorB,若A的值為1,則無需計(jì)算B,整個(gè)布爾表達(dá)式的值為1。同理,對(duì)于AandB,若A為0,則整個(gè)布爾表達(dá)式值為0,無需計(jì)算B。
若按第一種方法計(jì)算布爾表達(dá)式,
aorbandnotc翻譯成四元式為:
(1)
t1:=notc(2)
t2:=bandt1(3)t3:=aort2
對(duì)于a〈b這樣的關(guān)系表達(dá)式,可看成等價(jià)的條件語句:ifa〈bthen1else0,翻譯成的四元式序列為:
(1)
ifa〈bgoto(4)(2)
t:=0(3)
goto(5)(4)
t:=1(5)…
用t存放a〈b的值,(5)為后繼的四元式序號(hào)。
p182圖8.14給出了按第一種辦法計(jì)算布爾表達(dá)式的值。其中:
nextstat:給出輸出序列中下一四元式序號(hào);
emit:輸出四元式,每調(diào)用一次,nextstat
增加1。
E→E1orE2
{E.place:=newtemp;
emit(E.place‘:=’E1.place‘or’E2.place)}E→E1andE2
{E.place:=newtemp;
emit(E.place‘:=’E1.place‘a(chǎn)nd’E2.place)}E→notE1
{E.place:=newtemp;
emit(E.place‘:=’‘not’E1.place)}E→(E1
)
{E.place:=E1.place}
E→id1relopid2
{E.place:=newtemp;
emit(‘if’id1.placerelopid2.place‘goto’nextstat+3);
emit(E.place‘:=’‘0’);
emit(‘goto’nextstat+2);
emit(E.place‘:=’‘1’);}E→true{E.place:=newtemp;
emit(E.place‘:=’‘1’)}E→false{E.place:=newtemp;
emit(E.place‘:=’‘0’)}二、控制語句中布爾表達(dá)式的翻譯討論出現(xiàn)在if-then;if–then-else和while-do等語句中的布爾表達(dá)式E的翻譯語法:
S→ifEthenS1|ifEthenS1elseS2
|whileEdoS1
begin:out:假假假真真真E的代碼E的代碼E的代碼S1的代碼S1的代碼S1的代碼S2的代碼jumpoutjumpbeginifEthenS1ifEthenS1elseS2whileEdoS1控制語句的代碼結(jié)構(gòu)
作為條件轉(zhuǎn)移的E,僅把E翻譯成條件轉(zhuǎn)移和無條件轉(zhuǎn)移的四元式。翻譯的基本思路是:
對(duì)于E為aropb的形式,生成代碼為:
ifaropbgotoE.true和
gotoE.false對(duì)于E為E1orE2
的形式,若E1為真,則E為真,即E1的真出口和E的真出口一樣。若E1為假則需計(jì)算E2,E1的假出口應(yīng)是E2代碼的第一個(gè)四元式標(biāo)號(hào),E2的真出口和假出口分別與E的真出口和假出口一樣。
E為E1andE2
的形式,與2)類似,只需調(diào)換E1的真假出口即可
對(duì)于notE1的翻譯,E的真假出口是E1的假真出口。
例8.3
布爾表達(dá)式a〈b
or
c〈dande〉f
翻譯成如下四元式序列:
(1)
ifa〈bgotoE.ture(2)
goto3(3)
ifc〈dgoto5(4)
gotoE.false(5)
ife〉fgotoE.true(6)gotoE.false
上述四元式(2)是不需要的,這種問題可在代碼優(yōu)化階段解決。
不是最優(yōu)語句ifa<borc<dande<fthenS1elseS2的四元式(1)ifa<bgoto(7)
//轉(zhuǎn)移至(E.true)(2)goto(3)
(3)ifc<dgoto(5)(4)goto(p+1)//轉(zhuǎn)移至(E.false)(5)ife<fgoto(7)(6)goto(p+1)(7)(S1的四元式
……(p-1)……)(p)goto
(q)(p+1)(S2的四元式……(q-1)……)(q)//轉(zhuǎn)移至(E.true)//轉(zhuǎn)移至(E.false)//(E.false)入口//(E.true)入口E.true和E.false的值不能在產(chǎn)生四元式的同時(shí)就知道,要在整個(gè)布爾表達(dá)式(或語句)的四元式產(chǎn)生完畢之后才得知,因此要回填這個(gè)地址。
為了記錄需回填地址的四元式,常采用一種拉鏈的辦法:把需回填E.true的四元式拉成一鏈,稱為“真”鏈,把需回填E.false的四元式拉成一鏈,稱為“假”鏈。若有四元式序列:
(10)…gotoE.true(20)…gotoE.true(30)…gotoE.true(10)…goto(0)(20)…goto(10)(30)…goto(20)其中鏈?zhǔn)诪椋?0),鏈尾為(10),0為鏈尾標(biāo)志。則鏈成:使用:E.true和E.false:分別表示“真”鏈和“假”鏈nextstat:下一四元式地址emit:輸出四元式merge(p1,p2):合并p1、p2兩條鏈,即將p2的鏈尾鏈接到p1鏈?zhǔn)?,合并后p2為鏈?zhǔn)?。例:merge(p1,p2)(p10)goto(0)
……
p1鏈(p100)goto(p10)……`(p1)goto(p100)(p20)goto(0)(p1)……
p2鏈(p200)goto(p20)……(p2)goto(p200)backpatch(p,t):把p所鏈接的每個(gè)四元式的第四區(qū)段都填為tE.codebegin:E的第一個(gè)四元式序號(hào)(語義值)
自下而上的分析中布爾表達(dá)式的一種翻譯方案,如p167圖8.13所示
(1)E→E1orE2
{backpatch(E1.false,E2.codebegin);E.codebegin:=E1.codebegin;E.true:=merge(E1.true,E2.true);E.false:=E2.false;
}(2)E→E1andE2
{backpatch(E1.true,E2.codebegin);E.codebegin:=E1.codebegin;E.true:=E2.true;E.false:=merge(E1.false,E2.false);
}
(3)E→notE1
{
E.true:=E1.false;E.codebegin:=E1.codebegin;E.false:=E1.true;}(4)E→(E1){
E.true:=E1.true;
E.codebegin:=E1.codebegin;E.false:=E1.false;}(5)E→id1relopid2
{E.true:=nextstat;E.codebegin:=nextstat;E.false:=nextstat+1;emit(‘if’id1.place‘rop’id2.place‘goto’_);emit(‘goto’_);
}
(6)E→true{E.true:=nextstat;E.codebegin:=nextstat;emit(‘goto’_);
}(7)E→false{E.false:=nextstat;E.codebegin:=nextstat;emit(‘goto’_);
}以a〈borc〈dande〈f
為例,將分析產(chǎn)生語法樹時(shí)的語義動(dòng)作結(jié)果“真”“假”鏈情況注釋在相應(yīng)結(jié)點(diǎn)處
anda〈borEE.true={104,100}E.false={105,103}E1
E.true={100}E.false={101}E4
E.true={104}E.false={105,103}E2
E.true={102}E.false={103}E3
E.true={104}E.false={105}c〈d
e〈f過程:
1)歸約a〈b到E1時(shí),產(chǎn)生兩個(gè)四元式:
100:ifa〈bgoto—101:goto—(假定nextstat初值為100)
E1.true和E1.false分別為{100}、{101},
E1.codebegin=100;
2)歸約c〈d到E2時(shí),產(chǎn)生兩個(gè)四元式:
102:ifc〈dgoto—103:goto—
E2.true和E2.fa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 我是消防宣傳安全我先行
- 汽車銷售代銷合同
- 項(xiàng)目維護(hù)服務(wù)中介
- 廣告燈箱投放策略招標(biāo)
- 設(shè)備質(zhì)量保證書保駕護(hù)航
- 廉政自律自律書
- 無憂安裝嚴(yán)格保證
- 銀行個(gè)人購買消防設(shè)備貸款合同
- 簡易混凝土供應(yīng)合同
- 云服務(wù)器采購協(xié)議書
- 2025屆廣州市高三年級(jí)調(diào)研測(cè)試(零模)數(shù)學(xué)試卷(含答案)
- 2024-2025學(xué)年上海市虹口區(qū)高三一模地理試卷(含答案)
- 企業(yè)管理制度-薪酬管理制度
- 4.1.1陸地水體間的相互關(guān)系課件高中地理湘教版(2019)選擇性必修一
- 【MOOC】大學(xué)生心理學(xué)-中央財(cái)經(jīng)大學(xué) 中國大學(xué)慕課MOOC答案
- 外墻真石漆施工方案
- 計(jì)劃崗位培訓(xùn)課件
- 中藥涂擦治療
- 2023-2024學(xué)年廣東省深圳市福田區(qū)八年級(jí)(上)期末英語試卷
- IATF16949體系推行計(jì)劃(任務(wù)清晰版)
- 2021年高考數(shù)學(xué)試卷(上海)(春考)(解析卷)
評(píng)論
0/150
提交評(píng)論