將輸入符號串w不斷歸約成文法開始符s採用:最左歸約(反向構造最右推導)
通用框架為:移入-歸約分析(shift-reduce parsing)
輸入符號不斷移入棧
直到構成某產生式右部 --(出棧) --> 歸約成產生式左部(再入棧),同時構造語法樹
控制代碼:每次歸約出來的符號串 (當前句型的最右直接短語)
l :left-scaning, r:反向構造最右推導序列
分析過程基本有三大步:
寫出自動機(即 lr(0)或 lr(1)項集族,後面都稱作自動機) -> 構造文法分析表-> 進行文法分析過程。
其中後兩步都是類似或者說幾乎完全一樣的,第一步中的自動機有兩種: lr(0)自動機和 lr(1)自動機。lr(0) 和 slr文法分析用的是 lr(0)自動機,lr(1)和 lalr文法分析用的是 lr(1)自動機。而lr(1)自動機構造方法和lr(0)自動機的構造方法相同,只是多增加了向前搜尋符號。
控制代碼的識別進度(是否該歸約)
移入狀態:s -> .bbb
待約狀態:s -> b.bb
歸約狀態:s -> bbb.
由此構造自動機,來識別控制代碼
加入乙個狀態棧:乙個符號乙個狀態,剛歸約出來的vn通過goto表找到對應的狀態
產生式每個狀態代表乙個專案:假設產生式右部有k個符號,則對應k+1個專案
(ε-產生式只有乙個專案a -> .
)
專案集閉包(closure of item sets):
所有等價專案的集合(對應自動機的乙個狀態)
所謂等價專案,就是當前狀態為等待某一非終結符vn,比如: s -> .a
而a有產生式 a -> abc, 則專案 s -> .a 等價於 a -> .abc
文法 -> 文法轉換圖 -> 轉換表
closure(): 找等價專案
goto():文法符合(非終結符)a的後繼專案集閉包(即closure(a))
移入/歸約衝突
歸約/歸約衝突(如何正確識別控制代碼)
s: ******(僅通過follow集化解衝突)
l:left-scaning
r: 最右推導
省略(1):向前檢視一步
若是控制代碼:歸約,否則採取 移入 動作
LR 語法分析器
lr語法分析器算是基本完成了,只需要乙個文法定義檔案 syntax 就可以進行對應語言的語法分析,最後形成語法樹。詞法分析是固定的,採用c 的詞法定義。以後將加入動態的詞法分析。壓縮包中檔案的描述 lrtable.exe 是用文法定義檔案 syntax檔案 生成lr動作表檔案 action檔案 使用...
LR語法分析 LR(0) SLR(1)
概述 lr 分析法是一種自下而上進行規範歸約的語法分析法,l指從左到右掃瞄輸入符號串,r是指構造最右推導的逆過程。對大多數無二義性上下文無關文法描述的語言都可用它進行有效的分析。主要分析器有lr 0 slr 1 lr 1 lalr 1 lr 0 在分析的每一步,只需根據當前棧頂狀態而不必向前檢視輸入...
LR語法分析器程式設計
include include include include struct code val const char p const char tnt i etf lr分析表列的字元 const int m 9 0表示出錯,s4用4表示。acc用99表示 r2用 2表示 int col char 列...