編譯原理 手寫編譯器 1 LR分析法

2022-03-09 18:47:54 字數 1349 閱讀 9740

完整的專案請參考:

lr(k)分析法(lr(k) parsing):是乙個有效的自底向上分析技術,它適用於一大類上下文無關文法的語法分析.其中:l指的是從左向右掃瞄輸入字串,r指的是構造最右推導的逆過程,k

指的是決定分析動作時需要向前看的符號個數.

lr分析法有如下優點:

1.lr分析器能識別所有可用上下文無關文法描述的程式語言的結構.

2.lr分析法是已知的最一般的無回溯移進-歸約分析法,而且可以和其他移進-歸約分析法一樣有效地實現.

3.lr分析法分析的文法包含**分析法所能分析的文法類.

4.在自左向右掃瞄輸入時,lr分析器能及時察覺語法錯誤.

缺點有:

對典型的程式語言文法,手工構造lr分析器的工作量太大.有專門的工具--yacc

lr分析器的基本原理:

將控制代碼(某個產生式的右部)的識別過程劃分為若干個狀態,分析器根據當前的狀態確定是否找到了控制代碼,如果找到控制代碼則按照相應的產生式進行歸約,並進入下乙個狀態,如果未找到控制代碼,則移進輸入符號,也進入下乙個狀態.如:

s->abc  //為乙個產生式

則該識別的過程可分為: (1).abc (2)a.bc (3)ab.c (4)abc.四個狀態.只有在狀態四的時候才真正的找到了控制代碼,則對他進行歸約.其它的三個狀態都是處於等待歸約狀態,但每個的等待程度不一樣!

在每個狀態下,分析器從左向右地掃瞄輸入串並識別出控制代碼符號,也就是說,狀態是控制代碼識別程度的描述,每個狀態識別控制代碼的一部分.乙個長度為n的控制代碼的識別需要n+1個狀態,識別控制代碼尾的狀態稱為控制代碼識別態.由移進-歸約分析的基本原理可知,每個狀態所識別的控制代碼的那一部分符號正好是當前句型(規範句型)的乙個字首,這個字首不含相應句型的控制代碼右部的任何符號,將其稱為規範句型的活字首(viable prefix),於是.對控制代碼的識別就轉換成了對規範句型活字首的識別.

如上例中的控制代碼'abc'.其中四個狀態分別是控制代碼識別程度的描述.對於狀態(1),他識別控制代碼的符號a並等待符號b的移入,此時符號a就是乙個活字首.同理,其他狀態也能用相同的方法描述.

乙個文法的規範句型的所有活字首構成乙個語言,而且該語言是正則的,可以用乙個dfa識別,lr分析器正式利用有窮狀態自動機來識別文法所有規範句型的活字首的,並利用乙個棧存放識別出來的句型的活字首部分和相應的狀態.

注意:要描述上面所說的狀態機,我們可以借助乙個矩陣實現.更一般地就是兩個二維陣列action和goto.這兩個表統稱為lr分析表.該錶給出每個狀態下應採取的動作(移進,歸約,接受或則報錯)以及要轉向的下乙個狀態.

以上就是lr分析法的一點基本原理,接下來的事就是如何構造分析表的問題.由於lr分析器的工作過程是通用的

編譯原理(六)自底向上分析之LR分析法

1.lr分析 從左到右掃瞄 l 自底向上進行規約 r 是規範規約,也即最右推導 規範推導 是自底向上分析方法的高度概括和集中。2.lr k 文法確定的分析器適用於一大類上下文無關文法的語法分析,基本上包括了所有無二義性的上下文無關文法的集合,包括了前面討論的ll k 和算符優先文法。3.優缺點 4....

編譯原理 算符優先分析法

一 算符文法的定義 二 定義任意兩個終結符號之間的優先關係 解釋 1 ab兩個可以同時規約,故優先順序相等 2 將r的推導式代入p的產生式中,最終也會形成如 1 中一樣的p的產生式的形式,但此時需要對b先進行規約,再規約a,故a的優先順序小於b的優先順序 3 同理可得,b的優先順序小於a的優先順序 ...

編譯原理 十 SLR文法分析法 演算法原理

因為slr文法分析法就是對lr 0 的一種優化,它提供了一種解決衝突的方法,所以很多之前在lr 0 提及的東西,在此只提供乙個引用。lr 0 文法分析法 slr文法構造分析表的主要思想是 許多衝突性的動作都可能通過考察有關非終結符的follow集而獲解決。解決衝突的方法 解決衝突的方法是分析所有含a...