1. 程式人生 > >編譯原理——算符優先分析法詳解

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

轉載地址

https://blog.csdn.net/qq_37977106/article/details/80301761

概述

       算符優先分析法(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集和LASTVT集

FIRSTVT集

定義:FIRSTVT(P)={a|P=>a…,或P=>Qa…,a屬於VT,Q 屬於VN}

求法

    若P→a…或P→Qa…, 則a屬於FIRSTVT(P);

    若P→Q…, 則FIRSTVT(Q)含於FIRSTVT(P);

    直至FIRSTVT(P)不再增大。

LASTVT集

定義:LASTVT(P)={a|P=>...a,或P=>…aQ,a含於VT,Q 含於VN}

求法

    若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)a<b:  G中有P→. . .aQ. . .且Q=>b…或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)有a<b,未必有b>a

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


    故=、<、>不同於關係運算符“等於”、“小於”、“大於”


概述

       算符優先分析法(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集和LASTVT集

FIRSTVT集

定義:FIRSTVT(P)={a|P=>a…,或P=>Qa…,a屬於VT,Q 屬於VN}

求法

    若P→a…或P→Qa…, 則a屬於FIRSTVT(P);

    若P→Q…, 則FIRSTVT(Q)含於FIRSTVT(P);

    直至FIRSTVT(P)不再增大。

LASTVT集

定義:LASTVT(P)={a|P=>...a,或P=>…aQ,a含於VT,Q 含於VN}

求法

    若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)a<b:  G中有P→. . .aQ. . .且Q=>b…或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)有a<b,未必有b>a

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


    故=、<、>不同於關係運算符“等於”、“小於”、“大於”