語義分析一般是和語法分析組合在一起執行的,語法分析完成前一步語法樹分析的構建(呼叫某個產生式完成一步規約,形成當前的樹節點),然後語義分析便接著呼叫相應產生式配備的語義動作或子程式,完成屬性文法所要求的語義動作(比如型別轉換或生成中間**)。所以對於屬性文法而言,屬性的加工和使用過程便是語義處理的意義。
乙個屬性文法是乙個三元組,a=(g,v,f),乙個上下文無關文法g;乙個屬性的有窮集v和關於屬性的謂詞函式的有窮集f。每個斷言與文法的某產生式相聯。如果對g中的某一輸入串而言(句子),a中的所有斷言對該輸入串的語法樹結點的屬性全為真,則該串也是a語言中的句子,如下便是乙個關於屬性文法的例子
由於產生式**現2個t,加以區別右邊t用t1,t2來代替e→t1+t2 //謂詞,要求若是符合該產生式,則進行相加的兩元素必須都是整型
e→t1ort2
t→num //屬性加工,宣告該變數為整型,該識別符號資料型別屬性被賦值為「整型」
t→true
t→false
稱t為t的一屬性。則這帶有屬性的方法稱為屬性文法
對於產生式a->α都有一套與這相關聯的語義規則,每隊規則的形式b:=f(c1,c2,…)綜合屬性(1)如果b是a的乙個屬性,c1,c2…為右部產生式文法符號的屬性或則a的其它屬性,則稱b為a的綜合屬性。
(2)如果b是右部產生式文法符號x的屬性a的乙個屬性,c1,c2…為a或產生式右邊任務文法符號的屬性,則稱b為x的繼承屬性。 注意:
非終結符既可以有綜合屬性也可以有繼承屬性,文法開始符號沒有繼承屬性。
終結符只有綜合屬性,它由詞法分析器提供
產生式語義規則
l->e
print(e.val)
e->e1 + t
e.val = e1.val + t.val
e->t
e.val = t.val
t->t1 * f
t.val = t1.val * f.val
t->f
t.val = f.val
f->(e)
f.val = e.val
f-> digit
f.val = digit.lexval
繼承屬性
產生式語義規則
d->tl
l.in=t.type
t->int
t.type = integer
l->l1,id
addtype(id.entry,l.in)
l1.in = l.in
l-> id
addtype(id.entry,l.in)
計算語義規則在屬性文法的基礎上進行處理的。例有屬性文法:
產生式語義規則
d->tl
l.in=t.type
t->int
t.type = integer
l->l1,id
addtype(id.entry,l.in)
l1.in = l.in
l-> id
addtype(id.entry,l.in)
當輸入字串為「int id1, id2, id3」 時
(1)構造語法樹
(2)結合文法屬於構造依賴圖
從「依賴圖」中,我們可以得到主義規則的計算順序。用這個順序來計算語義規則就能得到輸入符號串的翻譯。
注意: 從「依賴圖」中發現迴圈依賴關係,那此文法將不能計算。
屬性文法的翻譯分為遍歷樹的和一遍掃瞄的.
s-屬性文法和自下而上翻譯
s-屬性文法是只含有綜合屬性的,例有屬性文法:
產生式語義規則
l->e
print(e.val)
e->e1 + t
e.val = e1.val + t.val
e->t
e.val = t.val
t->t1 * f
t.val = t1.val * f.val
t->f
t.val = f.val
f->(e)
f.val = e.val
f-> digit
f.val = digit.lexval
當輸入字串為「2+3*5」 時
(1)lr分析表構造《自底向上語法分析lr(1)》這裡簡單的用語法樹代替
(2)分析步驟
步驟語義棧
符號棧輸入符串動作1
-#2+3*5#2--
#2+3*5#3-2
#f1+3*5#
f1-> 24-2
#t2+3*5#
t2-> f15-2
#e1+3*5#
e1->t2
6-2-
#e1+
3*57
-2--
#e1+3
*5#8
-2-3
#e1+f2
* 5#
f2->3
9-2-3
#e1+t1
* 5#
t1->f2
10-2-3-
#e1+t1*
5#11
-2-3--
#e1+t1*5#12
-2-3-5
#e1+t1*f
#f->5
13-2-15
#e1+t
#t->t1*f
14-17#e#
e->e1+t
15acc
l-屬性文法和自上而下翻譯
對每個產生式a->x1x2…xn,其每個語義規則中的每個屬性或者綜合屬性或者xj(1<=j<=n)的乙個繼承屬性僅依賴於
產生式xj在左邊符號x1,x2…xj-1
a的繼承屬性
s-屬性文法一定是l-屬性文法,因為1,2的限定只針對繼承屬性。
帶有屬性的左遞迴消除方式
假設文法為例:給定屬性文法g[e]a->a1y
a->x
其中g,f是任意函式
文法轉換為
a->xr
r->yr|ε
再加上語義動作,引入r的繼承屬性i和屬合屬性s
a-> x r
r->y r1
r->ε
產生式語義規則
e-> e addop t
print(addop.lexeme)
e-> t
t -> num
print(num.val)
注:其中addop表示+或者-
因為要使用自上而下,引進ll(1)演算法,由於左遞迴的關係,改寫文法為
產生式e-> er
r -> addop t r1
r -> ε
t -> num
當輸入字串為「2+3-5」 時
(1)ll分析表構造《自頂向下語法分析ll>>這裡簡單的用語法樹代替
(2)分析步驟
(略)l-屬性文法和自下而上翻譯
自上而下的計算繼續屬性有2種方法:
去掉嵌入在產生式中間的動作
例如文法g[e]用綜合屬性代替繼承屬性e->tr
r->+t r1
r->-t r1
r->ε
t->num
引入m和n,將原嵌入在產生式中間的動作都放到產生式後面
e->tr
r->+t m r1
r->-t n r1
r->ε
t->num
m->ε
n->ε
例如文法g[d]d->l:t
t->integer | char
l->l,id|id
重新構造文法,藉以實現綜合屬性代替繼承屬性
d->id l
l -> ,id l|:t
t->integer | char
語義分析之一 屬性文法
編譯原理的幾個核心階段 詞法分析 語法分析和語義分析,其實編譯的本質便是翻譯,其各個階段便是承擔不同的翻譯任務,詞法分析階段的任務是將程式輸入的字串流翻譯成語言認可的字元流 剔除空格和注釋等部分 語法分析便是將程式按照語言文法的規則構建成語法樹 語義分析便是在語法樹構建的基礎上完成語言規則的語義動作...
編譯語義分析實驗
單詞的種別編碼方案 單詞符號 種別編碼 單詞符號 種別編碼 單詞符號 種別編碼 begin 1 13 23 if 2 14 24 then 3 15 25 while 4 16 26 do 5 17 29 l l d 10 0dd 11 21 演算法思想 1 設定語義過程。1 emit char r...
潛在語義分析LSA
lsa和傳統向量空間模型 vector space model 一樣使用向量來表示詞 terms 和文件 documents 並通過向量間的關係 如夾角 來判斷詞及文件間的關係 不同的是,lsa 將詞和文件對映到潛在語義空間,從而去除了原始向量空間中的一些 噪音 提高了資訊檢索的精確度。1 一詞多義...