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

2021-08-20 03:46:07 字數 3058 閱讀 7048

一.移進規約

1.基本思想

用乙個寄存符號的先進後出棧,把輸入符號乙個乙個地移進到棧裡,當棧頂形成某個產生式的候選式時,即把棧頂的這一部分替

換成(歸約為)該產生式的左部符號。

2.規約

是指根據文法的產生式規則,把產生式的右部替換成左部符號。

二.規範規約

1)短語:

定義:令g是乙個文法,s是文法的開始符號,假定abd是文法g的乙個句型其中α,β,d∈(vn∪vt)*,a∈vn ,如果有

則b稱是句型abd相對於非終結符a的短語。

2)直接短語

特別是,如果有aþb,則稱b是句型abd相對於規則a® b的直接短語。

3)控制代碼

乙個句型的最左直接短語稱為該句型的控制代碼。

定義:假定a是文法g的乙個句子,我們稱序列

an, an-1,¼ ,a0

是a的乙個規範歸約,如果此序列滿足:

(1)  an= a

(2)  a0為文法的開始符號,即a0=s

(3)  對任何i,0 < i £ n, ai-1是從ai經把控制代碼替換成為相應產生式左部符號而得到的。

三.修建語法樹

(1)子樹:是由該樹的某個結點(子樹的根)連同它的所有子孫組成。

(2)簡單子樹:只有單層分支的子樹(只有父子兩代沒有第三代)

(3) 對語法樹有如下結論

①每個句型都有一棵語法樹與之對應

②每棵語法樹的葉結點自左至右排列就組成乙個句型

③每棵子樹的葉結點自左至右排列就組成乙個短語

④每棵簡單子樹的葉結點自左至右排列就組成乙個直接短語

⑤每棵最左簡單子樹的葉結點自左至右排列就組成乙個控制代碼

四.演算法優先分析法

(1)算符文法

乙個文法,如果它的任一產生式的右部都不含兩個相繼(並列)的非終結符,即不含如下形式的產生式右部:

…qr…

則我們稱該文法為算符文法,也稱og文法

((1)算符文法

乙個文法,如果它的任一產生式的右部都不含兩個相繼(並列)的非終結符

2.構造算符優先關係表

(1)通過檢查產生式的每乙個候選式可以找出滿足a=.b

(即p→…ab…或p→…aqb…的產生式)

(2)為了滿足<.>

(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)有了這兩個集合之後,就可以通過檢查每個產生式的候選式確定滿足關係<.>

五.lr分析法

1.lr分析器

lr(0)分析表的構造 專案、專案集、專案集規範族 專案集的閉包(closure) 有效專案 slr分析表的構造

有效專案 規範lr分析表的構造 lalr(look ahead )分析表的構造 lr分析方法是一種自下而上的分析方法

lr分析法的歸約過程是規範推導的逆過程,所以lr分析過程是一種規範歸約過程

lr分析方法是一種適用於一大類上下文無關文法的分析方法比較複雜,不適於用手工實現,可借助於yacc/bison實現。

2.lr文法

乙個文法,如果能構造出乙個所有條目都唯一的分析表。

lr(k)文法

最多向前看k個的符號就可以決定動作的lr分析器所分析的文法成為lr(k)文法。

我們最感興趣的是k=0,1

3.活字首

活字首特點:

該字首加上被分析串中未被分析的終結符,就可以構成乙個規範句型

只要輸入串的已掃瞄部分可歸約成乙個活字首,意味著掃瞄過的部分沒有錯誤

活字首與控制代碼間的關係

(1)活字首中已含有控制代碼的全部符號(控制代碼的符號即為其最右符號)。

(2)活字首中含控制代碼的一部分符號(控制代碼開頭的 若干符號與活字首最右的若干個符號一致)。

(3)活字首中全然不包含控制代碼的任何符號 。

活字首的識別與lr分析表構造

lr分析表的構造需要構造識別活字首的有限自動機,

用有限自動機中的狀態表示分析表中的狀態,

用狀態圖中的狀態之間的轉換關係對分析表中的action goto函式等進行定義。

構造識別活字首的nfa

1、構造文法的所有產生式的專案,每個專案都為nfa的乙個狀態。

2、確定初態、控制代碼識別態、句子識別態。

由於s′(起始符)僅在第一產生式的左部出現 ,因此規定起始符相關的專案1為初態 

其餘每個狀態都為活字首的識別態(終態)

圓點在最後的專案為控制代碼識別態 

第乙個產生式的控制代碼識別態為句子識別態 。

六.lr(0)專案集規範族構造

構成識別乙個文法活字首的dfa專案集(狀態)的全體稱為這個文法的lr(0)專案集規

nfa確定化為dfa的工作量較大,我們考慮直接構造出專案集作為dfa的狀態,就可直接構造dfa。

通過閉包函式(closure)來求dfa乙個狀態的專案集。

七.感想

整體來講,這一章和上一章是反著來的。規約的問題理解起來似乎更為複雜,但其結構更為合理。將輸入符號存到棧中,

當頂部出現候選式時就轉換為符號。題目也是難度也是穩步攀公升,一章比一章複雜。

八.題目

第五章 自下而上分析

一 自下而上分析基本問題 1 歸約 其實就是上一章自上而下的分析的逆向 定義 是指根據文法的產生式規則,把產生式的右部替換成左部符號。2 規範規約 推出了短語 直接短語 控制代碼的概念。乙個句型的最左直接短語稱為該句型的控制代碼。規範歸約 最左規約 是關於是乙個最右推導 規範推導 的逆過程。由於規範...

第五章 自下而上分析

1 移進歸約 1 基本思想 用乙個寄存符號的先進後出棧,把輸入符號乙個乙個地移進到棧裡,當棧頂形成某個產生式的候選式時,即把棧頂的這一部分替換成 歸約為 該產生式的左部符號。2 歸約 是指根據文法的產生式規則,把產生式的右部替換成左部符號。自下而上分析過程 邊輸入單詞符號,邊歸約。核心問題 識別可歸...

第五章 自下而上分析

一 知識點 自下而上分析法是從輸入串開始,逐步進行 規約 直至規約到文法的開始符號 或者說,從語法樹的末端開始,步步向上 規約 直至根結。歸約 1 短語 令g是乙個文法,s是文法的開始符號,假定 是文法g的乙個句型,如果有s a 且s 則稱 是句型 相對於非終結符的短語。2 直接短語 特別是,如果有...