前言
語法:語言學的一個分支,研究按確定用法來運用的"詞類"、"詞"的屈折變化或表示相互關系的其他手段以及詞在句中的功能和關系。也就是說,語法的意義更多的是用來表達“詞”的功能和屬性
語法分析器:將詞法分析程序所產生的的單詞符號流作為輸入串,按一定的規則分析檢查是否構成合法的句子,(通俗的點說,在單詞沒有寫錯的基礎上,檢查單詞組合是否出現問題)
自下而上分析的基本問題
- 自下而上分析,字面意思從語法樹的底部向上分析(也即歸約)至語法樹的頂部,從而確定語法的正確性。
- 實現自下而上分析關鍵問題如何找到“可規約串”,如何判斷棧頂的字符串的可歸約性及與候選式匹配(自下而上分析是一邊輸入一邊規約的),及實現如下效果:
- 一般對於句子的理解,都是由左向右開始解讀,如同生活中閱讀一樣,同樣語法分析只是模擬了這個過程,觀察如下圖的語法樹,其語法為S->xAy,觀察的過程即模擬語法分析器的工作過程,從最左邊開始逐步向右分析。所以對於語法樹能找到最左邊的歸約項是由為重要的,也即句柄,下面是關於句柄定義的介紹。
1)短語:對於文法S=>abc,若S=>aAc,且A=+>b,則稱b是句型abc相對於非終結符A的短語(語法樹中句型不含有”開叉“的非終結符)
2)直接短語:對於文法S=>abc,若S=>aAc,且A=>b,則稱b是句型abc相對於非終結符A的短語
3)句柄:一個句型最左邊的直接短語稱之為句柄
運用句柄對句子進行規約:1,短語有,"x*y",”*“。直接短語,“*”,也即句柄。
2,當識別到“*”時與候選式A->*匹配規約,
3,規約后識別到字符串xAy時與候選式S->xAy進行匹配規約為S結束。
- 規范規約
a是文法G的一個句子,序列an......a0是a的一個規范規約
對於規范歸約而言,最關鍵的就是確定一個句型的句柄,不同的尋找句柄的算法即不同的規范歸約方法
PS:若文法G是無二意的,則規范退到的逆過程必然是規范歸約。
算符優先分析
- 算符優先分析:規定算符(即終結符)之間的優先順序和結合性質,借助這種關系尋找“可歸約串”。
- 算符優先文法:一個文法,如果它的任一產生式的右部都不含有兩個相繼的非終結符,則我們稱該文法為算符文法;實際上,真正的算法優先分析方法中,需定義任意兩個相繼出現的終結符a和b之間的優先關系,一旦確定了這種優先關系,就可以用它來確定“可規約串”進行歸納。
- 優先級關系
-
優先關系矩陣
- 構造集合FIRSTVT(P)
1)若有產生式P->a...或P->Qa...,則a屬於FIRSTVT(p)
2)若a屬於FIRSTVT(Q),且有產生式P->Q.....,則a屬於FIRSTVT(P)
- 構造集合LASTVT(R)
1)若有產生式P->.....a或P->.....aQ,則a屬於LASTVT(P)
2)若有a屬於LASTVT(Q),且有產生式P->....Q,則a屬於LASRTVT(P)
- 構造優先表
1)a同級b,找出所有滿足“同級”的終結符對
2)a優於b,a劣於b:找出滿足“優於”和“劣於”的終結符對
(PS:千萬別暈,目的都是為了構造ab,或者aQb)
3)“#”同級“#”;“#”劣於FIRSTVT(開始符號);LASTVT(開始符號)優於“#”。
- 素短語:至少含有一個終結符,並且除它自身之外不再含更小的素短語。(最左素短語即字面意思)
- 一個算符優先文法G的任何句型的最左素短語是滿足如下條件:aj-1<Njaj....NiaiNi+1>ai+1
算法過程
- 通過判斷移進的字符串是否滿足最左素短語的條件進行歸約
- 優先函數:利用使每個終結符θ對應兩個優先函數f(θ),g(θ)來表達終結符之間的優先關系,從而實現算符優先分析算法。
優點:便於作比較運算,並且節省存儲空間
缺點:原先不存在優先關系的兩個終結符,由於與自然數相對應變成可比較的,因而可能會掩蓋輸入串的某些錯誤