編譯原理系列 算術表示式與陣列元素翻譯

2021-10-17 09:52:05 字數 2290 閱讀 8918

簡單算術表示式和賦值句,是指表示式和賦值句中變數是不可再分的簡單變數

過程emit(result 『:=』 arg1 『op』 arg2):生成「result:= arg1 op arg2」的三位址碼

產生式:					語義規則:

(1) a→id:=e

(2) e→e1+e2

(3) e→e1*e2

(4) e→-e1

(5) e→(e1)

(6) e→id

強制(coercion):按照一定的原則,將不同型別的變數在內部轉換為相同的型別,然後進行同型別變數的計算

1. a->id:=e

2. e→e1 op e2

確定對映方式的兩種方法:

三個假設條件:

約定:n 維陣列元素的位址計算

addr(a[i1,i2,...,in])

=a+((i1-1)*d2*d3*...*dn+(i2-1)*d3*d4*...*dn+...+ (in-1))*w

=a-(d2*d3*...*dn+d3*d4*...*dn+...+dn+1)*w

+(i1*d2*d3*...*dn+i2*d3*d4*...*dn+...+in-1*dn+in)*w

=a–c*w+v*w

根據假設條件③w=1: addr(a[i1,i2,...,in])=a–c+v

其中:c = d2*d3*d4...*dn+d3*d4*d5...*dn+*d4*d5*d6...*dn...+dn+1

= (d2+1)*d3*...*dn+d4*d5...*dn+...+dn+1

=((d2+1)*d3+1)*d4*d5...*dn+...+dn+1

......

= (...((d2+1)*d3+1)*d4...+1)*dn+1

同理:v = (...((i1*d2+i2)*d3+i3)*d4...+in-1)*dn+in

令: v1 = i1

則: v2 = i1*d2+i2 = v1*d2+i2

v3 = (v1*d2+i2)*d3+i3 = v2*d3+i3

......

於是有: v1 = i1

vj = v*dj+ij (j=2,3,..., n) (4.4)

同理可得:c1 = 1

cj = c*dj+1 (j=2,3,..., n)

addr(a[i1,i2,...,in])=a-c+v=conspart+varpart

注意:如果w≠1,則c和v分別需要乘乙個w,即:

addr(a[i1,i2,...,in])=a-cw+vw=conspart+varpart

注意這裡計算的時候,最後i

ni_n

in​也要減一;同時如果所求的不是起始位址,而是儲存位址的時候,則要求寫範圍,即起始位址-起始位址+w-1

陣列元素的定址:

a → v := e

v → id | id[el]

el→ e | el ,e

e → e + e | ( e ) | v

修改文法以適應遞推公式的同步計算,知道名字的時候知道這是乙個陣列名而不是變數名:

a → v := e (1)

v → id (2)

| el ] (3)

el→ id [ e (4)

| el , e (5)

e → e + e (6)

| ( e ) (7)

| v (8)

屬性.dim:陣列維數計數器,記錄當前分析到的維數

屬性.place:

屬性.offset:儲存陣列元素的可變部分(簡單變數的offset為空,可記為null)

函式limit(array, k):計算並返回陣列array中第k維成員個數dk

(1) a→v:=e 

(2) v→id

(3) v→el]

(4) el→id[e

(5) el→el1,e

(6) e→e1+e2

(7) e→(e1)

(8) e→v

1 2變數與算術表示式

程式使用 5 9 32 列印下列華氏溫度和攝氏溫度對照表 1 1720 640460 24300 148 include 當fahr 0,20,300時,分別列印華氏溫度和攝氏溫度對照表 收穫 在c語言的學習中,c中的變數必須都先宣告後使用,生命通常放在函式起始處,在任何可執行的語句之前。宣告是用於...

編譯原理之消除算術表示式文法的左遞迴

現在給定如下算術表示式文法 expr expr term expr term term term term factor term factor factor factor expr number id很明顯,上訴文法中,expr和term都有左遞迴。為了消除上訴文法的左遞迴,可以將插入新的非終結符...

C 算術運算子與算術表示式

在本章中主要介紹算術運算子與算術表示式,賦值運算子與賦值表示式,逗號運算子與逗號表示式,其他運算子將在以後各章中陸續介紹。常見算數運算子 運算子說明舉例 加法運算子,或正值運算子 3 5,3 減法運算子,或負值運算子 5 2,3 乘法運算子 3 5 除法運算子 5 3 模運算子,或稱求餘運算子 兩側...