




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
語法制導(dǎo)翻譯中間代碼生成概述語義處理程序設(shè)計語言的語義
靜態(tài)語義是對程序約束的描述,這些約束無法通過抽象語法規(guī)則來妥善地描述,實質(zhì)上就是語法規(guī)則的良形式條件,它可以分為類型規(guī)則和作用域/可見性規(guī)則兩大類類型相容性變量先聲明后引用名稱相關(guān)要求
動態(tài)語義
程序單位描述的計算編譯程序的語義處理工作靜態(tài)語義審查解釋執(zhí)行動態(tài)語義(計算)生成代碼...語
法
分
析
后
的
源
程
序
T
語義處理第2頁,共126頁,2024年2月25日,星期天概述語義形式化語義建模文法模型----屬性文法命令式或操作式模型-----操作語義學(xué)應(yīng)用式模型-----指稱語義學(xué)公理式模型-----公理語義學(xué)第3頁,共126頁,2024年2月25日,星期天屬性文法
表達式文法E—>T+T|TorT
T—>n|bE
T1+T2
{T1.type=intT2.type=T1.type E.type:=int}E
T1orT2
{T1.type=bool T2.type=T1.typeE.type:=bool}T
n{T.type:=int}T
b{T.type:=bool}第4頁,共126頁,2024年2月25日,星期天
操作語義描述一段程序的含義是通過執(zhí)行該段程序所改變的計算機(虛擬計算機)狀態(tài)來反映。這個計算機的狀態(tài)與程序執(zhí)行時的狀態(tài)相對應(yīng):包括變量的所有值,可執(zhí)行程序本身,各種系統(tǒng)定義的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。計算機里所有的寄存器的值和存儲單元的值作為計算機的狀態(tài),用一組形式定義的操作來說明執(zhí)行一條指令相應(yīng)的狀態(tài)怎樣變化。For(expr1;expr2;expr3){expr1;
...Loop:ifexpr2=0gotoout}…
expr3;
gotoloopout:...第5頁,共126頁,2024年2月25日,星期天公理語義一個語言的每個語法成分的含義定義為公理和演繹規(guī)則,用于推導(dǎo)出該成分執(zhí)行的效果。公理語義概念是隨著程序正確性的證明而發(fā)展的。當(dāng)正確性證明能構(gòu)造時表明程序執(zhí)行它的規(guī)格說明所描述的計算。在一個證明中,每一個語句之前之后都有一個邏輯表達式對程序的變量進行約束,以此說明這個語句的含義。一般的記號{P}S{Q}如果在語句S執(zhí)行前P為真,則在語句S執(zhí)行并終止后Q為真。
第6頁,共126頁,2024年2月25日,星期天
演繹規(guī)則的例子規(guī)則前驅(qū)后繼賦值:x:=expr{P(expr)}x:=expr{P(x)}While:{P∧B}S{P}{P}whileBdoSend{P∧(notB)}
if--then--else {B∧P}S1{Q},{(notB)∧P}S2{Q}{P}ifBthenS1
elseS2{Q}第7頁,共126頁,2024年2月25日,星期天指稱語義指稱語義的基本概念是給每一段程序?qū)嶓w定義一個數(shù)學(xué)意義上的對象,和一個從實體實例向數(shù)學(xué)意義對象的映射的函數(shù)特點:不但對全部程序賦予全文而且對程序設(shè)計語法 每一個語法成分短語(表達式,命令,聲明…) 都給予含義。每一個語法成分(短語)的含義是以它的自 成分的含義的術(shù)語來定義的。即語義結(jié)構(gòu)平行于語法結(jié)構(gòu)。語義函數(shù):程序設(shè)計語言的語義利用映射函數(shù)來證 明。語義函數(shù)將短語映射到它的指稱。第8頁,共126頁,2024年2月25日,星期天
例:二進制數(shù)語言110或10101語法實體指稱(自然數(shù))6或21語義實體二進制數(shù)文法Numeral::=0
::=1
::=Numeral0
::=Numeral1
自然數(shù)Natrual={0,1,2,3,…}
語義函數(shù)Valuation:NumeralNatural第9頁,共126頁,2024年2月25日,星期天Valuation[101]表示把Valuation施用于101Valuation[N]------把它施用于N
定義:Valuation(用四個方程)因為有四個形式numeralValuation[0]
0Valuation[1]
1Valuation[N0]
2
Valuation[N]Valuation[N1]
2
Valuation[N]+1
所以:Valuation[110]=2
Valuation[11]=2
(2
Valuation[1]+1)=2
(2
1+1)=6第10頁,共126頁,2024年2月25日,星期天屬性文法和語法制導(dǎo)翻譯雖然形式語義學(xué)(如指稱語義學(xué)、公理語義學(xué)、操作語義學(xué)等)的研究已取得了許多重大的進展,但目前在實際應(yīng)用中比較流行的語義描述和語義處理的方法主要還是屬性文法和語法制導(dǎo)翻譯方法第11頁,共126頁,2024年2月25日,星期天屬性文法屬性文法(attributegrammar)是一個三元組:A=(G,V,F),其中G:是一個上下文無關(guān)文法V:有窮的屬性集,每個屬性與文法的一個終結(jié)符或非終結(jié)符相連,這些屬性代表與文法符號相關(guān)信息,如它的類型、值、代碼序列、符號表內(nèi)容等等.屬性與變量一樣,可以進行計算和傳遞。屬性加工的過程即是語義處理的過程。F:關(guān)于屬性的屬性斷言或一組屬性的計算規(guī)則(稱為語義規(guī)則).斷言或語義規(guī)則與一個產(chǎn)生式相聯(lián),只引用該產(chǎn)生式左端或右端的終結(jié)符或非終結(jié)符相聯(lián)的屬性.
第12頁,共126頁,2024年2月25日,星期天屬性有兩種繼承的和綜合的屬性屬性通常分為兩類:綜合屬性和繼承屬性。簡單地說,綜合屬性用于“自下而上”傳遞信息,而繼承屬性用于“自上而下”傳遞信息。出現(xiàn)在產(chǎn)生式左邊的繼承屬性和出現(xiàn)在產(chǎn)生式右邊的綜合屬性不由所給定的產(chǎn)生式的屬性計算規(guī)則進行計算,它們由其它產(chǎn)生式的屬性規(guī)則計算或者由生計算器的參數(shù)提供。
AX1X2…XnA的綜合屬性,計算S(A):=f(I(X1),…,I(Xn))Xj的繼承屬性,計算T(Xj):=f(I(A),...I(Xn))1)非終結(jié)符既可有綜合屬性也可有繼承屬性,但文法開始符號沒有繼承屬性.2)終結(jié)符只有綜合屬性.第13頁,共126頁,2024年2月25日,星期天在一個屬性文法中,對應(yīng)于每個產(chǎn)生式A
都有一套與之相關(guān)聯(lián)的語義規(guī)則,每條規(guī)則的形式為b:=f(c1,c2…ck)這里,f是一個函數(shù),而且或者 (1)b是A的一個綜合屬性并且c1,c2…ck是產(chǎn)生式右邊文法符號的屬性;或者 (2)b是產(chǎn)生式右邊某個文法符號的一個繼承屬性并且c1,c2…ck是A或產(chǎn)生式右邊任何文法符號的屬性。在兩種情況下,我們都說屬性b依賴于屬性c1,c2…ck
。第14頁,共126頁,2024年2月25日,星期天
一個屬性文法的例子例8.1
非終結(jié)符E、T及F都有一個綜合屬性val,符號digit有一個綜合屬性,它的值由詞法分析器提供。與產(chǎn)生式L→En對應(yīng)的語義規(guī)則僅僅是打印由E產(chǎn)生的算術(shù)表達式的值的一個過程,我們可認(rèn)為這條規(guī)則定義了L的一個虛屬性。某些非終結(jié)符加下標(biāo)是為了區(qū)分一個產(chǎn)生式中同一非終結(jié)符多次出現(xiàn)語義規(guī)則
LEEE1+TETTT1*FTFF(E)FdigitPrint(E.val)
E.val:=E1.val+T.val
E.val:=T.val
T.val:=T1.val
F.val
T.val:=F.valF.val:=E.valF.val:=digit.lexval產(chǎn)生式第15頁,共126頁,2024年2月25日,星期天設(shè)表達式為3*5+4,則語義動作打印數(shù)值19.LE.val=19E.val=15T.val=4T.val=15F.val=4T.val=3F.val=3F.val=5digit.lexval=4digit.lexval=5digit.lexval=3+*3*5+4的帶注釋的分析樹第16頁,共126頁,2024年2月25日,星期天繼承屬性一個結(jié)點的繼承屬性值是由此結(jié)點的父結(jié)點和/或兄弟結(jié)點的某些屬性來決定的。例8.2繼承屬性L.in生產(chǎn)式語義規(guī)則D
TL
T
int
T
real
L
L1,idL
idL.in:=T.typeT.type=integerT.type:=real
L1.in:=L.in
addtype(id.entry,L.in)
addtype(id.entry,L.in)第17頁,共126頁,2024年2月25日,星期天
DL.in=realL.in=realL.in=realT.type=realrealid2id1id3.Realid1,id2,id3,,第18頁,共126頁,2024年2月25日,星期天例8.3P–>DSD–>varV;D|
S–>V:=E;S|
V–>x|y|z現(xiàn)在使用兩個屬性,name和dl,每當(dāng)一個新的變量聲明時,就把它的name屬性附給它,name屬性是綜合屬性。將所聲明的變量都放到一個變量名字清單中(用語義函數(shù)addlist實現(xiàn)),用屬性dl綜合聲明塊中聲明的所有變量。然后這個dl屬性又作為繼承屬性傳到后面的語句部分,每個語句用到的變量都要進行審查,看它是否在變量名字清單中P–>DS{S.dl=D.dl}D1–>varV;D2|
{D1.dl=addlist(V.name,D2.dl)}|{D1.dl=NULL}S1–>V:=E;S2|
{check(V.name,S1.dl);S2.dl=S1.dl}V–>x|y|z{V.name='x'}|{V.name='y'}|{V.name='z'}第19頁,共126頁,2024年2月25日,星期天varx;vary;x:=e;
PDdl={x,y}S
dl={x,y}varV;Ddl={y}V:=e;S
xvarV;Ddl={}y
y
第20頁,共126頁,2024年2月25日,星期天語法制導(dǎo)的翻譯一個翻譯是符號串對的一個集合。在一個編譯程序定義的翻譯中,符號串對是源程序和目標(biāo)程序。各個編譯階段定義一個翻譯,詞法分析:(字符串,單詞串)語法分析:(單詞串,語法樹)代碼生成(語法樹,匯編語言)設(shè)
是輸入字母表且
是輸出字母表。定義由語言L1*到語言L2*的一個翻譯是由*到*的一個關(guān)系T,使得T的定義域為L1且T的值域為L2。使(x,y)∈T的句子y叫做x的一個輸出.第21頁,共126頁,2024年2月25日,星期天語法制導(dǎo)的翻譯直觀地說,一個語法制導(dǎo)翻譯的基礎(chǔ)是一個文法,其中翻譯成分依附在每一產(chǎn)生式上。例8.4:下列翻譯模式,它定義翻譯,即對每個輸入x,其輸出y是x的逆轉(zhuǎn)。定義此翻譯的規(guī)則是產(chǎn)生式
翻譯規(guī)則(1)s
0s(2)s
1s(3)s
ε
(1)s=s0(2)s=s1
(3)s=ε
第22頁,共126頁,2024年2月25日,星期天
輸入輸出對可由(,)表示,其中
是輸入句子形式而
是輸出句子形式。(S,S)開始用產(chǎn)生式s
0s來擴展得到(0S,S0).再用一次規(guī)則(1),得到(00S,S00)。再用規(guī)則(2),就得到(001S,S100).然后應(yīng)用規(guī)則(3)并得到(001,100)。第23頁,共126頁,2024年2月25日,星期天
例8.5:把下述產(chǎn)生式定義的算術(shù)表達式映射到后綴波蘭表示:
EE+TET
TT
FTF
F(E)
Fa
E=ET+
E=T
T=TF
T=F
F=E
F=a產(chǎn)生式
翻譯規(guī)則第24頁,共126頁,2024年2月25日,星期天
確定輸入a+a
a的輸出:
(E,E)(E+T,ET+)
(T+T,TT+)
(F+T,FT+)(a+T,aT+)(a+TF,aFF+)(a+FF,aFF+)(a+aF,aaF+)(a+aa,aaa+)第25頁,共126頁,2024年2月25日,星期天
定義:一個語法制導(dǎo)的翻譯模式是一個五元組T=(N,,,R,S),其中
(1)N是非終結(jié)符的有限集。
(2)
是有限的輸入字母表。
(3)
是有限的輸出字母表。
(4)R是形如A,的規(guī)則的有限集,其中
∈(N∪
)*,∈(N∪
)*且
中那組非終結(jié)符是中那組非終結(jié)符的置換。
(5)S是N中一個特別的非終結(jié)符,即開始符。第26頁,共126頁,2024年2月25日,星期天
定義:若T=(N,,,R,S)是SDTS,(T)則稱為語法制導(dǎo)的翻譯(SDT),文法Gi=(N,
,P,S),其中P={A|A,屬于R),稱為SDTST的基礎(chǔ)(或輸入)文法。文法G0=(N,,P,S),,其中P={A|A,屬于R},稱為T的輸出文法。把語法制導(dǎo)的翻譯方法看成是將輸入文法Gi中的推導(dǎo)樹變換成輸出文法G0中的推導(dǎo)樹。給了輸入句子x,可以按如下方式得到x的一個翻譯:先為推導(dǎo)x構(gòu)造一棵推導(dǎo)樹,再變換該樹到輸出文法中的一棵樹,然后取此輸出樹的邊緣作為x的一個翻譯。第27頁,共126頁,2024年2月25日,星期天語義制導(dǎo)翻譯中的規(guī)則A,
對應(yīng)于每一個文法產(chǎn)生式A
都有與之相關(guān)聯(lián)的一套語義描述
屬性文法(attributegrammar)是一個三元組:A=(G,V,F)屬性文法可以看作是關(guān)于語言翻譯的高級規(guī)范說明,其中隱去實現(xiàn)細節(jié),使用戶從明確說明翻譯順序的工作中解脫出來第28頁,共126頁,2024年2月25日,星期天語法制導(dǎo)翻譯實現(xiàn)從概念上講,語法制導(dǎo)翻譯即基于屬性文法的處理過程通常是這樣的:對單詞符號串進行語法分析,構(gòu)造語法分析樹,然后根據(jù)需要遍歷語法樹并在語法樹的各結(jié)點處按語義規(guī)則進行計算輸入符號串
分析樹
屬性依賴圖
語義規(guī)則的計算順序
第29頁,共126頁,2024年2月25日,星期天依賴圖由稱為依賴圖的一個有向圖描述分析樹中的繼承屬性和屬性中間的相互依賴關(guān)系。
依賴圖的構(gòu)造算法:
for分析樹中每一個結(jié)點ndo
for
結(jié)點的文法符號的每一個屬性ado
為a在依賴圖中建立一個結(jié)點;
for
分析樹中每一個結(jié)點ndo
for結(jié)點n所用產(chǎn)生式對應(yīng)的每一個語義規(guī)則
b:=f(c1,c2,…ck)do
fori:=1tokdo
從ci結(jié)點到b結(jié)點構(gòu)造一條有向邊
第30頁,共126頁,2024年2月25日,星期天依賴圖----例8.2例8.2繼承屬性L.in生產(chǎn)式語義規(guī)則D
TL
T
int
T
real
L
L1,idL
idL.in:=T.typeT.type=integerT.type:=real
L1.in:=L.in
addtype(id.entry,L.in)
addtype(id.entry,L.in)第31頁,共126頁,2024年2月25日,星期天例8.2Realid1,id2,id3分析樹的依賴圖
5678910T4DLLLRealtypeininin3entry2entryentryid3id2id1..1第32頁,共126頁,2024年2月25日,星期天依賴圖中的結(jié)點由數(shù)字來標(biāo)識。從代表T.type的結(jié)點4有一條有向邊連到代表L.in的結(jié)點5,因為根據(jù)產(chǎn)生式E→TL的語義規(guī)則L1.in=L.in,可知L1.in依賴于L.in,所以有兩條向下的有向邊分別進入結(jié)點7和9。每一個與L產(chǎn)生式有關(guān)的語義規(guī)則addtype(id.Entry,L.in)都產(chǎn)生一個虛屬性,結(jié)點6、8和10都是為這些虛屬性構(gòu)造的。第33頁,共126頁,2024年2月25日,星期天良定義的屬性文法。
很顯然,一條求值規(guī)則只有在其各變元值均已求得的情況下才可以使用。但有時候可能會出現(xiàn)一個屬性對另一個屬性的循環(huán)依賴關(guān)系。從事貿(mào)易如,p、c1、c2都是屬性,若有下求值規(guī)則:p:=f1(c1)、c1:=f2(c2)、c2:=f3(p)時,就無法對p求值。如果一屬性文法不存在屬性之間的循環(huán)依賴關(guān)系,那么稱該文法為良定義的。為了設(shè)計編譯程序,我們只處理良定義的屬性文法。第34頁,共126頁,2024年2月25日,星期天屬性的計算順序一個有向非循環(huán)圖的拓撲序是圖中結(jié)點的任何順序m1,m2,…,mk,使得邊必須是從序列中前面的結(jié)點指向后面的結(jié)點。也就是說,如果mi→mj是mi到mj的一條邊,那么在序列中mi必須出現(xiàn)在mj之前。一個依賴圖的任何拓撲排序都給出一個分析樹中結(jié)點的語義規(guī)則計算的有效順序。這就是說,在拓撲排序中,在一個結(jié)點,語義規(guī)則b:=f(c1,c2,…ck)中的屬性c1,c2,…ck在計算b以前都是可用的。第35頁,共126頁,2024年2月25日,星期天屬性文法說明的翻譯是很精確的。最基本的文法用于建立輸入符號串的分析樹。依賴圖如上面討論的那樣建立。從依賴圖的拓撲排序中,我們可以得到計算語義規(guī)則的順序。用這個順序來計算語義規(guī)則就得到輸入符號串的翻譯。例8.2Realid1,id2,id3分析樹的依賴圖每一條邊都是從序號較低的結(jié)點指向序號較高的結(jié)點。歷此,依賴圖的一個拓撲排序可以從低序號到高序號順序?qū)懗?。從這個拓撲排序中我們可以得到下列程序,用an來代表依賴圖中與序號n的結(jié)點有關(guān)的屬性: a4:=real a5:=a4
addtype(id3,entry,a5); a7:=a5; addtype(id2,entry,a7) a9:=a7
addtype(id1,entry,a9)這些語義規(guī)則的計算將把real類型填入到每個標(biāo)識符對應(yīng)的符號表項中。第36頁,共126頁,2024年2月25日,星期天
屬性計算方法樹遍歷的屬性計算方法
設(shè)語法樹已經(jīng)建立起了,并且樹中已帶有開始符號的繼承屬性和終結(jié)符的綜合屬性。然后以某種次序遍歷語法樹,直至計算出所有屬性。最常用的遍歷方法是深度優(yōu)先,從左到右的遍歷方法。如果需要的話,可使用多次遍歷(或稱遍)。一遍掃描的處理方法與樹遍歷的屬性計算文法不同,一遍掃描的處理方法是在語法分析的同時計算屬性值,而不是語法分析構(gòu)造語法樹之后進行屬性的計算,而且無無需構(gòu)造實際的語法樹。因為一遍掃描的處理方法與語法分析器的相互作用,它與下面兩個因素密切相關(guān):(1)所采用的語法分析方法(2)屬性的計算次序。第37頁,共126頁,2024年2月25日,星期天例:定義定點二進制數(shù)的CFG:(1)N
S?S(2)S
SB(3)S
B(4)B
0(5)B
1
第38頁,共126頁,2024年2月25日,星期天非終結(jié)符N表示整個二進制數(shù)的數(shù)值,綜合屬性v附加在N上:Nv非終結(jié)符B表示一個二進制數(shù)字,它有自己的值v,但該值分配給N的值與它的位置有關(guān),是與2成比例,比例因子f是從S繼承的屬性,所以:Bvf非終結(jié)符S表示一個二進制數(shù)字串,它也有值,但該值與串的位置有關(guān),與f有關(guān)與串的長度l有關(guān):Sfvl第39頁,共126頁,2024年2月25日,星期天構(gòu)造數(shù)值的屬性斷言可以如下:
Nv——>Sf1v1l1?Sf2v2l2[v=v1+v2;f1=1;f2=2-l2]Sfvl——>Sf1v1l1Bf2v2[f1=2f;f2=f;v=v1+v2;l=l1+1]——>Bfv[l=1]Bfv——>0[v=0]——>1[v=f]第40頁,共126頁,2024年2月25日,星期天
N
v
S
i1
l1“?”S
i2
l2[v=i1+2-l2?i2]
S
i
l
S
i1
l1B
i2[i
=2i1+i2;;l=l1+1]
B
i[l=1]
B
i
“0”[i=0]
“1”[i=1]第41頁,共126頁,2024年2月25日,星期天
在某些情況下可用一遍掃描實現(xiàn)屬性文法的語義規(guī)則計算。也就是說在語法分析的同時完成語義規(guī)則的計算,無須明顯地構(gòu)造語法樹或構(gòu)造屬性之間的依賴圖。因為單遍實現(xiàn)對于編譯效率非常重要具體的實現(xiàn)希望在單遍掃描中完成翻譯研究怎樣實現(xiàn)這種翻譯器。一個一般的屬性文法的翻譯器可能是很難建立的,然而有一大類屬性文法的翻譯器是很容易建立的s-屬性
適用于自底向上的計算L-屬性適用于自頂向下的分析,也可用于自底向上。
第42頁,共126頁,2024年2月25日,星期天S-屬性文法的自下而上計算S-屬性文法,它只含有綜合屬性。綜合屬性可以在分析輸入符號串的同時自下而上的分析器來計算。分析器可以保存與棧中文法符號有關(guān)的綜合屬性值,每當(dāng)進行歸約時,新的屬性值就由棧中正在歸約的產(chǎn)生式右邊符號的屬性值來計算。S-屬性文法的翻譯器通??山柚贚R分析器實現(xiàn)。在S-屬性文法的基礎(chǔ)上,LR分析器可以改造為一個翻譯器,在對輸入串進行語法分析的同時對屬性進行計算。第43頁,共126頁,2024年2月25日,星期天產(chǎn)生式語義規(guī)則0)L→Eprint(E.val)1)E→E1+TE.val∶=E1.val+T.val2)E→TE.val∶=T.val3)T→T1*FT.val∶=T1.val×F.val4)T→FT.val∶=F.val5)F→(E)F.val∶=E.val6)F→digitF.val:=digit.lexvalLR分析器可以改造為一個翻譯器,在對輸入串進行語法分析的同時對屬性進行計算。
LR分析器增加語義棧
第44頁,共126頁,2024年2月25日,星期天
2+3*5的分析和計值過程步驟動作狀態(tài)棧語義棧(值棧)符號棧余留輸入串1)0-#2+3*5#2)05--#2+3*5#3)r603-2#F+3*5#4)r402-2#T+3*5#5)r201-2#E+3*5#6)016-2-#E+3*5#7)0165-2--#E+3*5#8)r60163-2-3#E+F*5#9)r40169-2-3#E+T*5#10)01697-2-3-#E+T*5#11)016975-2-3--#E+T*5#12)r601697(10)-2-3-5#E+T*F#13)r30169-2-(15)#E+T#14)r101-(17)#E#15)接受第45頁,共126頁,2024年2月25日,星期天BOTTOM—UP語義處理是作類型檢查,對二目運算符的運算對象進行類型匹配審查。(LR分析):增加語義棧歸約時進行語義動作.例8.7G[E]:(1)ET+T(2)ETorT(3)Tn(4)Tb
第46頁,共126頁,2024年2月25日,星期天E
T1+T2
{ifT1.type=intandT2.type=intthenE.type:=int
elseerror}
E
T1orT2
{ifT1.type=boolandT2.type=boolthenE.type:=bool
elseerror}T
n{T.type:=int}T
b{T.type:=bool}
第47頁,共126頁,2024年2月25日,星期天
G[E]:(1)ET+T(2)ETorT(3)Tn(4)Tb第48頁,共126頁,2024年2月25日,星期天第49頁,共126頁,2024年2月25日,星期天L-屬性文法和自頂向下翻譯一個屬性文法稱為L-屬性文法,如果對于每個產(chǎn)生式A→X1X2…Xn,其每個語義規(guī)則中的每個屬性或者是綜合屬性,或者是Xj(1≤j≤n)的一個繼承屬性且這個繼承屬性僅依賴于:(1)產(chǎn)生式Xj在左邊符號X1,X2,…,Xj-1的屬性;(2)A的繼承屬性。S-屬性文法一定是L-屬性文法,因為(1)、(2)限制只用于繼承屬性。L-屬性文法允許一次遍歷就計算出所有屬性值。LL(1)這種自上而下分析文法的分析過程,從概念上說可以看成是深度優(yōu)先建立語法樹的過程,因此,我們可以在自上而下語法分析的同時實現(xiàn)L屬性文法的計算。第50頁,共126頁,2024年2月25日,星期天例(中綴表達式翻譯成相應(yīng)的后綴表達式)
E→TR
R→addopT{print(addop.Lexeme)}R1|ε
T→num{print(num.val)}
翻譯模式(Translationschemes)適合語法制導(dǎo)翻譯的另一種描述形式。翻譯模式給出了使用語義規(guī)則進行計算的次序,可把某些實現(xiàn)細節(jié)表示出來。在翻譯模式中,和文法符號相關(guān)的屬性和語義規(guī)則(這里我們也稱語義動作),用花括號{}括起來,插入到產(chǎn)生式右部的合適位置上。第51頁,共126頁,2024年2月25日,星期天輸入串9-5+2的語法樹,每個語義動作都作為相應(yīng)產(chǎn)生式左部符號的結(jié)點的兒子,按深度優(yōu)先次序執(zhí)行圖中的動作后,打印輸出95-2+。
ETR9print(‘9’)-Tprint(‘-’)R5print(‘5’)+Tprint(‘+’)R2print(‘2’)ε第52頁,共126頁,2024年2月25日,星期天L-屬性文法在自頂向下分析中的實現(xiàn)
帶左遞歸的文法的翻譯模式E→E1+T {E.val:=E1.val+T.val}E→E1-T {E.val:=E1.val-T.val}E→T {E.val:=T.val}T→(E) {T.val:=E.val}T→num {T.val:=num.val}
第53頁,共126頁,2024年2月25日,星期天消除左遞歸的同時考慮屬性,構(gòu)造新的翻譯模式
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}第54頁,共126頁,2024年2月25日,星期天計算表達式9-5+2.ER.i=9T.val=5T.val=9R.i=4
R.i=6T.val=2num.val=9num.val=5num.val=2_+
第55頁,共126頁,2024年2月25日,星期天在上頁的翻譯模式中,每個數(shù)都是由T產(chǎn)生的,并且T.val的值就是由屬性num.val給出的數(shù)的詞法值。子表達式9-5中的數(shù)字9是由最左邊的T生成的,但是減號和5是由根的右子結(jié)點R生成的。繼承屬性R.i從T.val得到值9。計算9-5并把結(jié)果4傳遞到中間的R結(jié)點這是通過產(chǎn)生式中嵌入的下面動作實現(xiàn):{R1.i:=R.i-T.val}類似的動作把2加到9-5的值上,在最下面的R結(jié)點處產(chǎn)生結(jié)果R.i=6。這個結(jié)將成為根結(jié)點處E.val的值,R的綜合屬性s在圖中沒有表示出來,它用來向上復(fù)制這一結(jié)果一直到樹根。
第56頁,共126頁,2024年2月25日,星期天對于自頂向下分析,我們假設(shè)動作是在處于相同位置上的符號被展開(匹配成功)時執(zhí)行的。如圖中的第二個產(chǎn)生式中,第一個動作(對R1.i賦值)是在T被完全展開成終結(jié)符號后執(zhí)行的,第二個動作是在R1被完全展開成終結(jié)符號后執(zhí)行的。正如前面我們所討論的,一個符號的繼承屬性必須由出現(xiàn)在這個符號之前的動作來計算,產(chǎn)生式左邊非終結(jié)符的綜合屬性必須在它所依賴的所有屬性都計算出來以后才能計算。第57頁,共126頁,2024年2月25日,星期天轉(zhuǎn)換左遞歸翻譯模式的方法推廣到一般
假設(shè)翻譯模式1:A→A1Y {A.a:=g(A1。a,Y.y)}A→X {A.a:=f(X.x)} 每個文法符號都有一個綜合屬性,用相應(yīng)的小寫字母表示,g和f是任意函數(shù)消除左遞歸,文法轉(zhuǎn)換成:A→XRR→YR|ε 再考慮語義動作,翻譯模式變?yōu)?A→X {R.i:=f(X.x)}R {A.a:=R.s}R→Y {R1.i:=g(R.i,Y.y)} R1 {R.s:=R1.s}R→ε {R.s:=R.i}第58頁,共126頁,2024年2月25日,星期天翻譯模式1和翻譯模式2的結(jié)果是一樣的??梢越o出串XY1Y2兩棵帶注釋的語法樹看出來,一棵是根據(jù)翻譯模式1自下而上計算屬性的。一棵是根據(jù)翻譯模式2自上而下計算的。第59頁,共126頁,2024年2月25日,星期天
A→A1Y {A.a:=g(A1。a,Y.y)}
A→X {A.a:=f(X.x)}
A.a=g(g(f(X.x,Y1.y),Y2.y)A.a=g(f(X.x,Y1.y)Y2A.a=f(X.x)Y1X
AAYAYX第60頁,共126頁,2024年2月25日,星期天
A→X{R.i:=f(X.x)}R→Y {R1.i:=g((R.i),Y.y)}
R{A.a:=R.s}
R1{R.s:=R1.s}
A→XRR→YR|εAXRY1RY2R
AXR.i=f(X.x)Y1R.i=g(f(X.x,Y1.y)Y2R.i=g(g(f(X.x,Y1.y),Y2.y)
第61頁,共126頁,2024年2月25日,星期天思考問題-把建立語法樹的翻譯模式變換成適合預(yù)測分析的模式E
E1+T{E.nptr:=mknode(‘+’,E1.nptr,T.nptr)E
E1-T{E.nptr:=mknode(‘-’,E1.nptr,T.nptr)E
T{E.nptr:=T.nptr)第62頁,共126頁,2024年2月25日,星期天自下而上計算繼承屬性討論在自下而上的分析過程中實現(xiàn)L-屬性文法的方法。這種方法可以實現(xiàn)任何基于LL(1)文法的L-屬性文法,它還可以實現(xiàn)許多(不是所有)基于LR(1)文法的L-屬性文法。這種方法是S-屬性文法的自下而上翻譯技術(shù)的一般化第63頁,共126頁,2024年2月25日,星期天自下而上分析器對產(chǎn)生式A→XY的右部是通過把X和Y從分析棧中移出并用A代替它們。假設(shè)X有一個綜合屬性X.s,按照前面所介紹的方法我們把它與X一起放在分析棧中。由于X.s的值在Y以下的子樹中的任何歸約之前已經(jīng)放在棧中,這個值可以被Y繼承。也就是說,如果繼承屬性Y.i是由復(fù)寫規(guī)則Y.i:=X.s定義的,則可以在需要y.i值的地方使用X.s的值。在自下而上分析中計算屬性值時復(fù)寫規(guī)則起非常重要的作用??聪旅胬?。第64頁,共126頁,2024年2月25日,星期天假設(shè)某翻譯模式為:D→T {L.in:=T.type}LT→int {T.type:=integer}T→real {T.type:=real}L→ {L1.in:=L.in}L1,id {addtype(id.entry,L.in)}L→id {addtype(id.entry,L.in)}第65頁,共126頁,2024年2月25日,星期天回顧例8.2Realid1,id2,id3分析樹的依賴圖
5678910T4DLLLRealtypeininin3entry2entryentryid3id2id1..1第66頁,共126頁,2024年2月25日,星期天例8.2輸入串realRealid1,id2,id3的分析過程當(dāng)L的右部被歸約時,T恰好在這個右部的下面輸入狀態(tài)(符號)使用產(chǎn)生式Realid1,id2,id3#id1,id2,id3#realid1,id2,id3#TT
real,id2,id3#Tid1,id2,id3#TLL
idid2,id3#TL,,id3#TL,id2,id3#TLL
Li,did3#TL,#TL,id3#TLL
Li,d#DD
TL第67頁,共126頁,2024年2月25日,星期天
用綜合屬性代替繼承屬性有時,改變基礎(chǔ)文法可能避免繼承屬性。例如,一個Pascal的說明由一標(biāo)識符序列后跟類型組成,如,m,n:integer。這樣的說明的文法可由下面形式的產(chǎn)生式構(gòu)成D→L:TT→integer|charL→L,id|id因為標(biāo)識符由L產(chǎn)生而類型不在L的子樹中,我們不能僅僅使用綜合屬性就把類型與標(biāo)識符聯(lián)系起來。事實上,如果非終結(jié)符L從第一個產(chǎn)生式中它的右邊T中繼承了類型,則我們得到的屬性文法就不是L-屬性的,因此,基于這個屬性文法的翻譯工作不能在語法分析的同時進行。第68頁,共126頁,2024年2月25日,星期天一個解決的方法是重新構(gòu)造文法使類型作為標(biāo)識符表的最后一個元素:D→idLL→,idL|:TT→integer|char這樣,類型可以通過綜合屬性L.type進行傳遞,當(dāng)通過L產(chǎn)生每個標(biāo)識符時,它的類型就可以填入到符號表中。
第69頁,共126頁,2024年2月25日,星期天語義制導(dǎo)翻譯的編譯實現(xiàn):例8.6E–>TE'E'–>ATE'|
T–>FT'T'–>MFT'|
F–>(E)|intA–>+|-M–>*|/第70頁,共126頁,2024年2月25日,星期天E->TE'E'->ATE'{rhs=PopOperand();lhs=PopOperand();switch(PopOperator()){caseADD:PushOperand(lhs+rhs);break;caseSUB:PushOperand(lhs-rhs);break;}}|
{/*empty,donothing*/}T->FT'T'->MFT'{rhs=PopOperand();lhs=PopOperand();switch(PopOperator()){caseMUL:PushOperand(lhs*rhs);break;caseDIV:PushOperand(lhs/rhs);break;}}|
{/*empty,donothing*/}A->+{PushOperator(ADD);}|-{PushOperator(SUB);}M->*{PushOperator(MUL);}|/{PushOperator(DIV);}F->int{PushOperand(intval);}|(E){/*handledduringparsingofE*/}第71頁,共126頁,2024年2月25日,星期天parse2+4*3:分析動作橋分析棧運算對象棧運算符棧PredictE–>TE‘E#PredictT–>FT'TE‘#PredictF–>intFT'E‘#MatchintintT'E‘#PredictT'–>
T'E‘#2PredictE'–>ATE'ATE'#2PredictA–>+ATE‘#2Match++TE‘#2PredictT–>FT'TE‘#2+PredictF–>intFT'E‘#2+MatchintintT'E‘#2+PredictT'–>MFT'T'E‘#42+PredictM–>*MFT'E‘#42+Match**FT'E‘#42+PredictF–>intFT'E‘#42*+MatchintintT'E‘#42*+PredictT'–>
T'E‘#342*+PredictE'–>
E‘#122+Success!#14第72頁,共126頁,2024年2月25日,星期天Yacc或bison作為編譯程序的生成工具,利用的就是語法制導(dǎo)翻譯方法。它使用符號$$表示產(chǎn)生式左端的屬性,$n表示存取產(chǎn)生式右端第n個文法符號相聯(lián)的屬性如例8.3作為Yacc的輸入,可寫成:P→DS{$2.dl=$1.dl}D1→varV;D{$$.dl=addlist($2.name,$4.dl)}|{$$.dl=null}S1→V:=e;S{check($1.name,$$.dl);
$5.dl=$$.dl}|V→x{$$.name=’x’}|y{$$.name=’y’}|z{$$.name=’z’}第73頁,共126頁,2024年2月25日,星期天如果數(shù)據(jù)結(jié)構(gòu)attribute定義屬性name和dl,可以具體化為:
typestruct_attribute{
char*name;
struct_attribute*list;
}attribute;
P→DS{$2.list=$1.list}D1→varV;D{$$.list=add_to_list($2.name,$4.list)}|{$$.list=null}S1→V:=e;S{check($1.name,$$.list);
$5.list=$$.list}|V→x{$$.name=’x’}|y{$$.name=’y’}|z{$$.name=’z’}第74頁,共126頁,2024年2月25日,星期天語義分析語義分析屬性文法和語法制導(dǎo)翻譯方法和技術(shù)應(yīng)用于語義分析中。第75頁,共126頁,2024年2月25日,星期天語義分析通常包括:(1)類型檢查。驗證程序中執(zhí)行的每個操作是否遵守語言的類型系統(tǒng)的過程.,編譯程序必須報告不符合類型系統(tǒng)的信息。(2)控制流檢查??刂屏髡Z句必須使控制轉(zhuǎn)移到合法的地方。例如,在C語言中break語句使控制跳離包括該語句的最小while、for或switch語句。如果不存在包括它的這樣的語句,則就報錯。(3)一致性檢查。在很多場合要求對象只能被定義一次。例如Pascal語言規(guī)定同一標(biāo)識符在一個分程序中只能被說明一次,同一case語句的標(biāo)號不能相同,枚舉類型的元素不能重復(fù)出現(xiàn)等等。(4)相關(guān)名字檢查。有時,同一名字必須出現(xiàn)兩次或多次。例如,Ada語言程序中,循環(huán)或程序塊可以有一個名字,出現(xiàn)在這些結(jié)構(gòu)的開頭和結(jié)尾,編譯程序必須檢查這兩個地方用的名字是相同的。
(5)名字的作用域分析第76頁,共126頁,2024年2月25日,星期天類型和聲明(Typesanddeclarations)一個類型是一組值和在這些值上的一組操作,程序設(shè)計語言中有三種類型:基本類型:int,float,double,char,bool等等.也可能允許在基本類型基礎(chǔ)上用戶自己定義的類型,如枚舉型.復(fù)合類型:數(shù)組,指針,記錄/結(jié)構(gòu)/聯(lián)合,類等等.這些類型由基本類型構(gòu)成.復(fù)雜類型:鏈表,棧,隊,樹,堆,表格等等.可以把它們組織成ADT.一個語言不一定支持這類高級的抽象。聲明是程序中的一個語句,是把數(shù)據(jù)對象的名稱和類型,以及生命周期信息傳給編譯,聲明的地方傳遞生命周期信息也有些語言允許聲明初始化變量。如:doublecalculate(inta,doubleb);//functionprototypeintx=0;//globalvariablesavailablethroughoutdoubley;//theprogramintmain(){intm[3];//localvariablesavailableonlyinmainchar*n;...}第77頁,共126頁,2024年2月25日,星期天強類型的-任何數(shù)據(jù)類型都可以在編譯時確定弱類型的.進行類型檢查的時間:編譯時,運行時,或者兩者結(jié)合.靜態(tài)類型檢查編譯時進行類型檢查動態(tài)類型檢查,將類型信息并到運行時每個數(shù)據(jù)單元中.隱含類型轉(zhuǎn)換.第78頁,共126頁,2024年2月25日,星期天P→D;ED→D;|id:TT→char|integer|aray[num]ofT|↑TE→literal|num|id|EmodE|E[E]|E↑P代表程序;D代表說明;E代表表達式。如程序語句:key:integer;keymod1999語言本身提供兩種基本類型:char和integer。除此之外還有缺省的基本類型type_error和void。假定所有數(shù)組都從下標(biāo)1開始第79頁,共126頁,2024年2月25日,星期天確定標(biāo)識符類型的部分翻譯模式(1)P→D;E(2)D→D;D(3)D→id:T{addtype(id.Entry,T.type)}(4)T→char{T.Type:=char}(5)T→integer{T.Type:=integer}(6)T→↑T1{T.Type:=pointer(T1.type)}(7)T→array[num]ofT1
{T.Type:=array(num.Val,T1.type)}第80頁,共126頁,2024年2月25日,星期天
語句的類型檢查的翻譯模式S→id:=E{ifid.Type=E.TypeThenS.Type:=voidelseS.Type:=type_error}S→ifEthenS1{ifE.type=booleanthenS.Type:=S1.typeelseS.type:=type_error}S→whileEdoS1{ifE.type=booleanThenS.type:=S1.TypeelseS.type:=type_error}第81頁,共126頁,2024年2月25日,星期天設(shè)計類型檢查程序1.辨認(rèn)語言中可用的類型2.辨認(rèn)具有類型的語言結(jié)構(gòu)3.辨認(rèn)語言的語義規(guī)則第82頁,共126頁,2024年2月25日,星期天InDecaf
basetypes:int,double,bool,stringcompoundtypes:arraysandclasses.Anarraycanbemadeofanytype(eitherabasetype,aclass,oroutofotherarrays).Classesareabitspecialinthattheclassnamemustbedeclaredbeforeitcanbeusedinadeclaration.ADTscanbeconstructedusingclasses,buttheyaren’thandledinanywaydifferentlythanclasses,sowedon’tneedtoconsiderthemspecially.第83頁,共126頁,2024年2月25日,星期天InDecaftherelevantlanguageconstructsconstants,everyconstanthasanassociatedtype.Ascannertellsusthesetypesaswellastheassociatedlexeme.variables:allvariables(global,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件設(shè)計師考試市場分析試題及答案
- 環(huán)境政策與政治動員關(guān)系研究試題及答案
- 政府干預(yù)經(jīng)濟的公共政策策略及答案
- 軟件設(shè)計師考試技能驗證方式試題及答案
- 深入探討機電工程師的職業(yè)發(fā)展現(xiàn)狀與試題及答案
- 公共政策中的社會公平考題及答案
- 5G技術(shù)在智慧養(yǎng)老院中的應(yīng)用探索
- 支持與反對西方政治制度的多面性試題及答案
- 機電工程2025年機械設(shè)計試題及答案
- 網(wǎng)絡(luò)工程師考試知識樹梳理試題及答案
- 交流與傳承-東西文化中碰撞中的藝術(shù)嬗變
- 外周血管健康宣教
- 四年級美術(shù) 《熱鬧的集市》課件“十市聯(lián)賽”一等獎
- 安徽省安慶市宜秀區(qū)2022-2023學(xué)年六年級下學(xué)期期末數(shù)學(xué)試卷
- 《光的折射》 (共29張)
- 《物理因子治療技術(shù)》期末考試復(fù)習(xí)題庫(含答案)
- (培訓(xùn))農(nóng)村實用養(yǎng)蠶技術(shù)
- 污水處理設(shè)施運維服務(wù)投標(biāo)方案(技術(shù)方案)
- 幼兒園大班繪本《小熊不刷牙》 優(yōu)質(zhì)課件
- 病態(tài)竇房結(jié)綜合征 PPT
- 智能制造技術(shù)創(chuàng)新服務(wù)平臺建設(shè)方案
評論
0/150
提交評論