資源描述:
《編譯原理實(shí)驗指導(dǎo)書》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、編譯原理實(shí)驗指導(dǎo)書-----------------------Page1-----------------------編譯原理實(shí)驗指導(dǎo)書《編譯原理》課程組2003年12月1-----------------------Page2-----------------------概述一、本課程實(shí)踐的目的和任務(wù)編譯原理是一門實(shí)踐性很強(qiáng)的課程,只有通過實(shí)踐,才能真正掌握。實(shí)際的編譯程序是十分復(fù)雜的,有時由多達(dá)十幾萬條指令組成。為此,編譯原理的實(shí)踐教學(xué),采用簡化編譯過程的辦法,選擇最關(guān)鍵的3個環(huán)節(jié)──詞法分析、語法分析(包括
2、語義處理、產(chǎn)生無優(yōu)化的目標(biāo)指令)、連接調(diào)試,進(jìn)行編程和調(diào)試訓(xùn)練。每個環(huán)節(jié)作為一個實(shí)踐課題。先分別編程調(diào)試,再連接在一起總調(diào)。二、實(shí)踐方法任何一個實(shí)用的高級語言,其語法都比較復(fù)雜,如選其作為源語言,很難實(shí)踐全過程。故本實(shí)踐將定義一個簡化的語言──C/C++語言的一個子集作為源語言,分3個課題,設(shè)計調(diào)試出它的編譯程序。前后貫穿這一條主線進(jìn)行實(shí)踐。每次都可利用課余時間編程,利用上機(jī)時間進(jìn)行輸入和調(diào)試。建議使用C/C++語言或C語言。三、實(shí)踐報告的規(guī)范和要求每個課題完成后寫出實(shí)踐報告。實(shí)踐報告包括程序設(shè)計時考慮的算法和方法
3、;調(diào)試過程中出現(xiàn)的問題和解決的措施;打印出程序清單和調(diào)試時所用的源程序。四、簡化的C/C++語言子集的定義⒈C/C++語言子集的語法定義〈C/C++子集程序〉→〈變量說明〉〈分程序〉?!醋兞空f明〉→〈空〉|VAR〈變量表〉:INTEGER;〈變量表〉→〈變量〉|〈變量〉,〈變量表〉〈變量〉→〈標(biāo)識符〉〈分程序〉→BEGIN〈語句組〉END〈語句組〉→〈語句〉|〈語句〉;〈語句組〉〈語句〉→〈賦值語句〉|〈條件語句〉|〈WHILE語句〉|〈分程序〉〈賦值語句〉→〈變量〉:=〈算術(shù)表達(dá)式〉〈條件語句〉→IF〈布爾表達(dá)式
4、〉THEN〈語句〉ELSE〈語句〉2-----------------------Page3-----------------------〈WHILE語句〉→WHILE〈布爾表達(dá)式〉DO〈語句〉〈算術(shù)表達(dá)式〉→〈項〉|〈算術(shù)表達(dá)式〉+〈項〉|〈算術(shù)表達(dá)式〉-〈項〉〈項〉→〈初等量〉|〈項〉*〈初等量〉|〈項〉/〈初等量〉〈初等量〉→〈無符號數(shù)〉|〈變量〉|(〈算術(shù)表達(dá)式〉)〈關(guān)系表達(dá)式〉→〈算術(shù)表達(dá)式〉〈關(guān)系運(yùn)算符〉〈算術(shù)表達(dá)式〉〈標(biāo)識符〉→〈字母〉|〈標(biāo)識符〉〈字母〉|〈標(biāo)識符〉〈數(shù)字〉〈無符號數(shù)〉→〈數(shù)字〉|〈
5、無符號數(shù)〉〈數(shù)字〉〈關(guān)系運(yùn)算符〉→〈
6、〈=
7、=
8、〉=
9、〉
10、〈〉〈字母〉→A│B│C│D│E│F│G│H│I│J│K│L│M│N│O│P│Q│R│S│T││U│V│W│X│Y│Z〈數(shù)字〉→1│2│3│4│5│6│7│8│9│0實(shí)驗1詞法分析介紹詞法分析程序的編程與調(diào)試。(2學(xué)時)一、目的與要求1)目的通過設(shè)計調(diào)試詞法分析程序,實(shí)現(xiàn)從源程序中分出各種單詞的方法;加深對課堂教學(xué)的理解;提高詞法分析方法的實(shí)踐能力。2)要求⑴掌握從源程序文件中讀取有效字符的方法和產(chǎn)生源程序的內(nèi)部表示文件的方法。⑵掌握詞法分析的實(shí)現(xiàn)方法。⑶上
11、機(jī)調(diào)試編出的詞法分析程序。二、實(shí)踐題⒈題目用C/C++語言編寫前述C/C++子集的詞法分析程序。1)主程序設(shè)計考慮,(參閱后面給出的程序框架)主程序的說明部分為各種表格和變量安排空間。3-----------------------Page4-----------------------數(shù)組k為關(guān)鍵字表,每個數(shù)組元素存放一個關(guān)鍵字。采用定長的方式,較短的關(guān)鍵字后面補(bǔ)空格。P數(shù)組存放分界符。為了簡單起見,分界符、算術(shù)運(yùn)算符和關(guān)系運(yùn)算符都放在p表中(學(xué)生編程時,應(yīng)建立算術(shù)運(yùn)算符表和關(guān)系運(yùn)算符表,并且各有類號),合并成一
12、類。id和ci數(shù)組分別存放標(biāo)識符和常數(shù)。instring數(shù)組為輸入源程序的單詞緩存。outtoken記錄為輸出內(nèi)部表示緩存。還有一些為造表填表設(shè)置的變量。主程序開始后,先以人工方式輸入關(guān)鍵字,造k表;再輸入分界符等造p表。主程序的工作部分設(shè)計成便于調(diào)試的循環(huán)結(jié)構(gòu)。每個循環(huán)處理一個單詞;接收鍵盤上送來的一個單詞;調(diào)用詞法分析過程;輸出每個單詞的內(nèi)部碼。2)詞法分析過程考慮該過程取名為lexical,它根據(jù)輸入單詞的第一個字符(有時還需讀第二個字符),判斷單詞類,產(chǎn)生類號:以字符k表示關(guān)鍵字;i表示標(biāo)識符;c表示常數(shù);
13、p表示分界符;s表示運(yùn)算符(學(xué)生編程時類號分別為1,2,3,4,5)。對于標(biāo)識符和常數(shù),需分別與標(biāo)識符表和常數(shù)表中已登記的元素相比較,如表中已有該元素,則記錄其在表中的位置,如未出現(xiàn)過,將標(biāo)識符按順序填入數(shù)組id中,將常數(shù)變?yōu)槎M(jìn)制形式存入數(shù)組中ci中,并記錄其在表中的位置。lexical過程中嵌有兩個小過程:一個名為getchar,其功能為從instrin