編譯原理優先函數表怎麼畫-ag真人国际官网
ⅰ 優先函數是什麼編譯原理
構造算符優先分析表時使用的優先函數,其等價於矩陣表,但存儲量小。
定義兩個函數,其對應元素的值為優先值,通過循環比較各元素的兩個值,每次將優先順序大的值改為小的值 1,若相等則都賦為目前較大的值,循環直至結果沒有變化,構造ok
ⅱ 試述編譯原理中優先函數有何好處與不足之處
構造算符優先分析表時使用的優先函數,其等價於矩陣表,但存儲量校 定義兩個函數,其對應元素的值為優先值,通過循環比較各元素的兩個值,每次將優先順序大的值改為小的值 1,若相等則都賦為目前較大的值,循環直至結果沒有變化,構造ok
ⅲ 編譯原理 文法題目
首先擴展文法為:
1) s1->s
2) s->as
3) s->bs
4) s->a
則:
i0 = closure({s1->.s})={s1->.s,s->.as,s->.bs,s->.a}
go(i0,s) = closure({s1->s.})={s1->s.} = i1
go(i0,a) = closure({s->a.s,s->a.})={s->a.s,s->.as,s->.bs,s->.a,s->a.} = i2
go(i0,b) = closure({s->b.s})={s->b.s,s->.as,s->.bs,s->.a}=i3
go(i2,s) = closure({s->as.})={s->as.}=i4
go(i2,a) = closure({s->a.s,s->a.}) = i2
go(i2,b) = closure({s->b.s}) =i3
go(i3,s) = closure({s->bs.}) = {s->bs.} = i5
go(i3,a) = closure({s->a.s,s->a.}) = i2
go(i3,b) = closure({s->b.s}) = i3
由圖所示,狀態i2,既有歸約項目(s->a.)又有移近項目(s->.as,s->.bs,s->.a),產生沖突。當用srl分析法時,需向前看一步,即求出:
follow(s) = follow(s1) = {#}
則,follow(s)∩{a,b} =∮
故而action(i2,a) = s2
action(i2,b) = s3
action(i2,#) = r4
則構造出srl分析表如下所示:
action goto
a b # s
i0 s2 s3 1
i1 acc
i2 s2 s3 r4 4
i3 s2 s3 5
i4 r2 r2 r2
i5 r3 r3 r3
請採納。
ⅳ 編譯原理:優先函數 f和g 到底怎麼看啊,不懂怎麼構造的 求解...
求算符優先函數的方法—迭代法
若已知運算符之間的優先關系,可按如下步驟構造優先函數:
1、對每個運算符a(包括#在內)令f(a)=g(a)=1
2、如果a⋗b且f(a)<=g(b),令f(a)=g(b) 1
3、如果a⋖b且f(a)>=g(b),令g(b)= f(a) 1
4、如果a≐b而f(a) ≠g(b),令min{f(a),g(b)}=max{f(a),g(b)}
5、重復2~4,直到過程收斂。如果重復過程中有一個值大於2n,則表明不存在算符優先函數。
ⅳ 誰能夠解釋下編譯原理中什麼是firstvt,和lastvt,盡量淺顯易懂點謝謝
給你copy一個看管用不,雖然不懂你在問什麼...
算符優先分析 [上一節] [下一節]
5.2.1 算符優先文法及其優先表構造
一個文法,如果它的任一產生式的右部都不含兩個相繼(並列)的非終結符,即不含如下形式的產生式右部:
…qr…
則我們稱該文法為算符文法。
在後面的定義中,a、b代表任意終結符;p、q、r代表任意非終結符;『…』代表由終結符和非終結符組成的任意序列,包括空字。
假定g是一個不含e-產生式的算符文法。對於任何一對終結符a、b,我們說:
1. a�6�7b當且僅當文法g中含有形如p→…ab…或p→…aqb…的產生式;
2. a�6�3b當且僅當g中含有形如p→…ar…的產生式,而rb…或rqb…;
3. a�6�4b當且僅當g中含有形如p→…rb…的產生式,而r…a或r…aq。
如果一個算符文法g中的任何終結符對(a,b)至多隻滿足下述三關系之一:
a�6�7b,a�6�3b, a�6�4b
則稱g是一個算符優先文法。
現在來研究從算符優先文法g構造優先關系表的演算法。
通過檢查g的每個產生式的每個候選式,可找出所有滿足a�6�7b的終結符對。為了找出所有滿足關系�6�3和�6�4的終結符對,我們首先需要對g的每個非終結符p構造兩個集合firstvt(p)和lastvt(p):
firstvt(p)={a | pa…或pqa…,a�0�2vt而q�0�2vn}
lastvt(p)={a | p…a或p…aq,a�0�2vt而q�0�2vn}
5.2.2 算符優先分析演算法
所謂素短語是指這樣的一個短語,它至少含有一個終結符,並且,除它自身之外不再含任何更小的素短語。所謂最左素短語是指處於句型最左邊的那個素短語。如上例,p*p和i是句型p*p i的素短語,而p*p是它的最左素短語。
現在考慮算符優先文法,我們把句型(括在兩個#之間)的一般形式寫成:
#n1a1n2a2…nnannn 1# (5.4)
其中,每個ai都是終結符,ni是可有可無的非終結符。換言之,句型中含有n個終結符,任何兩個終結符之間頂多隻有一個非終結符。必須記住,任何算符文法的句型都具有這種形式。我們可以證明如下定理(證明留給有興趣的讀者作練習):
一個算符優先文法g的任何句型(5.4)的最左素短語是滿足如下條件的最左子串njaj…niaini 1,
aj-1�6�3aj
aj�6�7 aj 1,…,ai-1�6�7ai
ai�6�4ai 1
根據這個定理,下面我們討論算符優先分析演算法。為了和定理的敘述相適應,我們現在僅使用一個符號棧s,既用它寄存終結符,也用它寄存非終結符。下面的分析演算法是直接根據這個定理構造出來的,其中k代表符號棧s的使用深度。
5.2.3 優先函數
在實際實現算符優先分析演算法時,一般不用表5.1這樣的優先表,而是用兩個優先函數f和g。我們把每個終結符q與兩個自然數f(q)和g(q)相對應,使得
若q1�6�3q2 則 f(q1)
若q1�6�7q2 則 f(q1)= g(q2) (5.5)
若q1�6�4q2 則 f(q1)>g(q2)
函數f稱為入棧優先函數,g稱為比較優先函數。使用優先函數有兩方面的優點:便於作比較運算,並且節省存儲空間,因為優先關系表佔用的存儲量比較大。其缺點是,原先不存在優先關系的兩個終結符,由於與自然數相對應,變成可比較的了。因而,可能會掩蓋輸入串的某些錯誤。但是,我們可以通過檢查棧頂符號q和輸入符號a的具體內容來發現那些原先不可比較的情形。
如果優先函數存在,那麼,從優先表構造優先函數的一個簡單方法是:
1. 對於每個終結符a(包括#)令其對應兩個符號fa和ga,畫一張以所有符號fa和ga為結點的方向圖,如果a �6�4�6�7b,那麼,就從fa畫一箭弧至gb;如果a�6�3�6�7b,就畫一條從gb到fa的箭弧。