1. 程式人生 > >編譯原理 課程總結

編譯原理 課程總結

       學習編譯原理的目的是學習設計與構造程式設計語言編譯程式的原理與方法。編譯器就是一個程式,它讀入用某種語言編寫的源程式,並翻譯成一個與之等價的另一種語言編寫的源程式。編譯程式的工作,從輸入源程式開始,到輸出目標程式結束,與自然語言之間的翻譯有很多相似之處。

       第一章講編譯器的基本結構

    

            詞法分析是識別出句子中的單詞

            語法分析是分析句子的語法結構

            語義分析及中間程式碼生成是根據句子的含義進行初步分析

            程式碼優化是對譯文進行修飾

            目的碼生成是寫出最後的譯文

    第二章講高階語言及其語法描述,主要包括程式設計語言的語法、程式設計語言的語義、程式設計語言的特點、程式設計語言的語法描述。

    第三章講詞法分析,編譯程式是從單詞的級別上來分析和翻譯源程式的。詞法分析的任務是從左至右逐個字元地對源程式進行掃描,產生一個個的單詞符號,把作為字串的源程式改造成為單詞符號串的中間程式。執行詞法分析的程式稱為詞法分析器。 首先是對詞法分析器的要求,包括功能、輸出形式、作為一個獨立子程式。接下來是詞法分析器的設計,包括輸入、預處理和單詞符號的識別(超前搜尋),其中,狀態轉換圖比較重要,因為後面會用到。最後是正規表示式與有限自動機,這也是本章的重點和難點。正規表示式與正規集相對應,具有相同特徵的字組成正規集,正規式是用一種形式化的方法來表示正規集。正規集相同的兩個正規式等價。等價正規式之間符合結合律、交換律、分配律等。確定的有限自動機(DFA)與非確定的有限自動機(NFA)的區別在於對映不同,非確定的有限自動機初態是一個非空集合,而確定的有限自動機的初態是唯一的。DFA是NFA的特例,通過證明可以證,可通過子集法將NFA確定化為DFA(重點)。確定的有限自動機和非確定的有限自動機都可以用狀態轉換矩陣和狀態轉換圖表示。正規式與有限自動機的轉換也是重點。首先,正規文法與有限自動機具有等價性,對於正規文法G和有限自動機M,如果L(G)=L(M),則稱G與M是等價的。須掌握正規式與有限自動機的互相轉換。

確定有限自動機的化簡:尋找一個狀態更少的DFA。注意化簡的步驟和演算法。

    第四章講自上而下語法分析,語法分析是編譯過程的核心部分,語言的語法結構是用上下文無關描述的。因為自上而下分析可能會存在兩大問題,左遞迴和回溯,所以產生了消除左遞迴和克服回溯的方法----LL(1)分析法。使用LL(1)分析法要涉及FIRST集和FOLLOW集,這是重點。當一個文法滿足LL(1)條件時,就可以構造遞迴下降分析器,預測分析程式是另一種使用一張分析表和一個棧實現LL(1)分析的有效方法。其中構造分析表是重點。

    第五章講自下而上語法分析,自下而上分析是從輸入串開始,逐步進行規約,直至規約到文法的開始符號,就是一種“移進-規約”法。自上而下分析的中心問題是怎樣判斷棧訂單符號串的可歸約性以及如何規約。解決方案是規範規約。所謂規範規約就是每一步都把控制代碼換成它對應的產生式的左部符號,控制代碼就是最左直接短語,此處涉及短語和直接短語的概念。對於規範規約,我個人的理解是:句子中相對最左的可以組成某個產生式右部的一個或多個符號就是最左直接短語,而把它們用相應產生式的左部替換的過程就是規範規約。規範規約可以用符號棧和語法樹來表示,用符號棧:有四類操作:移進、規約、接受和出錯處理,任何可規約串必出現在棧頂,即當發現棧頂呈現控制代碼時就用相應產生式的左部符號進行替換。接著,又產生了進一步的問題:如何尋找控制代碼(尋找控制代碼的演算法)。接著引入LR分析法。LR方法的基本思想是在規範規約的過程中,記住已移進和規約出的整個符號串,並根據所用產生式推測未來可能碰到的輸入符號,然後根據輸入符號來確定棧頂的符號串是否構成相對某一產生式的控制代碼。LR分析器的實質是一個帶先進後出棧的確定有限狀態自動機,它的每一步工作都是由棧頂狀態和現行輸入符號所唯一決定的。LR分析器的核心部分是一張分析表,一是動作(ACTION)表,另一是狀態轉換(GOTO)表,它們都是二維陣列。LR分析器的工作過程可看成是棧裡的狀態序列、已規約串和輸入串所構成的三元式的變化過程。LR文法是一個能夠構造一張分析表,使得它的每個入口均是唯一確定的文法。涉及四種不同分析表的構造方法,首先是LR(0)表構造法。最多向前看K個的符號就可以決定動作的LR分析器所分析的文法成為LR(k)文法。LR(0)是一種只概括“歷史”資料而不包含推測性“展望”材料的“狀態”。涉及字首和活字首的概念。LR分析表的構造需要構造識別活字首的有限自動機,用有限自動機中的狀態表示分析表中的狀態,用狀態圖中的狀態之間的轉換關係對分析表中的action goto函式等進行定義。構成識別一個文法活字首的DFA專案集(狀態)的全體稱為這個文法的LR(0)專案集規範族。第二種是SLR表構造法,規範族中會有含有衝突的專案集,向前檢視一個符號,以確定採用的動作。第三種是規範LR表構造法,仍有許多文法構造的LR(0)專案集規範族存在的動作衝突不能用SLR(1)方法解決。最後一種是LALR分析表。算符優先分析法是一種簡單直觀、廣為使用的自下而上分析法,它不是一種規範規約法。算符優先分析就是定義算符之間的某種優先關係,藉助於這種優先關係尋找可規約串和進行規約。其中涉及算符文法和算符優先文法的概念。從算符優先文法構造優先關係表,首先需要對文法的每個非終結符構造兩個集合FIRSTVT和LASTVT,其中涉及對兩個集合的理解。在實際實現算符優先分析演算法時,一般採用優先函式,入棧優先函式和比較優先函式。這種方法的優點是節省儲存空間,缺點是可能會導致輸入串的錯誤。如果存在優先函式,就可以利用優先表構造優先函式,構造優先函式有三部。算符優先分析有兩種情況會出現語法錯誤,用進行出錯處理。   

    第六章講屬性文法與語法制導翻譯,屬性文法是在上下文無關文法的基礎上為每個文法符號(終結符或非終結符)配備若干個相關的“值”,稱為“屬性”。屬性分為綜合屬性和繼承屬性。綜合屬性用於“自下而上”傳遞資訊,在語法樹中,一個結點的綜合屬性的值,由其子結點的屬性值確定。繼承屬性用於“自上而下”傳遞資訊。在語法樹中,一個結點的繼承屬性由此結點的父結點和/或兄弟結點的某些屬性確定。語義規則是屬性計算的過程即是語義處理的過程對於文法的每一個產生式配備一組屬性的計算規則。基於屬性文法的處理過程是輸入串——》語法樹——》依賴圖——》語義規則計算次序——》計算結果。在一顆語法樹中的結點的繼承屬性和綜合屬性之間的相互依賴關係可以用稱作依賴圖的一個有向圖來描述。假設語法樹已經建立起了,並且樹中已帶有開始符號的繼承屬性和終結符的綜合屬性。然後以某種次序遍歷語法樹,直至計算出所有的屬性。最常用的遍歷方法是深度優先,從左到右的遍歷方法,如果需要,可使用多次遍歷。與樹遍歷的屬性計算方法不同,一遍掃描的處理方法是在語法分析的同時計算屬性值,而不是語法分析構造語法樹之後進行屬性的計算,而且無需構造實際的語法樹。從語法樹中去掉對翻譯不必要的資訊,而獲得更有效的源程式中間表示。這種經變換後的語法樹稱之為抽象語法樹。S-屬性文法的自下而上計算和L-屬性文法的自頂向下翻譯。翻譯模式是語法制導定義的一種便於翻譯的書寫形式。其中屬性與文法符號相對應,語義規則或語義動作用花括號{ }括起來,可被插入到產生式右部的任何合適的位置上。這是一種語法分析和語義動作交錯的表示法,他表達在按深度優先遍歷分析樹的過程中何時執行語義動作。翻譯模式給出了使用語義規則進行計算的順序。可看成是分析過程中翻譯的註釋。

    第七章講語義分析與中間程式碼生成,語義分析的任務是審查每一個語法結構的靜態語義,即驗證語法正確的結構是否有意義。幾種常用的中間語言形式有:逆波蘭表示法、圖表示法、三元式、間接三元式、四元式。 波蘭表示是一種既不須考慮優先關係、又不用括號的一種表示表示式的方法(字首式)。圖表示法又包括抽象語法樹和無迴圈有向圖(DAG)。三元式由三個部分組成:算符:OP,第一運算分量:ARG1,第二運算分量:ARG2。間接三元式是在三元式的基礎上附加一張指示器表─間接碼錶,按運算的先後順序列出有關三元式在三元式表中的位置。四元式是一個帶有四個域的記錄結構:op,arg1,arg2及result。它實際上就是一條三地址的指令。陣列元素的地址計算公式是 base + (i – low)*w  其中,low為陣列下標的下界, base是分配給陣列的相對地址,即base為A的第一個元素A[low]的相對地址。  base + (i – low)*w   可整理為:  i*w + (base –low*w) 其中: i*w  是隨陣列下標變數而變化的部分,記為VARPART ,(base – low*w)是在陣列中不變化的常數記為CONSPART。二維陣列按行存放,則相對地址可表示為:base + (( i1 – l1)*d2 + i2 – l2) *w其中,l1、l2分別為i1、i2的下界;di界差。若ui為i的上界,則di=ui – li +1.假定i1,i2是編譯時唯一尚未知道的值,我們可以重寫上述表示式為:( base –( (l1 *d2) + l2) *w)+ ( (i1*d2) + i2) *w其中:前一項子表示式( base – ((l1 *d2) + l2) *w )的值是可以在編譯時確定的記為常數CONSPART。後一子項隨i1, i2 而改變是一個變數記VARPART。控制流語句的翻譯,包括條件語句中布林表示式的翻譯、標號和無條件轉移的翻譯、迴圈與分情況語句的翻譯、過程呼叫的翻譯。


相關推薦

編譯原理 課程總結

       學習編譯原理的目的是學習設計與構造程式設計語言編譯程式的原理與方法。編譯器就是一個程式,它讀入用某種語言編寫的源程式,並翻譯成一個與之等價的另一種語言編寫的源程式。編譯程式的工作,從輸入源程式開始,到輸出目標程式結束,與自然語言之間的翻譯有很多相似之處。    

編譯原理課程總結

     編譯原理旨在介紹編譯程式構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語義分析、中間程式碼生成、程式碼優化和目的碼生成。第一章引論主要學習了編譯程式的定義、過程和結構。編譯程式由詞法分析器、語法分析器、語義分析與中間程式碼產生器、優化器、目的碼生

詞法分析器——哈工大編譯原理課程(一)

mina == 原理 技術分享 after 文件 編碼 exe warn 詞法分析器——哈工大編譯原理課程(一) 程序輸入:從code.txt文件中讀取內容 程序輸出:識別出的單詞序列,格式為:(種別碼,屬性值)      ①對於關鍵字

編譯原理】:哈工大編譯原理課程內容記錄

//// 第二章 語言,文法,上下文無關法 //// 串上的運算 xy = string x + string y //// 字串A的正閉包 不含0次方冪 字串A的閉

編譯原理課程設計詞法分析

  編譯原理課程設計詞法分析任務書     5)參考文獻: (1)張素琴,呂映芝. 編譯原理[M]., 清華大學出版社 (2)蔣立源、康慕寧等,編譯原理(第2版)[M],西安:西北工業大學出版社 6)課程設計進度安排 1.準備階段(4學時):選擇設計題

編譯原理總結

研究 yacc 語義檢查 裏的 思維 概念 and 靜態 後來 Decaf編譯器(mind語言) PL/0編譯器 構造工具:lex yacc 單遍編譯器 類p-code虛擬機 學編譯是學的相關的思想和研究,科研和教學還是有不同目的的 抽象語法樹AST 三地址碼TA

編譯原理期末複習考點總結(一) 通俗易懂的方式解釋概念(純手打)

編譯原理總結 基礎概念 編譯程式是什麼? 能把源語言程式轉換成目標語言程式的程式。 編譯過程 詞法分析: 掃描源程式,將其分解為詞法單元后輸出。 方法:正規式,有限自動

編譯原理-詞法分析總結

課程總結第三章詞法分析我認為是比較難理解的一章。本文主要介紹在詞法分析過程中需要用到的一些基本概念,包括詞法單元、模式和詞素以及三者之間的關係,理解這些內容對學習詞法分析過程十分重要。首先要了解詞法分析的任務。詞法分析的任務:從左至右逐個字元的對源程式進行掃描,產生一個個的單

編譯原理第一章學習總結

《編譯原理》讀書筆記及練習題解析 1.1節練習題 1.1.1 編譯器和直譯器之間的區別是什麼? 答:編譯器是把源語言程式(高階語言程式)翻譯成目標語言程式(機器語言程式),然後由虛擬機器(目標語言程式的執行環境)執行編譯的結果程式;由於這個過程很直接,所以編譯器的速度快於

SLF4j 居然不是編譯時繫結?日誌又該如何正確的分檔案輸出?——原理總結

各位新年快樂,過了個新年,休(hua)息(shui)了三週,不過我又回來更新了,經過前面四篇想必小夥伴已經瞭解日誌的使用以及最佳實踐了,這個系列的文章也差不多要結束了,今天我們來總結一下。 概覽 這篇文章我們討論一下 SLF4j 的設計,以及 SLF4j 好在哪,之後進行一些答疑與前系列文章勘誤,最最後

Atitit. BigConfirmTips 控件 大數據量提示確認控件的原理and總結O9

table tips article check on() 使用 fun asp mil Atitit. BigConfirmTips 控件 大數據量提示確認控件的原理and總結O9 1. 基本的涉及的技術 1 2. 基本的流程 1 3. 調使用方法new conf

20145207 2016-2017《Java程序設計》課程總結

比較 結果 總結 然而 第六章 引入 公開 課程總結 實驗 20145207 2016-2017《Java程序設計》課程總結 目錄 一、每周作業及實驗報告鏈接匯總 二、關於博客 自認為寫得最好一篇博客是?為什麽? 作業中閱讀量最高的一篇博客是?談談經驗。 作業中與師生交

編譯原理-如何使用flex和yacc工具構造一個高級計算器

轉換 bin 們的 構造 roc ann 邏輯 計算 文件指針 Flex工具的使用方法 Lex 是一種生成掃描器的工具。 Lex是Unix環境下非常著名的工具,主要功能是生成一個掃描器(Scanner)的C源碼。 掃描器是一種識別文本中的詞匯模式的程序。 這些詞匯模式(或者

atitit.js 與c# java交互html5化的原理總結.doc

pad 托管 works onclick rgb sar com 2.0 swing atitit.js 與c# java交互html5化的原理與總結.doc 1. 實現html5化界面的要解決的策略 1 1.1. Js交互 1 1.2. 動態參數個

編譯原理:引論

教材 低級語言 程序 quest mce 語言翻譯 後端 高級 del 閱讀的教材為:編譯原理(張素琴等編著,清華大學出版社) 編譯過程就是將高級語言翻譯為低級語言 編譯過程分為前段(front end)和後端(back end) 閱讀過程中遇到的疑問是:解釋程序和編譯程序

Javac 編譯原理

技術 width 開發 pan 安裝 spa 判斷 開發者 開發環境 寫在前面 JDK & JRE JRE(Java Runtime Enviroment)是Java的運行環境。面向Java程序的使用者,而不是開發者。如果你僅下載並安裝了JRE,那麽你的系統只

計算機底層編譯原理 二進制

class bin [] return 計算機 col ger except sys import java.io.IOException; public class Demo07 { public static void main(String[] args

第一天課程總結與心得體會

入門知識 重要性 入門 代碼 培養 ack 成功 strong 表單 一切從最基本的開始,HTML部分最簡單的head、body連同一些屬性、標簽、表單與表格。對我來說並不簡單! 對於入門知識,大多吃英語方面。頭午開課老師便給我們灌輸了英語在編程方面的

編譯原理第一章學習(習題解答)

計算機 tran 輸出 fort 容易 工具 諾伊曼 架構 調試 編譯原理 第一章 引論 1.1 練習 1.編譯器和解釋器之間的區別是什麽? 首先,編譯器是一個軟件系統或者說是一個程序,解釋器是語言處理器。其次,編譯器是把程序翻譯成能被計算機執行的形式並報告翻譯過程中發

1.C#.Net編譯原理

標識 執行c 內容 exe 機器 inter 系統 運算 執行 1. C#中的幾種後綴名含義:   .Sln //解決方案文件→.csproj //項目文件→.cs //類文件。他們是層層包含的關系。 2. 命名空間:   命名空間是.NET中提供 應用程序代碼容器的方式,