【正文】
1 0001 10 類型表達(dá)式的等價(jià) 根據(jù)語(yǔ)言的類型體制和類型表達(dá)式的表示 方法,分結(jié)構(gòu)等價(jià)和名字等價(jià)。 BEGIN IF s 和 t 是相同的基本類型 THEN return(true) 11 ELSE IF (s=ARRAY(s1,s2)) and (t=ARRAY(t1,t2)) THEN return(eq(s1,t1) and eq(s2,t2)) ELSE IF (s=s1?s2) and (t=t1 ? t2) THEN return(eq(s1,t1) and (eq(s2,t2)) ELSE IF (s=POINTER(s1)) and (t=POINTER(t1)) THEN return(eq(s1,t1)) ELSE IF (s=s1→s2) and (t=t1→t2) THEN return(eq(s1,t1) and eq(s2,t2)) ELSE return(false) END 12 類型表達(dá)式中的名字 類型可以命名。 P: ↑c(diǎn)ell。 13 例 下面給出和聲明( )中的 5個(gè)變量相 聯(lián)系的類型表達(dá)式。 14 不同的語(yǔ)言中,通過(guò)聲明變量標(biāo)識(shí)符和類型 聯(lián)系的規(guī)則是不同的,在解釋這些規(guī)則時(shí),結(jié)構(gòu)等價(jià)和名字等價(jià)是兩個(gè)有用的概念。 np=↑c(diǎn)ell。 q,r : nqr。它們的結(jié)點(diǎn)通常定義成一個(gè)記錄,記錄中含有指向同類型記錄的指針。 17 類型表達(dá)式用圖表示如下: Node=record ? ? ? Info integer next pointer node Node=record ? ? ? next Info integer pointer a. 無(wú)環(huán) b. 有環(huán) 18 類型分析 變量標(biāo)識(shí)符和類型表達(dá)式的綁定 程序說(shuō)明部分建立計(jì)算環(huán)境 ,其中說(shuō)明了每個(gè)變量標(biāo)識(shí)符以及與之綁定的類型。類型檢查是在編譯時(shí)做的靜態(tài)類型檢查。S2 {:=IF (=void)AND(=void) THEN void ELSE type_error} 圖 檢查語(yǔ)句類型的翻譯模式 24 函數(shù)引用的類型檢查 對(duì)說(shuō)明部分的分析,應(yīng)該能知道被引用函數(shù) 的類型。 例 考慮把算術(shù)算符 op作用于常數(shù)和標(biāo)識(shí)符形成的表達(dá)式,假設(shè)運(yùn)算對(duì)象有整型和實(shí)型兩個(gè)類型 ,函數(shù) lookup(e)返回符號(hào)表中保存在 e條目中的類型。 cell=RECORD a,b:integer END。y:cell):pcell。E D→D。 29 修改圖 ,使之能夠處理: a) 語(yǔ)句有值。加上邏輯算符 and,or和not, 還有關(guān)系算符的產(chǎn)生式,然后給出適當(dāng) 的翻譯規(guī)則,計(jì)算出這些表達(dá)式的類型。 下面哪些表達(dá)式結(jié)構(gòu)等價(jià)?哪些名字等價(jià)? ( 1) Link ( 2) pointer(cell) ( 3) pointer(Link) ( 4) pointer(record(info?integer) ?(next ? pointer(cell))) 。