編譯原理 算符優先分析法詳解

2021-09-01 08:33:17 字數 2762 閱讀 2926

算符優先分析法(operator precedence parse)是仿效四則運算的計算過程而構造的一種語法分析方法。算符優先分析法的關鍵是比較兩個相繼出現的終結符的優先順序而決定應採取的動作。

優點:簡單,有效,適合表示式的分析。

缺點:只適合於算符優先文法,是乙個不大的文法類。

定義:

短語:設有文法g,s是開始符號,設abd是g的乙個句型,若有sþabd且aþb則稱b是句型abd關於a的短語

直接短語:在上面定義中,如果a直接推出b,即aþb,則稱b是句型abd關於a®b的直接短語。

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

素短語:文法g某句型的乙個短語是素短語,當且僅當它至少含有乙個終結符,且除它自身之外不再含更小的素短語。

最左素短語:在具有多個素短語的句型中處於最左邊的那個素短語。

求法:

短語:從根結點出發一層一層地找出所有非葉子結點的非終結符,每乙個非終結符延伸下去的所有葉子結點從左到右排列起來就是乙個短語。

直接短語:找出所有僅有兩代的子樹,並將它的所有葉子從左到右排列起來就是乙個直接短語。

控制代碼:從直接短語集合中找出最左邊的短語。

素短語:從短語集合中找出所有含有終結符的短語,然後選出除它自身之外不再含更小的素短語(這個小的概念是集合中沒有被包含的元素,如有兩個短語aaa和aaaa,aaa含於aaaa,所以aaa比aaaa小)

最左素短語:從素短語集合中找出最左邊的素短語。

firstvt集

定義:firstvt(p)=

求法

若p→a…或p→qa…, 則a屬於firstvt(p);

若p→q…, 則firstvt(q)含於firstvt(p);

直至firstvt(p)不再增大。

lastvt集

定義:lastvt(p)=

求法

若p→...a或p→…aq, 則a屬於lastvt(p);

若p→...q, 則lastvt(q)含於lastvt(p);

直至lastvt(p)不再增大。

以以下文法為例:

e→e+t|t

t→t*f|f

f→(e)|i

終結符之間的優先關係

對算符文法g,  a,b屬於vt 定義

(1)a=b:  g中有p→. . .ab. . .或p→. . .aqb. . .

(2)ab…或q=>rb...

(3)a>b:  g中有p→. . .qb. . . 且q=>. ..a或q=>…ar

算符優先關係表的構造

(1)  在文法中新增e→#e#。

(2)  求出firstvt和lastvt集

(3)  找出所有終結符,並畫出關係表的結構

(4)  從文法中找出形為aqb(終結符+非終結符+終結符)和ab(終結符+終結符)的部分,本例中為(e)和#e#,然後在(和)與#和#相應的**填=。

(5)  從文法中找出形為aq(終結符+非終結符)的部分,a與q的firstvt集合中每乙個元素在**中的交叉點填小於號。

i.找出形為aq的部分

ii.填小於號(終結符為豎排,非終結符中的元素為橫排,以橫排為基準填符號)

(6)  從文法中找出形為qa(非終結符+終結符)的部分, q的lastvt集合中每乙個元素與a在**中的交叉點填大於號。

i.找出形如qa的部分

ii.填大於號(非終結符中的元素為橫排,終結符中的元素為豎排,以豎排為基準填符號)

(7)  合併後的結果為

從上表可知:

(1)相同終結符之間的優先關係未必是=

(2)有aa

(3)a、b之間未必一定有優先關係

故=、不同於關係運算子「等於」、「小於」、「大於」

編譯原理 算符優先分析法詳解

算符優先分析法 operator precedence parse 是仿效四則運算的計算過程而構造的一種語法分析方法。算符優先分析法的關鍵是比較兩個相繼出現的終結符的優先順序而決定應採取的動作。優點 簡單,有效,適合表示式的分析。缺點 只適合於算符優先文法,是乙個不大的文法類。定義 短語 設有文法g...

編譯原理 算符優先分析法

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

編譯原理 八 算符優先分析法 分析過程

算符優先分析法 構造演算法優先關係表 算符優先關係主要用於界定右句型的控制代碼 標記控制代碼的左端 出現在控制代碼的內部 標記控制代碼的右端。發現控制代碼的過程 非終結符的處理 因為非終結符不能影響語法分析,所以不需要區分它們,於是只用乙個佔位符來代替它們 演算法的主體思想 用棧儲存已經看到的輸入符...