編寫乙個算符優先分析程式,能實現以下功能:
1.輸入文法,判斷是否為算符文法;
2.構造並輸出該文法的每個非終結符的 firstvt 集和 lastvt 集;
3.構造並輸出算符優先分析表,判斷是否為算符優先文法,若不是提示無法進行分析;
4.任意輸入乙個輸入串,可得到成功的分析或錯誤的提示,輸出其分析過程或列印語法 分析樹。
實驗執行結果
算符優先文法的特點:
我們構造了算符優先語法分析器,就可以忽略原來的文法,棧中的非終結符僅僅作為與這些非終結符相關的屬性的佔位符
難以處理像減號這樣有不同優先順序的符號
由於分析的語言的文法和算符優先語法分析器本身的關係不是很緊密,所以不能肯定語法分析器接受的就是所期望的語言
什麼是算符文法?應滿足什麼條件算符文法
設有乙個文法g,若g中有形如u->vw的產生式,即它的任意產生式的右部都不含兩個相繼的非終結符,則稱g為算數文法,或稱為og文法。
算符優先文法
(1)是底向上分析法中的一種,雖然他不是規範規約,但具有分析速度快的特點,是和表示式分析。
(2)算符優先分析法就是仿照算數四則運算的運算過程。定義任意兩個相繼出現的終結符號a和b之間的優先關係,一點確定了這種優先關係,就可以用他確定「控制代碼」進行規約。
概述算符優先分析法(operator precedence parse)是仿效四則運算的計算過程而構造的一種語法分析方法。算符優先分析法的關鍵是比較兩個相繼出現的終結符的優先順序而決定應採取的動作。
優點:簡單,有效,適合表示式的分析。
缺點:只適合於算符優先文法,是乙個不大的文法類。
求firstvt集和lastvt集
firstvt集
定義:firstvt§=
求法:
若p→a…或p→qa…, 則a屬於firstvt(p);
若p→q…, 則firstvt(q)含於firstvt(p);
直至firstvt(p)不再增大。
lastvt集
定義:lastvt§=
求法:
若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之間未必一定有優先關係
分析過程
算符優先分析法最左規約串的確定
最左素短語的定義是什麼?
素短語:某文法句型的短語它至少包含有乙個終結符號,並且除它之外,不再包含任何更小的素短語。
最左素短語:任意句型最左邊的素短語。
最左素短語的特徵?如何根據其特徵確定當前句型的最左可歸約串?什麼是「單非產生式」,算符優先分析法進行規約為什麼速度快?
右部僅有乙個非終結符的產生式
比用文法的優先關係矩陣節省記憶體,若有n個終結符號,優先關係矩陣佔記憶體為(n+1)2,優先函式為2(n+1);
程式設計時便於比較運算,即用一般的關係運算即可;
由於時間原因,**沒來及上傳。 4 4 算 符 優 先 分 析 法
4.4.1 方法概述 所謂算符優先分析法就是依照算術表示式的四則運算過程而設計的一種語法分析方法。這種分析方法首先要規定運算子之間 確切地說是終結符之間 的優先關係和結合性質,然後借助這種關係,比較相鄰運算子的優先順序來確定句型的可歸約串並進行歸約。下面,以表示式的文法為例,說明採用這種分析法分析符...
06丨 效能分析思路都在這裡了
最後兩列中,前面是請求時間的 28ms,後面是後端響應時間的 28ms。同時,我們再到 tomcat 上去看時間。buffer used 3.00k of 8.00m used 0.04從上面的資料可以看到,key buffer size 就用到了 4 顯然不用增加。再比如,我們看到這樣的資料 ta...
編譯原理 八 算符優先分析法 分析過程
算符優先分析法 構造演算法優先關係表 算符優先關係主要用於界定右句型的控制代碼 標記控制代碼的左端 出現在控制代碼的內部 標記控制代碼的右端。發現控制代碼的過程 非終結符的處理 因為非終結符不能影響語法分析,所以不需要區分它們,於是只用乙個佔位符來代替它們 演算法的主體思想 用棧儲存已經看到的輸入符...