1. 程式人生 > >編譯原理 第五章 語法分析----自下而上分析

編譯原理 第五章 語法分析----自下而上分析

一、知識總結       

       自下而上分析是從輸入串開始,逐步進行規約,直至規約到文法的開始符號,就是一種“移進-規約”法。自上而下分析的中心問題是怎樣判斷棧訂單符號串的可歸約性以及如何規約。解決方案是規範規約。所謂規範規約就是每一步都把控制代碼換成它對應的產生式的左部符號,控制代碼就是最左直接短語,此處涉及短語和直接短語的概念。對於規範規約,我個人的理解是:句子中相對最左的可以組成某個產生式右部的一個或多個符號就是最左直接短語,而把它們用相應產生式的左部替換的過程就是規範規約。規範規約可以用符號棧和語法樹來表示,用符號棧:有四類操作:移進、規約、接受和出錯處理,任何可規約串必出現在棧頂,即當發現棧頂呈現控制代碼時就用相應產生式的左部符號進行替換。接著,又產生了進一步的問題:如何尋找控制代碼(尋找控制代碼的演算法)。接著引入LR分析法。

       LR方法的基本思想是在規範規約的過程中,記住已移進和規約出的整個符號串,並根據所用產生式推測未來可能碰到的輸入符號,然後根據輸入符號來確定棧頂的符號串是否構成相對某一產生式的控制代碼。LR分析器的實質是一個帶先進後出棧的確定有限狀態自動機,它的每一步工作都是由棧頂狀態和現行輸入符號所唯一決定的。LR分析器的核心部分是一張分析表,一是動作(ACTION)表,另一是狀態轉換(GOTO)表,它們都是二維陣列。LR分析器的工作過程可看成是棧裡的狀態序列、已規約串和輸入串所構成的三元式的變化過程。LR文法是一個能夠構造一張分析表,使得它的每個入口均是唯一確定的文法。

       涉及四種不同分析表的構造方法,首先是LR(0)表構造法。最多向前看K個的符號就可以決定動作的LR分析器所分析的文法成為LR(k)文法。LR(0)是一種只概括“歷史”資料而不包含推測性“展望”材料的“狀態”。涉及字首和活字首的概念。LR分析表的構造需要構造識別活字首的有限自動機,用有限自動機中的狀態表示分析表中的狀態,用狀態圖中的狀態之間的轉換關係對分析表中的action goto函式等進行定義。構成識別一個文法活字首的DFA專案集(狀態)的全體稱為這個文法的LR(0)專案集規範族。第二種是SLR表構造法,規範族中會有含有衝突的專案集,向前檢視一個符號,以確定採用的動作。第三種是規範LR表構造法,仍有許多文法構造的LR(0)專案集規範族存在的動作衝突不能用SLR(1)方法解決。最後一種是LALR分析表。

       算符優先分析法是一種簡單直觀、廣為使用的自下而上分析法,它不是一種規範規約法。算符優先分析就是定義算符之間的某種優先關係,藉助於這種優先關係尋找可規約串和進行規約。其中涉及算符文法和算符優先文法的概念。從算符優先文法構造優先關係表,首先需要對文法的每個非終結符構造兩個集合FIRSTVT和LASTVT,其中涉及對兩個集合的理解。在實際實現算符優先分析演算法時,一般採用優先函式,入棧優先函式和比較優先函式。這種方法的優點是節省儲存空間,缺點是可能會導致輸入串的錯誤。如果存在優先函式,就可以利用優先表構造優先函式,構造優先函式有三部。算符優先分析有兩種情況會出現語法錯誤,用進行出錯處理。   

二、課後題

三、感想

        感覺這一章特別難,花了好長時間,讀了好幾遍才真正理解短語的概念,各種概念感覺很難理解。雖然整個章節的大體概況已經理解,但是細節知識點很難,想不通。