⑴ 什麼叫活前綴,用通俗的話解答下,或者簡單的例子。 這個題是編譯原理的。
活前綴:右句型的前綴,而且其右端不會超過該句型的最右邊句柄的末端。
右句型:最右推導可得到的句型。
最右推導:每步推導都替代最右非終結符的推導。
推導:我們說αBγ推導出αβγ,是說存在產生式B->β。
產生式:左邊為非終結符,右邊為終結符與非終結符組合成的串。
非終結符:是字元串的集合。
終結符:組成語言的詞。如c語言中的2,a,int,if等。
句型:開始符經過若干步推導後得到的串。
前綴:如abc的前綴為a、ab、abc。
開始符:開始符是整個語言的集合。
句柄:非形式的,句柄是和某個產生式右部匹配的字元串,把句柄歸約成產生式左部的非終結符,可以得到最右推導的逆過程的一步。形式的定義為:開始符s經過若干步最右推導得到αBγ,αBγ經過一步最右推導得到αβγ,若γ為終結符的集合,則β為句柄。舉例:
E->E+E|E*E|-E|(E)|id,對於id+id*id,其中一個最右推導為E->E+E->E+E*E->E+E*id->E+id*id->id+id*id。在id+id*id歸約成E+id*id的過程中,最左邊的id是句柄。E+id*id歸約成E+E*id時,最左邊的id是句柄,把E+E*id歸約成E+E*E時,id是句柄。把E+E*E歸約成E+E時E*E是句柄。E+E歸約成E時,E+E是句柄。
歸約:可理解為把產生式右邊的串用產生式左邊的非終結符代替。
注1:再說一下活前綴,舉個例子,比如E+E*E歸約成E+E,句柄是E*E,那麼它的活前綴就是E、E+、E+E、E+E*、E+E*E。又比如id+id*id歸約成E+id*id,句柄是最左邊的id,那麼它的活前綴是id,因為不能超過句柄。
注2:至於為什麼要給出活前綴的定義和如何用歸約的方法實現語法分析,還要進一步學習。
⑵ 編譯原理 正則語言 二義文法 急~
這個沒有一個好老師,自己咬文嚼字看懂是很累的
二義性文法
【定義】 若文法中存在這樣的句型,它具有兩棵不同的語法樹,則稱該文法是二義性文法。
二義性文法會引起歧義,應盡量避免之!
G(E):E -> E+E | E*E | (E) | i
這兩種展開
E E
E + E E * E
i E * E E + E i
i i i i
都可以表示i+i*i
所以;文法具有二義性。
⑶ 編譯原理中的文法的產生式的括弧有什麼用
不會就別瞎扯誤導別人。。。有括弧是因為這個是中綴表達式,中綴表達式需要括弧來表達正確的計算順序,如果是前綴表達式的話就可以沒有括弧這個推導。
⑷ 棧的應用舉例:數制轉換,表達式求值
關於表達式的分析與求值是計算機軟體專業中「編譯原理」課程極其重要的部分,主要用於最初的詞法分析。其表示方式有:前綴、中綴、後綴表示法。其數據結構可以使用一個堆棧來表示。具體的實現代碼,我以前使用的書籍是《C語言大全》,那上面就有完整的、現成的代碼,可以供你參考運行。同時你還可以參考《編譯原理》相關的教材。
但是由於我已經很久沒有編寫編譯原理方面的程序了,況且編寫並親自調試通過該程序,難度還是比較大的。所以我也無法親自給你編寫一個完整表達式分析與求值的程序。只能夠給你提供一些思路和線索。
另外,關於不同數制之間的轉換問題,這個倒是不難解決,可以採用通常的演算法就是短除法,然後將每一次的余數採取「倒排」即可。例如:將十進制的 15 轉換為二進制。
2|15(1
--
2|7(1
-
2|3(1
-
2|1(1
-
0
則十進制的 15 為二進制的:1111。