一、學習內容
本章我們主要學習以自下而上的方法進行語法分析,首先需要了解移進和規約的基本思想,即用乙個寄存符號的先進後出棧,把輸入符號乙個乙個地移進到棧裡,當棧頂形成某個產生式的候選式時,即把棧頂的這一部分替換成(歸約為)該產生式的左部符號。規範規約是假定a是文法g的乙個句子,我們稱序列an,an-1,¼ ,a0是a的乙個規範歸約,實際上規範歸約相當於最右推導的逆過程,由規範推導推出的句型稱為規範句型。然後我們學習了用符號棧進行自下而上的語法分析,在分析開始時,將「#」預先進棧,作為棧底符號,同時將「#」作為輸入串的結束符,自左向右對輸入串ω不斷向棧中進行移進——歸約。再往下我們了解到算符優先分析法,定義算符之間優先關係,借助這種關係來尋找「可歸約串」和進行歸約,此時就需要定義兩個終結符『a』與『b』的優先關係:a =.b表示a的優先性等於b;a .>b表示a的優先性大於b;a <.b>」「<.>」「. q2,則f(q1) > g(q2),f稱為入棧優先函式,g稱為比較優先函式,但是許多優先關係表不存在優先函式。
接著我們學習了第三節lr分析法,lr分析方法也是一種自下而上的分析方法,lr分析法的歸約過程是規範推導的逆過程,所以lr分析過程是一種規範歸約過程,它用到了兩個表:動作表(action[s,a]: 當狀態s面臨輸入符號a時,應採取什麼動作)和狀態轉換表(goto[s,x]:狀態s面對文法符號x時,下一狀態是什麼)。構造lr分析表我們需要了解活字首的概念:文法g的活字首是他的規範句型的字首,該字首不超過控制代碼的右端。該字首加上被分析串中未被分析的終結符,就可以構成乙個規範句型,只要輸入串的已掃瞄部分可歸約成乙個活字首,意味著掃瞄過的部分沒有錯誤。lr分析表的構造要構造識別活字首的有限自動機,用有限自動機中的狀態表示分析表中的狀態,用狀態圖中的狀態之間的轉換關係對分析表中的action和goto函式等進行定義。我們把右部某位置上標有圓點的產生式稱為相應文法的乙個lr(0)專案,特別對形如a→ε的產生式,a→·。本章乙個重要內容構造識別活字首的nfa:首先構造文法的所有產生式的專案,每個專案都為nfa的乙個狀態;其次確定初態、控制代碼識別態、句子識別態以及狀態之間的轉換關係。同樣重要的lr(0)專案集規範族構造:首先構造g的拓廣文法g』,設s為文法g的開始符號,構造乙個文法g』,它包含整個文法g,並且引進了乙個不出現在g中的非終結符s¢,並加進乙個新產生式s¢→s,這個s¢是g¢的開始符號,g』成為g的拓廣文法;其次構造i的閉包closure(i);最後設定轉換函式。需要注意乙個專案集可能包含多種專案,則會產生移進-歸約衝突和歸約-歸約衝突,若其lr(0)專案集規範族不存在這兩種衝突,稱為lr(0)文法。大多數程式語言的文法不能滿足lr(0)文法的條件,即其規範族中會有含有衝突的專案集(狀態),我們通過對於有衝突的狀態,向前檢視乙個符號,以確定採用的動作來解決這個問題。
二、知識運用
1.短語的判斷(兩個條件)
令g是乙個文法,s是文法的開始符號,假定abd是文法g的乙個句型,其中α,β,d∈(vn∪vt)*,a∈vn ,如果有①s*=>αad且②a+=>β則b稱是句型abd相對於非終結符a的短語。
2.終結符之間的優先關係
(1)a =. b 當且僅當文法g中含有形如p→…ab…或p→…aqb…的產生式;
(2)a <. b>b…或r=>qb…;
(3)a.>b 當且僅當g中含有形如p→…rb…的產生式,而 r=>…a或r=>…aq。
3.構造算符優先關係表
(1)通過檢查產生式的每乙個候選式可以找出滿足a=.b(即p→…ab…或p→…aqb…的產生式);
(2)為了滿足<.>,需對g中每個非終結符p構造兩個集合firstvt(p)和lastvt(p);
(3)構造集合firstvt(p)的演算法,按其定義,可用下面兩條規則來構造集合firstvt(p):
①若有產生式p→a…或p→qa…,則aîfirstvt(p)
②若aîfirstvt(q),且有產生式p→q…,則aîfirstvt(p)
(4)同理構造集合lastvt(p)的演算法,按其定義,可用下面兩條規則來構造集合lastvt(p):
① 若有產生式p→… a或p→… aq ,則aî lastvt(p)
② 若aî lastvt(q),且有產生式p→… q ,則aî lastvt(p)
(5)有了這兩個集合之後,就可以通過檢查每個產生式的候選式確定滿足關係<.>的所有終結符對:
①假定有個產生式的乙個候選形為…ap…那麼,對任何bîfirstvt(p),有a <. b>
②假定有個產生式的乙個候選形為…pb…那麼,對任何aîlastvt(p),有a >. b
4.優先表構造優先函式
(1)對於每個終結符a,令其對應兩個符號fa和ga,畫一張以所有符號fa和ga為結點的方向圖:
①如果a>.b,則從fa畫一條弧至gb
②如果a<.b>
(2)對每個結點都賦予乙個數,此數等於從該結點出發所能到達的結點(包括出發點自身):賦給fa的數作為f(a),賦給ga的數作為g(a)
(3)檢查所構造出來的函式f和g是否與原來的關係矛盾,若沒有矛盾,則f和g就是要求的優先函式,若有矛盾,則不存在優先函式。
5. lr(0)分析表的action和goto表的構造步驟
(1)若專案a→a•ab屬於ik,且轉換函式go(ik,a)=ij,當a為終結符時 ,則置action[k,a]為sj;
(2)若專案a→a•屬於ik,則對a為任何終結符或「#」,置action[k,a]=rj, j為產生式在文法g′中的編號;
(3)若go(ik,a)=ij,則置goto[k,a]=j,其中a為非終結符,j為某一狀態號;
(4)若專案s′→s•屬於ik,則置action[k,#]= acc;
(5)其它填上「報錯標誌」。
以下為具體習題:
三、我的感受
第五章難度較之前幾章有所提公升,前面部分例如短語的判斷、終結符之間優先關係的判斷、算符優先關係表以及優先函式等知識相對簡單,這裡通過習題的鍛鍊基本可以較為熟練的掌握。後面部分構造識別文法所有活字首的nfa方法難度不是很大但是比較繁雜,確定狀態之間轉換關係時容易粗心出錯,狀態圖往往比較雜亂不易完全正確。而對於lr(0)專案集規範族構造,在閉包的處理過程中需要多加留心。最後利用slr解決構造的lr(0)專案集規範族衝突理解起來有點困難,這部分需要我將課本知識反覆琢磨,在習題方面也將放更多的精力,爭取做到學會、學熟、學精。
第五章語法分析 自下而上分析
一 知識點總結 自下而上分析法是從輸入串開始,逐步進行 規約 直至規約到文法的開始符號 或者說,從語法樹的末端開始,步步向上 規約 直至根結。歸約 1 短語 令g是乙個文法,s是文法的開始符號,假定 是文法g的乙個句型,如果有s a 且s 則稱 是句型 相對於非終結符的短語。2 直接短語 特別是,如...
第五章 語法分析 自下而上分析
1.總結 語法分析的過程分兩種,自上而下的推導 自下而上的規約,本章學習的內容為後者。自下而上分析法是一種 移進 規約 法,這種方法的基本思想是,用乙個寄存符號的先進後出棧,把輸入符號乙個乙個地移進到棧裡,當棧頂形成某個產生式的候選式時,即把棧頂的這一部分替換成 歸約為 該產生式的左部符號。而規約是...
編譯原理 第五章 自下而上分析
一.移進規約 1.基本思想 用乙個寄存符號的先進後出棧,把輸入符號乙個乙個地移進到棧裡,當棧頂形成某個產生式的候選式時,即把棧頂的這一部分替 換成 歸約為 該產生式的左部符號。2.規約 是指根據文法的產生式規則,把產生式的右部替換成左部符號。二.規範規約 1 短語 定義 令g是乙個文法,s是文法的開...