自上而下分析法就是從輸入串開始,逐步進行規約,直至規約到文法的開始符號。
第一部分是自下而上分析的基本問題:移進規約,規範規約和符號棧。移進規約的基本思想是用乙個寄存符號的先進後出棧把輸入符號乙個乙個移進棧裡,當棧頂形成某個產生式的候選式時,規約為產生是的右部符號。規範規約是依次使用控制代碼替換產生式的左部,它是最右推導
的逆過程。
第二部分是算符有限分析法。基本思想是定義算符之間的優先順序,借助優先順序來尋找「可規約串」進行規約,具體是通過算符優先文法和優先表的構造來實現的。算符優先文法定義是這樣的乙個算符文法g
的任何終結符對(
a,b)至多滿足
a=.b a>.b a<.b>
中的乙個就是
opg文法。構造算符優先關係關係表的過程:
1通過檢查產生式的每乙個候選式可以找出滿足
a=.b2
滿足<.>
.,需對g
中每個非終結符
p構造兩個集合
firstvt(p)
和lastvt(p):3
通過檢查每個產生式的候選式確定滿足關係
<.>
.的所有終結符對。優先函式的構造過程:
1對於每個終結符
a,令其對應兩個符號fa和
ga,畫一張以所有符號fa和
ga為結點的方向圖。如果
a>.b
,則從fa
畫一條弧至
gb,如果
a<.b>
,則從gb
畫一條弧至
fa 。
2對每個結點都賦予乙個數,此數等於從該結點出發所能到達的結點
(包括出發點自身)。
3檢查所構造出來的函式f和
g是否與原來的關係矛盾。若沒有矛盾,則f和
g就是要求的優先函式,若有矛盾,則不存在優先函式。
第三部分lr分析法。在自上而下的分析法中我們學習的是
ll(1)
,而自下而上分析法對應的是
lr分析法。
lr分析法的歸約過程是規範推導的逆過程,一種規範歸約過程,根據規約過程輸入字元的個數,定義
lr(0)
、lr(1)
分析法。下圖是關於二者的比較:
lr分析法的分析器結構如下:
lr分析器的核心是一張分析表,它由兩個子表組成
: 其一是分析動作表
;另乙個為狀態轉移表。其中
: sn
為分析器的各個狀態
;al為文法的全部終結符號和句子界符
;xp為文法字彙表中的全部文法符號。分析動作表中的每乙個元素
action[sm,ai]
指明,當棧頂狀態為
sm且正掃視的輸入符號為
ai時要完成的分析動作。狀態轉移表中的元素
goto[sm,xi]
則指明,當向分析棧中移進乙個輸入符號或按某一產生式進行歸約之後所要轉移到的下一狀態
。lr分析過程是分三步進行(具體步驟參考課本)。
lr分析表的構造需要構造識別活字首的有限自動機,用有限自動機中的狀態表示分析表中的狀態
,用狀態圖中的狀態之間的轉換關係對分析表中的
action goto
函式等進行定義。
lr(0)構造的
dfa,但是由lr(
0)的dfa來構造分析表往往是不可行的,也就是說很少有語言是
lr(0)
的。如果lr(0)的衝突可以根據當前輸入的字元來解決,則構造的分析表為
slr分析表,
slr分析表跟
lr(0)
的dfa
是相同的。
lr(1)
構造的dfa
考慮當前輸入的字元,所以構造的
dfa中存在的衝突比較少,也就是說它接受的語言就比較多。構造分析表時,不用額外的約束,因為它在構造
dfa時就已經考慮了當前的輸入字元。考慮到
lr(1)
的dfa
包含的狀態太多,而且許多狀態的不同僅僅是因為**符的不同而已。通過合併不會產生衝突的狀態,可以減少
dfa的狀態數,這就產生了
lalr
分析法。所以說
lalr
分析法只是對
lr(1)
的一種簡化:通過合併同心集。
(這一段是我看到的一段小結,感覺說的好像挺有道理)
三·總結
關於這章的學習明顯感覺要比之前自上而下的分析要難要複雜,知識點零碎且雜、內容也相對較多,尤其是lr文法那部分,分析表的構造演算法,一些閉包的處理上相對來說學習難度還是挺大的,需要理論結合實踐,結合課件上的例題多分析總結。
編譯原理第五章語法分析 自下而上分析內容總結
一 學習內容 本章我們主要學習以自下而上的方法進行語法分析,首先需要了解移進和規約的基本思想,即用乙個寄存符號的先進後出棧,把輸入符號乙個乙個地移進到棧裡,當棧頂形成某個產生式的候選式時,即把棧頂的這一部分替換成 歸約為 該產生式的左部符號。規範規約是假定a是文法g的乙個句子,我們稱序列an,an ...
第五章語法分析 自下而上分析
一 知識點總結 自下而上分析法是從輸入串開始,逐步進行 規約 直至規約到文法的開始符號 或者說,從語法樹的末端開始,步步向上 規約 直至根結。歸約 1 短語 令g是乙個文法,s是文法的開始符號,假定 是文法g的乙個句型,如果有s a 且s 則稱 是句型 相對於非終結符的短語。2 直接短語 特別是,如...
第五章 語法分析 自下而上分析
1.總結 語法分析的過程分兩種,自上而下的推導 自下而上的規約,本章學習的內容為後者。自下而上分析法是一種 移進 規約 法,這種方法的基本思想是,用乙個寄存符號的先進後出棧,把輸入符號乙個乙個地移進到棧裡,當棧頂形成某個產生式的候選式時,即把棧頂的這一部分替換成 歸約為 該產生式的左部符號。而規約是...