編譯原理優先函數表怎麼畫
Ⅰ 優先函數是什麼編譯原理
構造算符優先分析表時使用的優先函數,其等價於矩陣表,但存儲量小。
定義兩個函數,其對應元素的值為優先值,通過循環比較各元素的兩個值,每次將優先順序大的值改為小的值+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)<g(q2)
若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的箭弧。