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