規範規約:
短語:令g是乙個文法,s是文法的開始符號,假定是αβδ文法g的乙個句型其中α,β,δ∈(vn∪vt)*,a∈vn ,如果有
s *=>αaδ且a +=>β
則β稱是句型αβδ相對於非終結符a的短語
直接短語:特別是,如果有a=>β,則稱β是句型αβδ相對於規則a->β的直接短語
控制代碼:乙個句型的最左直接短語稱為該句型的控制代碼
規範歸約是關於是乙個最右推導的逆過程
語法樹有如下結論
①每個句型都有一棵語法樹與之對應
②每棵語法樹的葉結點自左至右排列就組成乙個句型
③每棵子樹的葉結點自左至右排列就組成乙個短語
④每棵簡單子樹的葉結點自左至右排列就組成乙個直接短語
⑤每棵最左簡單子樹的葉結點自左至右排列就組成乙個控制代碼
算符優先分析法:
算符優先文法:乙個文法,如果它的任一產生式的右部都不含兩個相繼(並列)的非終結符,即不含如下形式的產生式右部:
…qr…
則我們稱該文法為算符文法,也稱og文法
終結符之間的優先關係:
假定g是乙個不含ε產生式的算符文法。對於任何一對終結符a、b,我們說:
1. a =. b 當且僅當文法g中含有形如p→…ab…或p→…aqb…的產生式
2. a <. b>b…或r+=>qb…
3. a>.b 當且僅當g中含有形如p→…rb…的產生式,而 r+=>…a或r+=>…aq
如果乙個算符文法g中的任何終結符對(a,b)至多只滿足下述三關係之一:
a=.b a>.b a<.b>
則稱g是乙個算符優先文法(opg文法)
構建算符優先關係表:
(1)通過檢查產生式的每乙個候選式可以找出滿足a=.b
(即p→…ab…或p→…aqb…的產生式)
(2)為了滿足<.>
若有產生式p→a…或p→qa…,則a屬於firstvt(p)
若a屬於firstvt(q),且有產生式p→q…,則a屬於firstvt(p)
lastvt(p):
若有產生式p→… a或p→… aq ,則a屬於 lastvt(p)
若a屬於lastvt(q),且有產生式p→… q ,則a屬於lastvt(p)
有了這兩個集合之後,就可以通過檢查每個產生式的候選式確定滿足關係<.>
(1)假定有個產生式的乙個候選形為
…ap…
那麼,對任何b屬於firstvt(p),有a <. b>
(2)假定有個產生式的乙個候選形為
…pb…
那麼,對任何a屬於lastvt(p),有a >. b
算符優先文法的設計:
素短語:指乙個句型的短語,它至少包括有乙個終結符號且除去它本身之外不再含任何更小的素短語
最左素短語:處在句型最左端那個素短語成為最左素短語
優先函式:
把每個終結符θ與兩個自然數f(θ)與g(θ)相對應,使得
若θ1 <. g>
若θ1 =. θ2,則f(θ1) = g(θ2)
若θ1 >. θ2,則f(θ1) > g(θ2)
f稱為入棧優先函式,g稱為比較優先函式
如果優先函式存在,則可以通過以下三個步驟從優先表構造優先函式:
(1)對於每個終結符a,令其對應兩個符號fa和ga,畫一張以所有符號fa和ga為結點的方向圖。
如果a>.b,則從fa畫一條弧至gb
如果a<.b>
(2)對每個結點都賦予乙個數,此數等於從該結點出發所能到達的結點(包括出發點自身)。
賦給fa的數作為f(a)
賦給ga的數作為g(a)
(3)檢查所構造出來的函式f和g是否與原來的關係矛盾。若沒有矛盾,則f和g就是要求的優先函式,若有矛盾,則不存在優先函式
lr分析法:
lr分析器棧的結構:
動作表:
action[s,a]:當狀態s面臨輸入符號a時,應採取什麼動作
狀態轉換表:
action[s,a]所規定的四種動作:
<1>. 移進 :把(s,a)的下一狀態s』=goto[s,a] 和輸入符號a推進棧,下一輸入符號變成現行輸入符號
<2>. 歸約 :指用某產生式a→β進行歸約. 假若β的長度為r, 歸約動作是a, 去除棧頂r個項,使狀態sm-r變成棧頂狀態,然後把(sm-r, a)的下一狀態s』=goto[sm-r, a]和文法符號a推進棧
<3>. 接受 :宣布分析成功,停止分析器工作
<4>. 報錯 :發現源程式含有錯誤,呼叫出錯處理程式
lr分析過程:
第一步 分析開始時,首先將初始狀態so及句子左界符#推入分析棧中
第二步 以棧頂的狀態及正掃視的輸入符號ai組成符號對(sm,ai)去查分析動作表,並根據表元action[sm,ai]的指示完成相應的分析動作
每一分析表元所規定的動作,僅能是下列四種動作之一:
(1)若action[sm,ai]=「移進」,這表明控制代碼尚未在棧頂部形成,此時正期待繼續移進輸入符號以形成控制代碼,故將當前的輸入符號推入棧中:
然後,以符號對(sm,ai)查狀態轉移表,設相應的表元goto [sm,ai]= sm+1,再將此新的狀態(即要轉移到的下一狀態)推入棧中
(2)若action[sm,ai]= rj ,其中rj意指按文法的第j個產生式a→xm-r+1 xm-r+2…xm進行歸約
將分析棧從頂向下的r個符號(因為該產生式右部符號串的長度為r)退出,然後再將文法符號a推入棧中
然後,以(sm-r ,a)查狀態轉移表,設goto [sm-r,a]=sl,將此新狀態推入棧中
(3)若action[sm,ai]=「接受」,則表明當前的輸入串已被成功地分析完畢,應中止分析器的工作
(4)若action[sm,ai]=error,則表明當前的輸入串中有語法錯誤,也應終止分析器的工作
lr(k)文法:最多向前看k個的符號就可以決定動作的lr分析器所分析的文法成為lr(k)文法
活字首:文法g的活字首是他的規範句型的字首,該字首不超過控制代碼的右端
lr(0)專案:在每個產生式的右部適當位置新增乙個圓點構成專案
構造識別活字首的nfa:
1、構造文法的所有產生式的專案,每個專案都為nfa的乙個狀態
2、確定初態、控制代碼識別態、句子識別態
由於s′(起始符)僅在第一產生式的左部出現 ,因此規定起始符相關的專案1為初態
其餘每個狀態都為活字首的識別態(終態)
圓點在最後的專案為控制代碼識別態
第乙個產生式的控制代碼識別態為句子識別態
狀態之間的轉換關係確定方法如下:
若專案i為x→x1x2...xi-1 • xi…xn
專案j為x→x1x2...xi-1xi • xi+1…xn。
則從狀態i到狀態j連一條標記為xi的箭弧s
若i為x→γ•aβ,k為a→•β,
則從狀態i畫標記為ε的箭弧到狀態k
把識別文法所有活字首的nfa確定化:
用子集法,把專案集變為狀態
lr(0)專案集規範族的構造:
1.構造g的拓廣文法g』
2.i的閉包closure(i)
(1) i的任何專案都屬於closure(i)
(2) 若a→α·bβ屬於closure(i),那麼,對任何關於b的產生式b→γ的專案b→·γ也屬於closure(i);
(3) 重複執行上述兩步驟直至closure(i) 不再增大為止
3.轉換函式
goto(i,x)=closure(j)其中:
i為包含某一專案集的狀態,
x為一文法符號,
j=構造識別文法活字首dfa的兩種方法:
1、求出文法的所有專案,按一定規則構造識別活字首的nfa再確定化為dfa
2、把拓廣文法的第乙個專案{s′→·s}作為初態集的核,通過求核的閉包和轉換函式, 求出lr(0)專案集規範族,再由轉換函式建立狀態之間的連線關係得到識別活字首的dfa
lr(0)專案集規範族的專案型別分為如下四種:
1)移進專案 a →α•aβ
2)待約專案 a →α•bβ
3)歸約專案 a →α•
4)接受專案 s』→s •
其lr(0)專案集規範族不存在移進-歸約,或歸約-歸約衝突,稱為lr(0)文法
lr(0)分析表的action和goto表的構造步驟:
a)若專案a→α•aβ屬於ik,且轉換函式go(ik,a)=ij,當a為終結符時 ,則置action[k,a]為sj。
b)若專案a→α•屬於ik, 則對a為任何終結符或#′,置action[k,a]=rj, j為產生式在文法g′中的編號。
c)若go(ik,a)=ij,則置goto[k,a]=j,其中a為非終結符,j為某一狀態號。
d)若專案s′→s•屬於ik,則置action[k,#]= acc。
e)其它填上「報錯標誌」。
編譯原理之語法分析 自下而上分析 一
從名字很容易看出來,自下而上分析法對應的就是自上而下分析法,這裡我首先簡單區分一下這兩種分析方法的區別。自上而下分析法是多個推導的過程,而自下而上分析法是多個歸約的過程。那麼歸約和推導又是什麼呢?下面通過乙個簡單的例子說明。例如有乙個文法g s s aacb b b,假如有乙個輸入符號串為aacb。...
自下而上語法分析
1.已知文法 e e t t t t f f f e i 以控制代碼作為可歸約串,寫出符號串 i i i 的 移進 歸約 分析過程。答 符號串 i i i 的 移進 歸約 分析過程為 符號棧輸入串動作 i i i 移進 i i i 歸約 f i i 歸約 t i i 歸約 e i i 移進 e i ...
自下而上語法分析
1.已知文法 e e t t t t f f f e i 以控制代碼作為可歸約串,寫出符號串 i i i 的 移進 歸約 分析過程。符號棧輸入串動作 i i i 移進 i i i 歸約 f i i 歸約 t i i 歸約 e i i 移進 e i i 移進 e i i 歸約 e f i 歸約 e t...