算符優先分析法-思路方法在這裏

爲了方便,記錄一下,因爲本人也正在學編譯原理,以便後續的學習複習,以下是自己整理的。

編寫一個算符優先分析程序,能實現以下功能:

1.輸入文法,判斷是否爲算符文法;
2.構造並輸出該文法的每個非終結符的 FIRSTVT 集和 LASTVT 集;
3.構造並輸出算符優先分析表,判斷是否爲算符優先文法,若不是提示無法進行分析;
4.任意輸入一個輸入串,可得到成功的分析或錯誤的提示,輸出其分析過程或打印語法 分析樹。

實驗運行結果在這裏插入圖片描述
算符優先文法的特點:
我們構造了算符優先語法分析器,就可以忽略原來的文法,棧中的非終結符僅僅作爲與這些非終結符相關的屬性的佔位符
難以處理像減號這樣有不同優先級的符號
由於分析的語言的文法和算符優先語法分析器本身的關係不是很緊密,所以不能肯定語法分析器接受的就是所期望的語言

什麼是算符文法?應滿足什麼條件
算符文法
設有一個文法G,若G中有形如U->Vw的產生式,即它的任意產生式的右部都不含兩個相繼的非終結符,則稱G爲算數文法,或稱爲OG文法。

算符優先文法
(1)是底向上分析法中的一種,雖然他不是規範規約,但具有分析速度快的特點,是和表達式分析。
(2)算符優先分析法就是仿照算數四則運算的運算過程。定義任意兩個相繼出現的終結符號a和b之間的優先關係,一點確定了這種優先關係,就可以用他確定“句柄”進行規約。
概述
   算符優先分析法(Operator Precedence Parse)是仿效四則運算的計算過程而構造的一種語法分析方法。算符優先分析法的關鍵是比較兩個相繼出現的終結符的優先級而決定應採取的動作。

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

   缺點:只適合於算符優先文法,是一個不大的文法類。
求FIRSTVT集和LASTVT集
FIRSTVT集

定義:FIRSTVT§={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§={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之間未必一定有優先關係
分析過程

在這裏插入圖片描述

算符優先分析法最左規約串的確定
  1. 最左素短語的定義是什麼?
素短語:某文法句型的短語它至少包含有一個終結符號,並且除它之外,不再包含任何更小的素短語。
最左素短語:任意句型最左邊的素短語。
  1. 最左素短語的特徵?如何根據其特徵確定當前句型的最左可歸約串?在這裏插入圖片描述
  2. 什麼是“單非產生式”,算符優先分析法進行規約爲什麼速度快?
右部僅有一個非終結符的產生式
比用文法的優先關係矩陣節省內存,若有n個終結符號,優先關係矩陣佔內存爲(n+1)2,優先函數爲2(n+1);
編程時便於比較運算,即用一般的關係運算即可;

由於時間原因,代碼沒來及上傳。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章