本文依舊來自記筆記相當勤快的七公尺八同學。向他表示真誠的感謝!
在前面的內容中,我們已經知道,想要解決二義文法的問題,必須新增附加條件。
例: e→e
+e|e
∗e|(
e)|i
注意一下下圖中的i0
,第一行式子是e′
→e,那個撇不一定能看得清
具體推導過程如圖:
此時可以推得構造表,但是此時是會有衝突的。我們只能強行規定優先順序,如,規定①∗⋖
+ ,②+、
∗ 都是右結合。
我們假設已經知道了r1
=e→e
∗e,s
4=e→
e∗e 。那麼對於已有在符號棧中e∗
e 規約出了s4
,此時符號棧就變成了e∗
e+e 。根據右結合性,先移進,後規約,因此st
ate=
7,ac
tion
=+,用s4
而不是r1
(注意此處少掉了構造表,需要加乙個構造表才能看懂這段)
例:
if(a
< b)
if(b < c)
expr();
else
expr();
if(a
< b)
if(b < c)
expr();
else
expr();
對於上面的現象,我們稱為else出現了懸空。這也是一種二義。
yet another compiler compiler使用者
指定文法
.y⇒y
acc
例:
int i, j;
屬性
{綜合屬
性繼承屬
性如e.
val由
e1.v
al和e
2.va
l共同決
定如in
t決定i
,i決定
j 只有綜合屬性構成的sd
d 就叫s-屬性定義(s−
attr
ibut
edef
init
ion )式子α
→語義分
析 加語義標註的語法分析樹
兩種方法,一種先構造生成樹後加標記,自下而上,從左而右進行屬性值計算。。一種語法分析和構造加語義標註的語法分析樹同時進行。例:3
∗5+4
n 再例:
龍書題目5.2.4
具體解答見圖:
編譯原理課一定要認真聽,不然真的進度太難補了,只能說多虧各路神仙扶一把。。。
編譯原理與編譯構造 由語言構造文法2
基本思想 產生的兩邊應該具有相同的特性 例1 l 解 s aa b b 這一步是說,句子可以以a b 開頭,之後加乙個a b 數量不等的式子 其中,s a b a a 1 b b a b 1 a aaa 這一步比較神,但是我的理解是這樣的,aa 這個表示式,滿足 a b 因此直接是在 a 之前加了乙...
編譯原理 文法與語言
作者注 這是一篇大學生寫的編譯原理系列,文章並非提供令人望而卻步的長篇論述,意在用簡單有趣的方式分享我所學到的knowledge。至於你所感興趣的深層論述這裡盡可能會給你提供一些簡單的連線供你使用。這裡我要十分感謝我的周老師,我的編譯原理知識,她無疑是最大的貢獻者。二 語法樹與二義性 1.1 如何理...
編譯原理 文法及其二義性(判定及消除)
學編譯原理時,會學到文法,老師在介紹完文法的相關定義後又介紹了文法的二義性,但是沒說到底是如何避免文法的二義性的。這篇博文就是我的學習結果 文法的二義性 如果文法g中的某個句子存在不只一棵語法樹,則稱該句子是二義性的。如果文法含有二義性的句子,則稱該文法是二義性的。我舉個例子,來說明文法的二義性及其...