編譯原理歸
1. 編譯原理左遞歸消除
這些題很難啊!!!
都有間接左遞歸。要先變成直接左遞歸,然後消除掉。
--------------------
G3.1
S->SA|Ab|b|c
A->Bc|a
B->Sb|b
--------------------
間接左遞歸轉直接左遞歸
B代入A:A ->(Sb|b)c|a -> Sbc|bc|a
A代入S:S -> S(Sbc|bc|a)|(Sbc|bc|a)b|b|c -> SSbc|Sbc|Sa|Sbcb|bcb|ab|b|c
消除直接左遞歸
S->bcbS'|abS'|bS'|cS'
S'->SbcS'|bcS'|aS'|bcbS'|ε
S'還是有直接左遞歸,繼續消除
S'->bcS'T|aS'T|bcbS'T
T->bcS'T|ε
最後,這題答案就是S,S',T的產生式
--------------------
下面兩題更難了,上一題反復代入還能把其他非終結符消掉,下面兩個文法都是最後代入還剩下兩個非終結符反復迭代,佛了!
G3.2
E->ET+|T
T->TF*|F
F->E|i
--------------------
F代入T: T->T(E|i)*|(E|i)->TE*|Ti*|E|i
T代入E:
--------------------
G3.3
S->V_1
V_1->V_2|V_1 2 V_2
V_2->V_3|V_2 + V_3
V_3->V_1 * |(
這些字母我都不認識了,換一下
S->A|SiA
A->B|A+B
B->S*|(
--------------------
B代入A:A->(S*|()|A+(S*|()->S*|(|A+S*|A+(
A代入S:
--------------------
2. 編譯原理為什麼存在遞歸文法
編譯原理中存在遞歸文法是因為編程語言的語法和結構往往具有遞歸性質。遞歸文法是一種用來描述編程語言語法的形式化表示方法,其中規則可以包含對同一語法結構的遞歸引用。這種遞歸性質反映了編程語言中常見的嵌套和遞歸結構。
以下是一些原因,說明為什麼編譯原理中存在遞歸文法:
1. 語法結構的嵌套:編程語言中的語法結構通常可以嵌套在其他語法結構中,例如,一個函數可以包含其他函數,一個條件語句可以包含另一個條件語句,等等。遞歸文法可以很自然地表示這種嵌套結構。
2. 語法的可擴展性:編程語言通常需要具有可擴展性,允許程序員定義新的語法結構或數據類型。遞歸文法可以輕松地擴展以包括新的語法規則。
3. 函數調用和表達式求值:編程語言中的函數調用和表達式求值通常是遞歸的過程。遞歸文法可以用於清晰地描述這些遞歸計算過程。
4. 簡潔性和可讀性:遞歸文法可以幫助編譯器設計者更簡潔地表示語言的語法,這有助於提高編譯器的可讀性和維護性。
5. 符合語言設計的自然表示:遞歸文法使得語法規則的表示更符合編程語言設計的自然結構,因為它們允許對語法結構進行遞歸定義,而不需要多次重復相似的規則。
雖然遞歸文法在編譯原理中非常有用,但它們也需要謹慎使用,以避免無限遞歸或歧義性。編譯器設計者需要確保遞歸文法能夠被正確解析和處理,通常需要使用遞歸下降解析器或其他技術來處理遞歸文法。
3. 編譯原理
編譯原理):利用編譯程序從源語言編寫的源程序產生目標程序的過程; 用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成
(3)編譯原理歸擴展閱讀:
編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。
編譯程序的語法規則可用上下文無關文法來刻畫。語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發,向下推導,推出句子。
而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧里,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號。
4. 編譯器有哪幾部分構成.編譯原理
1. 詞法分析
詞法分析器根據詞法規則識別出源程序
中的各個記號(token),每個記號代表一類單詞(lexeme)。源程序中常見的記號可以歸為幾大類:關鍵字、標識符、字面量和特殊符號。詞法分析器
的輸入是源程序,輸出是識別的記號流。詞法分析器的任務是把源文件的字元流轉換成記號流。本質上它查看連續的字元然後把它們識別為「單詞」。
2. 語法分析
語法分析器根據語法規則識別出記號流中的結構(短語、句子),並構造一棵能夠正確反映該結構的語法樹。
3. 語義分析
語義分析器根據語義規則對語法樹中的語法單元進行靜態語義檢查,如果類型檢查和轉換等,其目的在於保證語法正確的結構在語義上也是合法的。
4. 中間代碼生成
中間代碼生成器根據語義分析器的輸出生成中間代碼。中間代碼可以有若干種形式,它們的共同特徵是與具體機器無關。最常用的一種中間代碼是三地址碼,它的一種實現方式是四元式。三地址碼的優點是便於閱讀、便於優化。
5. 編譯原理簡單文法歸約計算
編譯原理中的語法和文法是不一樣的,但卻融會貫通。
在計算機科學中,文法是編譯原理的基礎,是描述一門程序設計語言和實現其編譯器的方法。
文法分成四種類型,即0型、1型、2型和3型。這幾類文法的差別在於對產生式施加不同的限制。
形式語言,這種理論對計算機科學有著深刻的影響,特別是對程序設計語言的設計、編譯方法和計算復雜性等方面更有重大的作用。
多數程序設計語言的單詞的語法都能用正規文法或3型文法(3型文法G=(VN,VT,P,S)的P中的規則有兩種形式:一種是前面定義的形式,即:A→aB或A→a其中A,B∈VN ,a∈VT*,另一種形式是:A→Ba或A→a,前者稱為右線性文法,後者稱為左線性文法。正規文法所描述的是VT*上的正規集)來描述。
四個文法類的定義是逐漸增加限制的,因此每一種正規文法都是上下文無關的,每一種上下文無關文法都是上下文有關的,而每一種上下文有關文法都是0型文法。稱0型文法產生的語言為0型語言。上下文有關文法、上下文無關文法和正規文法產生的語言分別稱為上下文有關語言、上下文無關語言和正規語言。
6. 遞歸下降和遞歸向上以及左遞歸
遞歸下降、遞歸向上以及左遞歸是編譯原理與語法解析中關鍵概念。遞歸下降是一種自頂向下的語法解析方法,每個非終結符對應解析函數,通過遞歸調用處理特定文法規則。此方法直觀易懂,適用於上下文無關文法,但可能受到左遞歸影響,需進行特殊處理避免無限遞歸。
遞歸向上則為自底向上的語法解析方法,從最低級終結符開始解析,逐步構建語法樹,直至最高級非終結符。遞歸向上常用於LR分析器,如LR(1)與LALR(1),這類分析器通過自底向上推導樹解析輸入文本,相比遞歸下降,通常能處理更復雜語法,解析效率更高。
左遞歸指的是非終結符規則中以自身開頭的特性,如A->Aα。此結構可能使遞歸下降解析器陷入無限遞歸,導致解析失敗。處理左遞歸是編寫遞歸下降解析器時的重要步驟,常見解決方式為消除左遞歸,將左遞歸規則轉換為非左遞歸規則。例如,對於左遞歸規則A->Aα|β,可通過引入新非終結符A'進行轉換,如A->βA',A'->αA'|ε。
遞歸下降與遞歸向上是不同語法解析方法,適用於不同文法類型。處理左遞歸在編寫遞歸下降解析器時至關重要。根據語言特性與需求,選擇合適的解析方法極為重要。