簡單算術表示式和賦值句,是指表示式和賦值句中變數是不可再分的簡單變數
過程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 模運算子,或稱求餘運算子 兩側...