ab編譯原理
1. 編譯原理5:算符優先關系表構造
根據FIRSTVT和LASTVT構造算符優先關系表,規則簡單來講如下:
① 對於產生式形如 A→...ab... 則優先順序a=b
②對於產生式形如 A→...aBc...則優先順序a=c,a<FIRSTVT(B),LASTVT(B)>c
例:
2. 編譯原理語法分析中消除左遞歸的問題。比如A→Ab|c中為什麼說它是左遞歸呢,明明是A定義為Ab或者
A->Ab|c為什麼是左遞歸,和為什麼要消除左遞歸:
定義,就無需爭辯了。至於為什麼自頂向下文法不能處理左遞歸,解釋如下:
c∈FIRST(A),所以當預測分析的棧頂出現非終結符A,而輸入字元串最左邊為c時,就不知道用產生式A->Ab還是A->c了。無法構造預測分析表。比如輸入字元串為cbb,我們人當然容易知道是A->Ab->Abb->cbb了,但是電腦沒那麼聰明,如果不消除左遞歸,只有回溯了。
3. [編譯原理]令a,b和c是任意正規式,證明以下關系成立
A∣A=A
L(A∣A)=L(A)∪L(A)=L(A),所以有A∣A=A。
A*=ε∣A
A*
通過證明兩個正規式所表示的語言相同來證明兩個正規式相等。
L(ε∣A
A*)=L(ε)∪L(A)L(A*)=
L(ε)∪L(A)(L(A)
)*
=L(ε)∪L(A)((L(A))0∪(L(A))1∪(L(A))2∪(L(A))3∪?)
=L(ε)∪(L(A))1∪(L(A))2∪(L(A))3∪(L(A))4∪?
=(L(A))*=L(A*)
即:L(ε∣A
A*)=L(A*),所以有:A*=ε∣A
A*
(AB)*A=A(BA)*
利用正規式的分配率和結合律直接推導。
(AB)*A=((AB)0∣(AB)1∣(AB)2∣(AB)3∣?)A
=εA∣(AB)1A∣(AB)2A∣(AB)3A∣?
=Aε∣A
(BA)1∣A
(BA)2∣A
(BA)3∣?
=A(BA)*
即:(AB)*A=A(BA)*
4. 編譯原理正規式a|b的正規集包括ab這種情況嗎
好好看一下書啦。a|b表示的語言是{a,b}, 不含ab.
5. 編譯原理最左最右推導規則
因為推導過程並不要求所有的產生式都用上。再給你舉個例子,比如:
baa,那推導也是S=>AB=>bBB=>baB=>baa,也沒有用到那個式子啊。
當然,有可能這個式子永遠用不到,也就是這個式子的功能可以用另外的式子替換,這時候,這個文法就是有冗餘的。
6. 編譯原理中,形式語言里怎麼區分2型文法與3型文法
二型文法如下:
S->Ac
S->Sc
A->ab
A->aAb
三型文法如下:
S->aS
A->bA
B->cB
B->c
A->Bb
A、2型文法是上下文無關文法,表現在產生式上就是產生式的左部只有一個非終結符;3型文法從廣義上講包括左線形文法、右線形文法和正規文法 。
B、左線形文法產生式的右部要麼沒有非終結符,如果有非終結符也只能有一個,且必須位於產生式右部的最左端。
C、右線形文法產生式的右部要麼沒有非終結符,如果有非終結符也只能有一個,且必須位於產生式右部的最右端 。
D、正規文法是右線形文法的一個子集,其產生式右部只有三種情況:
1)空串
2)只有一個終結符
3)只有一個終結符後接一個非終結符
E、所有的3型文法都是2型文法。
7. 請問編譯原理中a(a|b)*a和aa*b*a有什麼區別,謝謝。
涉及到一個優先序問題,前一個正則式接受兩個a之間有0長度或任意長度的{a,b}字元串序列,而後一個正則式則只允許兩個a之間有的{a,b}序列必須滿足:如果a、b同時存在,則a必須在b前面,也就是只接受左右兩端全是a,只有中間是b這種夾心餅乾的形式。舉個栗子你就明白了:
a(a|b)*a可以接受的輸入序列有:aa aaa aba abba aaba abaa
aa*b*a 可以接受的輸入序列有:aa aaa aaba aba aaabba 不能接受abaa
8. 編譯原理,求詳解A*和A+代表什麼意思
V是一個符號集合,假設V指的是三個符號a, b, c的集合,記為 V = {a, b, c }
V* 讀作「V的閉包」,它的數學定義是V自身的任意多次自身連接(乘法)運算的積,也是一個集合。
也就是說,用V中的任意符號進行任意多次(包括0次)連接,得到的符號串,都是V*這個集合中的元素。
0次連接的結果是不含任何符號的空串,記為 ε
1次連接就是只有一個符號的符號串,比如,a,b, c
2次連接是兩個符號構成的符號串,比如,aa, ab, ac, ba, bb, bc,等等
……
9. 誰能夠解釋下編譯原理中什麼是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的箭弧。
10. 編譯原理這個符號表示什麼 如圖~~~~
剪頭上加一個星號:S-*->aPb
表示從S可以推出含有非終結符P的形如aPb的句型。
剪頭上加一個加號:S-+->a
表示從S可以推出終結符a。