編譯原理實(shí)驗(yàn)指導(dǎo)書(shū)(2008-2009)_第1頁(yè)
編譯原理實(shí)驗(yàn)指導(dǎo)書(shū)(2008-2009)_第2頁(yè)
編譯原理實(shí)驗(yàn)指導(dǎo)書(shū)(2008-2009)_第3頁(yè)
編譯原理實(shí)驗(yàn)指導(dǎo)書(shū)(2008-2009)_第4頁(yè)
編譯原理實(shí)驗(yàn)指導(dǎo)書(shū)(2008-2009)_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、編譯原理實(shí)驗(yàn)指導(dǎo)書(shū)合肥學(xué)院計(jì)算編譯原理實(shí)驗(yàn)指導(dǎo)書(shū)實(shí)驗(yàn)一 詞法分析一、實(shí)驗(yàn)?zāi)康模?通過(guò)設(shè)計(jì)編制調(diào)試一個(gè)具體的詞法分析程序,加深對(duì)詞法分析原理的理解。并掌握在對(duì)程序設(shè)計(jì)語(yǔ)言源程序進(jìn)行掃描過(guò)程中將其分解為各類單詞的詞法分析方法。編制一個(gè)讀單詞過(guò)程,從輸入的源程序中,識(shí)別出各個(gè)具有獨(dú)立意義的單詞,即基本保留字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、分隔符五大類。并依次輸出各個(gè)單詞的內(nèi)部編碼及單詞符號(hào)自身值。(遇到錯(cuò)誤時(shí)可顯示“Error”,然后跳過(guò)錯(cuò)誤部分繼續(xù)顯示)二、實(shí)驗(yàn)預(yù)習(xí)提示 1、  詞法分析器的功能和輸出格式詞法分析器的功能是輸入源程序,輸出單詞符號(hào)。詞法分析器的單詞符號(hào)常常表示成以下的二元式(單詞

2、種別碼,單詞符號(hào)的屬性值)。本實(shí)驗(yàn)中,采用的是一類符號(hào)一種別碼的方式。2、  單詞的BNF表示<標(biāo)識(shí)符><字母><字母數(shù)字串><字母數(shù)字串<字母><字母數(shù)字串>|<數(shù)字><字母數(shù)字串>|<下劃線><字母數(shù)字串|<無(wú)符號(hào)整數(shù)<數(shù)字><數(shù)字串><數(shù)字串><數(shù)字><數(shù)字串> |<加法運(yùn)算符> +<減法運(yùn)算符> -<大于關(guān)系運(yùn)算符>><大于等于關(guān)系運(yùn)算符>>=3

3、、“超前搜索”方法詞法分析時(shí),常常會(huì)用到超前搜索方法。如當(dāng)前待分析字符串為“>=”,當(dāng)前字符為>,此時(shí),分析器倒底是將其分析為大于關(guān)系運(yùn)算符還是大于等于關(guān)系運(yùn)算符呢?顯然,只有知道下一個(gè)字符是什么才能下結(jié)論。超前讀了一個(gè)字符=,所以要回退一個(gè)字符,詞法分析器才能正常運(yùn)行。在分析標(biāo)識(shí)符,無(wú)符號(hào)整數(shù)等時(shí)也有類似情況。4、模塊結(jié)構(gòu)三、實(shí)驗(yàn)過(guò)程和指導(dǎo): (一)準(zhǔn)備:1.閱讀課本有關(guān)章節(jié),明確語(yǔ)言的語(yǔ)法,寫出基本保留字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、分隔符和程序例。2.初步編制好程序。3.準(zhǔn)備好多組測(cè)試數(shù)據(jù)。(二)上課上機(jī): 將源代碼拷貝到機(jī)上調(diào)試,發(fā)現(xiàn)錯(cuò)誤,再修改完善。第二次上機(jī)調(diào)試通過(guò)。(三)程

4、序要求:程序輸入/輸出示例:如源程序?yàn)镃語(yǔ)言。輸入如下一段:main()                                            

5、                             int a,b;a = 10; b = a + 20;要求輸出如下圖。(2,”main”)(5,”(“)(5,”)“)(5,”“)(1,”int”)(2,”a”)(5,”,”)(2,”b”)(5,”;”)(2,”a”)(4,”=”)(3,”10”)(5,”;”)

6、(2,”b”)(4,”=”)(2,”a”)(4,”+”)(3,”20”)(5,”;”)(5,”“)要求:識(shí)別保留字:if、int、for、while、do、return、break、continue;單詞種別碼為1。其他的都識(shí)別為標(biāo)識(shí)符;單詞種別碼為2。常數(shù)為無(wú)符號(hào)整形數(shù);單詞種別碼為3。運(yùn)算符包括:+、-、*、/、=、<、=、<=、!= ;單詞種別碼為4。分隔符包括:,、;、(、); 單詞種別碼為5。(四)程序思路(僅供參考):這里以開(kāi)始定義的C語(yǔ)言子集的源程序作為詞法分析程序的輸入數(shù)據(jù)。在詞法分析中,自文件頭開(kāi)始掃描源程序字符,一旦發(fā)現(xiàn)符合“單詞”定義的源程序字符串時(shí),將它翻譯

7、成固定長(zhǎng)度的單詞內(nèi)部表示,并查填適當(dāng)?shù)男畔⒈?。?jīng)過(guò)詞法分析后,源程序字符串(源程序的外部表示)被翻譯成具有等長(zhǎng)信息的單詞串(源程序的內(nèi)部表示),并產(chǎn)生兩個(gè)表格:常數(shù)表和標(biāo)識(shí)符表,它們分別包含了源程序中的所有常數(shù)和所有標(biāo)識(shí)符。0.定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。1.初始化:從文件將源程序全部輸入到字符緩沖區(qū)中。2.取單詞前:去掉多余空白。3.取單詞后:去掉多余空白(可選,看著辦)。4.取單詞:利用實(shí)驗(yàn)一的成果讀出單詞的每一個(gè)字符,組成單詞,分析類型。(關(guān)鍵是如何判斷取單詞結(jié)束?取到的單詞是什么類型的單詞?)5.顯示結(jié)果。(五)練習(xí)該實(shí)驗(yàn)的目的和思路:程序開(kāi)始變得復(fù)雜起來(lái),可能是大家目前編過(guò)的

8、程序中最復(fù)雜的,但相對(duì)于以后的程序來(lái)說(shuō)還是簡(jiǎn)單的。因此要認(rèn)真把握這個(gè)過(guò)渡期的練習(xí)。本實(shí)驗(yàn)和以后的實(shí)驗(yàn)相關(guān)。通過(guò)練習(xí),掌握對(duì)字符進(jìn)行靈活處理的方法。(六)設(shè)計(jì)要求1、 用Java編寫,最好有圖形界面2、給出各單詞符號(hào)的類別編碼。3、詞法分析程序應(yīng)能發(fā)現(xiàn)輸入串中的錯(cuò)誤。4、詞法分析作為單獨(dú)一遍編寫,詞法分析結(jié)果為二元式序列組成的中間文件。5、設(shè)計(jì)兩個(gè)測(cè)試用例(盡可能完備),并給出測(cè)試結(jié)果。 6、編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。實(shí)驗(yàn)二 遞歸下降分析法一、實(shí)驗(yàn)?zāi)康模?    根據(jù)某一文法編制調(diào)試遞歸下降分析程序,以便對(duì)任意輸入的符號(hào)串進(jìn)

9、行分析。本次實(shí)驗(yàn)的目的主要是加深對(duì)遞歸下降分析法的理解。二、實(shí)驗(yàn)預(yù)習(xí)提示 1、遞歸下降分析法的功能詞法分析器的功能是利用函數(shù)之間的遞歸調(diào)用模擬語(yǔ)法樹(shù)自上而下的構(gòu)造過(guò)程。2、遞歸下降分析法的前提改造文法:消除二義性、消除左遞歸、提取左因子,判斷是否為L(zhǎng)L(1)文法,3、遞歸下降分析法實(shí)驗(yàn)設(shè)計(jì)思想及算法為G的每個(gè)非終結(jié)符號(hào)U構(gòu)造一個(gè)遞歸過(guò)程,不妨命名為U。U的產(chǎn)生式的右邊指出這個(gè)過(guò)程的代碼結(jié)構(gòu):(1)若是終結(jié)符號(hào),則和向前看符號(hào)對(duì)照,若匹配則向前進(jìn)一個(gè)符號(hào);否則出錯(cuò)。(2)若是非終結(jié)符號(hào),則調(diào)用與此非終結(jié)符對(duì)應(yīng)的過(guò)程。當(dāng)A的右部有多個(gè)產(chǎn)生式時(shí),可用選擇結(jié)構(gòu)實(shí)現(xiàn)。具體為:(1)對(duì)于每個(gè)非終結(jié)符號(hào)UX

10、1| X2| Xn處理的方法如下:U( )Read(ch);/當(dāng)前符號(hào)If ch in First(X1) 調(diào)用X1的子程序;else if ch in First(X2) 調(diào)用X2的子程序;else error()(2)對(duì)于每個(gè)右部X1Y1 Y 2Y n的處理架構(gòu)如下:調(diào)用Y1的子程序;調(diào)用Y 2的子程序;調(diào)用Y n的子程序(3)如果右部為空,則不處理。(4)對(duì)于右部中的每個(gè)符號(hào)Yi 如果Yi為終結(jié)符號(hào):if(Yi= = 當(dāng)前的符號(hào)) Read(ch);/ return; else error() 如果Yi為非終結(jié)符號(hào),直接調(diào)用相應(yīng)的子過(guò)程Yi()三、實(shí)驗(yàn)過(guò)程和指導(dǎo): (一)準(zhǔn)備: 1.閱讀

11、課本有關(guān)章節(jié),2.考慮好設(shè)計(jì)方案;3.設(shè)計(jì)出模塊結(jié)構(gòu)、測(cè)試數(shù)據(jù),初步編制好程序。(二)上課上機(jī): 將源代碼拷貝到機(jī)上調(diào)試,發(fā)現(xiàn)錯(cuò)誤,再修改完善。第二次上機(jī)調(diào)試通過(guò)。(三)程序要求:程序輸入/輸出示例: 對(duì)下列文法,用遞歸下降分析法對(duì)任意輸入的符號(hào)串進(jìn)行分析: (1)ETG(2)G+TG|TG(3)G(4)TFS(5)S*FS|/FS(6)S(7)F(E)(8)Fi輸出的格式如下:(1)遞歸下降分析程序,編制人:姓名,學(xué)號(hào),班級(jí)(2)輸入一以#結(jié)束的符號(hào)串(包括+*/()i#):在此位置輸入符號(hào)串例如:i+i*i# (3)輸出結(jié)果:i+i*i#為合法符號(hào)串  備注:輸入一符號(hào)串如i+i

12、*#,要求輸出為“非法的符號(hào)串”。引用也要改變)。注意:1.表達(dá)式中允許使用運(yùn)算符(+-*/)、分割符(括號(hào))、字符I,結(jié)束符#; 2.如果遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出錯(cuò)誤提示信息(該信息越詳細(xì)越好);3.對(duì)學(xué)有余力的同學(xué),可以詳細(xì)的輸出推導(dǎo)的過(guò)程,即詳細(xì)列出每一步使用的產(chǎn)生式。  (四)程序思路(僅供參考):0.定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。1.初始化:從文件將輸入符號(hào)串輸入到字符緩沖區(qū)中。2.利用遞歸下降分析法分析,對(duì)每個(gè)非終結(jié)符編寫函數(shù),在主函數(shù)中調(diào)用文法開(kāi)始符號(hào)的函數(shù)。(五)練習(xí)該實(shí)驗(yàn)的目的和思路: 程序開(kāi)始變得復(fù)雜起來(lái),需要利用到程序設(shè)計(jì)語(yǔ)言的知識(shí)和大量編程技巧,遞歸下降

13、分析法是一種較實(shí)用的分析法,通過(guò)這個(gè)練習(xí)可大大提高軟件開(kāi)發(fā)能力。通過(guò)練習(xí),掌握函數(shù)間相互調(diào)用的方法。(六)為了能設(shè)計(jì)好程序,注意以下事情:1.模塊設(shè)計(jì):將程序分成合理的多個(gè)模塊(函數(shù)),每個(gè)模塊做具體的同一事情。2.寫出(畫出)設(shè)計(jì)方案:模塊關(guān)系簡(jiǎn)圖、流程圖、全局變量、函數(shù)接口等。3.編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。實(shí)驗(yàn)三 LL(1)分析法一、實(shí)驗(yàn)?zāi)康模?     根據(jù)某一文法編制調(diào)試LL(1)分析程序,以便對(duì)任意輸入的符號(hào)串進(jìn)行分析。本次實(shí)驗(yàn)的目的主要是加深對(duì)預(yù)測(cè)分析LL(1)分析法的理解。二、實(shí)驗(yàn)預(yù)習(xí)提示 1、LL(1)分析

14、法的功能LL(1)分析法的功能是利用LL(1)控制程序根據(jù)顯示棧棧頂內(nèi)容、向前看符號(hào)以及LL(1)分析表,對(duì)輸入符號(hào)串自上而下的分析過(guò)程。2、LL(1)分析法的前提改造文法:消除二義性、消除左遞歸、提取左因子,判斷是否為L(zhǎng)L(1)文法,3、LL(1)分析法實(shí)驗(yàn)設(shè)計(jì)思想及算法三、實(shí)驗(yàn)過(guò)程和指導(dǎo): (一)準(zhǔn)備: 1.閱讀課本有關(guān)章節(jié),2.考慮好設(shè)計(jì)方案;3.設(shè)計(jì)出模塊結(jié)構(gòu)、測(cè)試數(shù)據(jù),初步編制好程序。(二)上課上機(jī): 將源代碼拷貝到機(jī)上調(diào)試,發(fā)現(xiàn)錯(cuò)誤,再修改完善。第二次上機(jī)調(diào)試通過(guò)。(三)程序要求:程序輸入/輸出示例: 對(duì)下列文法,用LL(1)分析法對(duì)任意輸入的符號(hào)串進(jìn)行分析: (1)ETG(2)G

15、+TG|TG(3)G(4)TFS(5)S*FS|/FS(6)S(7)F(E)(8)Fi輸出的格式如下:(1)LL(1)分析程序,編制人:姓名,學(xué)號(hào),班級(jí)(2)輸入一以#結(jié)束的符號(hào)串(包括+*/()i#):在此位置輸入符號(hào)串 (3)輸出過(guò)程如下:  步驟 分析棧 剩余輸入串 所用產(chǎn)生式 1Ei+i*i#E-TG  (4)輸入符號(hào)串為非法符號(hào)串(或者為合法符號(hào)串)  備注:(1)在“所用產(chǎn)生式”一列中如果對(duì)應(yīng)有推導(dǎo)則寫出所用產(chǎn)生式;如果為匹配終結(jié)符則寫明匹配的終結(jié)符;如分析異常出錯(cuò)則寫為“分析出錯(cuò)”;若成功結(jié)束則寫為“分析成功”。(2) 在此位置輸入符號(hào)串為用戶自行輸

16、入的符號(hào)串。(3)上述描述的輸出過(guò)程只是其中一部分的。   注意:1.表達(dá)式中允許使用運(yùn)算符(+-*/)、分割符(括號(hào))、字符i,結(jié)束符#; 2.如果遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出錯(cuò)誤提示信息(該信息越詳細(xì)越好);3.對(duì)學(xué)有余力的同學(xué),測(cè)試用的表達(dá)式事先放在文本文件中,一行存放一個(gè)表達(dá)式,同時(shí)以分號(hào)分割。同時(shí)將預(yù)期的輸出結(jié)果寫在另一個(gè)文本文件中,以便和輸出進(jìn)行對(duì)照;  (四)程序思路(僅供參考):模塊結(jié)構(gòu):(1)定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。(2)初始化:設(shè)立LL(1)分析表、初始化變量空間(包括堆棧、結(jié)構(gòu)體、數(shù)組、臨時(shí)變量等);(3)控制部分:從鍵盤輸入一個(gè)表達(dá)式符號(hào)串;

17、(4)利用LL(1)分析算法進(jìn)行表達(dá)式處理:根據(jù)LL(1)分析表對(duì)表達(dá)式符號(hào)串進(jìn)行堆棧(或其他)操作,輸出分析結(jié)果,如果遇到錯(cuò)誤則顯示錯(cuò)誤信息。(五)練習(xí)該實(shí)驗(yàn)的目的和思路: 程序相當(dāng)復(fù)雜,需要利用到大量的編譯原理,也用到了大量編程技巧和數(shù)據(jù)結(jié)構(gòu),通過(guò)這個(gè)練習(xí)可大大提高軟件開(kāi)發(fā)能力。(六)為了能設(shè)計(jì)好程序,注意以下事情:1.模塊設(shè)計(jì):將程序分成合理的多個(gè)模塊(函數(shù)),每個(gè)模塊做具體的同一事情。2.寫出(畫出)設(shè)計(jì)方案:模塊關(guān)系簡(jiǎn)圖、流程圖、全局變量、函數(shù)接口等。3.編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。實(shí)驗(yàn)四 算符優(yōu)先文法處理 一、實(shí)驗(yàn)?zāi)康恼莆账惴麅?yōu)先分析法的原理

18、,利用算符優(yōu)先分析法將賦值語(yǔ)句進(jìn)行語(yǔ)法分析,翻譯成等價(jià)的四元式表示。二、實(shí)驗(yàn)內(nèi)容: 1.算術(shù)表達(dá)式的文法可以是(你可以根據(jù)需要適當(dāng)改變):  EE+E|E-E|E*E|E/E|(E)|i 2.根據(jù)算符優(yōu)先分析法,將表達(dá)式進(jìn)行語(yǔ)法分析,判斷一個(gè)表達(dá)式是否正確。 3.將賦值語(yǔ)句進(jìn)行語(yǔ)法分析,翻譯成等價(jià)的一組基本操作,每一基本操作用四元式表示。 三、實(shí)驗(yàn)預(yù)習(xí)提示 1.實(shí)驗(yàn)原理  我們要分析的表達(dá)式滿足下面的算符優(yōu)先矩陣 21 +  -  *  /  (  )   +  >&#

19、160; >  <  <  <  >  > -  > >  <  <  <  > >  *  >  >  >  >  <  >  >  /  >  >  >  >  <  > 

20、0;>  (  <  <  <  <  <  =  )  >  >  >  >  >  >   <  <  <  <  <  =為實(shí)現(xiàn)算符優(yōu)先算法,可以使用兩個(gè)工作棧。一個(gè)叫做OPTR,用以寄存運(yùn)算符,一個(gè)叫OPND,用以寄存操作數(shù)或結(jié)果。算法描述如下:  1首先置操作數(shù)棧為空

21、棧,將表達(dá)式起始符;作為運(yùn)算符棧的棧底元素。 2依次讀入表達(dá)式中每個(gè)單詞,若是操作數(shù)則進(jìn)OPND棧,若是運(yùn)算符則轉(zhuǎn)3。  3將此運(yùn)算符1與OPTR棧頂元素2進(jìn)行比較,即查上表,若 12,則:1進(jìn)棧,轉(zhuǎn)2 若 12 ,如1為;,則分析成功,否則OPTR棧頂元素出棧,并轉(zhuǎn)2 若 1<2,則出棧OPND棧頂元素至b,又出棧其棧頂元素至a,出棧OPTR棧頂元素至t,進(jìn)行運(yùn)算r=a t b(t 為運(yùn)算符),并將結(jié)果r存入棧OPND后轉(zhuǎn)3。 若1和2之間無(wú)優(yōu)先關(guān)系,則報(bào)錯(cuò)。  四、實(shí)驗(yàn)步驟(一)準(zhǔn)備:

22、 1. 閱讀課本有關(guān)章節(jié),花一周時(shí)間確定算術(shù)表達(dá)式的文法,設(shè)計(jì)出算符優(yōu)先關(guān)系表; 2.考慮好設(shè)計(jì)方案; 3. 設(shè)計(jì)出模塊結(jié)構(gòu)、測(cè)試數(shù)據(jù),初步編制好程序。 (二)上課上機(jī):上機(jī)調(diào)試,發(fā)現(xiàn)錯(cuò)誤,分析錯(cuò)誤,再修改完善。教師根據(jù)學(xué)生的設(shè)計(jì)方案與學(xué)生進(jìn)行探討,以修改方案和代碼。(三)程序要求: 程序思路(僅供參考): 1.借用實(shí)驗(yàn)一的結(jié)果,可將其中的取字符函數(shù)幾乎原封不動(dòng)地移植過(guò)來(lái),其中的分割和分析單詞的方法可借用過(guò)來(lái)分割現(xiàn)在這個(gè)實(shí)驗(yàn)的運(yùn)算符、常量和變量。2.模塊結(jié)構(gòu):(1)初始化:設(shè)立算符優(yōu)先關(guān)系表(或優(yōu)先函數(shù))、初始化變量空間(包括堆棧、結(jié)構(gòu)體、數(shù)組、臨時(shí)變量等);(2

23、)控制部分:將一個(gè)表達(dá)式從文件中讀出;(3)詞法分析:將表達(dá)式分割成單詞序列;(4)利用算符優(yōu)先文法進(jìn)行表達(dá)式處理:根據(jù)算符優(yōu)先關(guān)系表(或優(yōu)先函數(shù))對(duì)表達(dá)式單詞序列進(jìn)行堆棧(或其他)操作,得到并保存四元組,如果遇到錯(cuò)誤則顯示錯(cuò)誤信息;(5)輸出四元組。 3.程序輸入/輸出示例: 如參考C語(yǔ)言的運(yùn)算符。輸入如下表達(dá)式(以分號(hào)為結(jié)束)和輸出結(jié)果: (1)10; 輸出:正確 (2)1+2; 輸出:正確 (3)(1+2)/3+4-(5+6/7); 輸出:正確(4)(1-2)/3+4 輸出:錯(cuò)誤 (5)1+2-3+(*4/5) 輸出:錯(cuò)誤 注意:1.為降低難度,表達(dá)式中不含變量(只含無(wú)符號(hào)整數(shù));2.如

24、果遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出錯(cuò)誤提示信息(該信息越詳細(xì)越好); 3.測(cè)試用的表達(dá)式事先放在文本文件中,一行存放一個(gè)表達(dá)式,同時(shí)以分號(hào)分割。同時(shí)將預(yù)期的輸出結(jié)果寫在另一個(gè)文本文件中,以便和輸出進(jìn)行對(duì)照; 4.對(duì)學(xué)有余力的同學(xué),可增加功能:當(dāng)判斷一個(gè)表達(dá)式正確時(shí),輸出計(jì)算結(jié)果,計(jì)算過(guò)程用浮點(diǎn)表示,但要注意不要被0除。附實(shí)驗(yàn)報(bào)告范例實(shí)驗(yàn)名稱:詞法分析 一、實(shí)驗(yàn)?zāi)康暮鸵?編制一個(gè)讀單詞過(guò)程,從輸入的源程序中,識(shí)別出各個(gè)具有獨(dú)立意義的單詞,即基本保留字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、分隔符五大類。 二、實(shí)驗(yàn)內(nèi)容和步驟:實(shí)驗(yàn)內(nèi)容 對(duì)于這個(gè)實(shí)驗(yàn),我總共用了四個(gè)函數(shù),即主函數(shù)、掃描函數(shù)、建立緩沖區(qū)、取單詞。主要完成的

25、功能是從緩沖區(qū)中識(shí)別出一個(gè)個(gè)單詞,并能夠區(qū)分所取的單詞是什么類型。 實(shí)驗(yàn)步驟 1、基于實(shí)驗(yàn)的內(nèi)容,構(gòu)造程序所需的模塊 2、根據(jù)已建構(gòu)的模塊,寫出各個(gè)模塊的相應(yīng)程序代碼 3、在主函數(shù)中調(diào)用模塊來(lái)完成所要得到的效果 在此,我想先介紹一下我的三個(gè)子模塊,第一個(gè)是掃描函數(shù)。掃描函數(shù)scanner(),其實(shí)大家都比較熟悉了,就是我們上次實(shí)驗(yàn)內(nèi)容,可以原封不動(dòng)的拿來(lái)用。它的功能是調(diào)用一次就從緩沖區(qū)中取一個(gè)字符出來(lái)。這為我們的取字符提供了基礎(chǔ),因此如果這個(gè)程序不會(huì)設(shè)計(jì)的話,那么這個(gè)實(shí)驗(yàn)就沒(méi)法設(shè)計(jì)了。至于建立第二個(gè)模塊,就是從文件中把一個(gè)個(gè)字符讀到緩沖區(qū),比較簡(jiǎn)單,我在這里就不想說(shuō)了。接下來(lái),我想比較地說(shuō)一下

26、第三個(gè)模塊,也就是本實(shí)驗(yàn)的主要要求。這個(gè)模塊的函數(shù)程序代碼如下: char getsym()/從緩沖區(qū)中取一個(gè)單詞  bool flag=false;/用來(lái)表示取出的單詞是否為關(guān)鍵詞,如果是則flag的值為true,否則為false  int k=-1; /表示取出的字符放在單詞數(shù)組的指針  CType='0' /預(yù)先定義的取出的單詞的類型 Lasttype='0' /初始化先前的類型,此變量為判斷正負(fù)數(shù)用  while (ch<=32&

27、#160;&& ch>0)/去掉不能顯示的字符 Fbuffer=scanner();  if (ch>='a'&& ch<='z'| ch>='A'&& ch<='Z')/取出標(biāo)識(shí)符或者是關(guān)鍵詞   k=-1;  while(true)/取出的單詞長(zhǎng)度不超過(guò)WMaxlen,如果超過(guò),則其后的字符無(wú)效    if(+k)<WMaxl

28、en)/(+k)為了使取出的單詞最長(zhǎng)為WMaxlen   Wordk=ch;   Fbuffer=scanner(); /如果取出的當(dāng)前的字符不是字母或是數(shù)字,則此次取單詞結(jié)束 if (!(ch>='a'&& ch<='z'| ch>='A'&& ch<='Z'|ch>='0' && ch<='9')  br

29、eak;     Word+k='0'/以'0'標(biāo)識(shí)取出單詞的結(jié)束,以方便后面的判斷此單詞是標(biāo)識(shí)符還是關(guān)鍵詞  for (int i=0;i<KEY_No;i+)/用來(lái)判斷取出的當(dāng)前單詞是不是關(guān)鍵詞 if (strcmp(Word,KEYi)=0)     flag=true; break;    if (flag) CType='1'/如果是關(guān)鍵詞,則把此單詞的類型定義為1型 &#

30、160;else CType='2' /否則是標(biāo)識(shí)符,其類型為2      else if (ch>='0' && ch<='9')/判斷是不是為整數(shù)     Word+k=ch;  Fbuffer=scanner();  while(true)/如果是數(shù)字,則一直接受,且定義它的類型為3  if(ch>='0' &&am

31、p; ch<='9')    Word+k=ch; Fbuffer=scanner();    else CType='3'break;/不是數(shù)字則跳出循環(huán) /如果以字母開(kāi)頭,且長(zhǎng)度不超過(guò)WMaxlen,且下面跟有字母,則此整數(shù)非法,輸出類型為8,在主程序中輸出出錯(cuò)信息  if (k<WMaxlen)  if (ch>='a'&& ch<='z'| ch

32、>='A'&& ch<='Z')    Word+k=ch;  Fbuffer=scanner();  /取這個(gè)非法整數(shù)的單詞,其中可包含英文字母和數(shù)字 while (ch>='a'&& ch<='z'| ch>='A'&& ch<='Z'| ch>='0' &&

33、; ch<='9'|Fbuffer=-1)  if (k<WMaxlen)  Word+k=ch;  Fbuffer=scanner();    else     Fbuffer=scanner();  k+;    if (k>WMaxlen)/如果長(zhǎng)度大于取出單詞定義的最大長(zhǎng)度,則返回類型為8,在主程序中打出出錯(cuò)信息  CType=Longtype;  else CType=Errtype

34、;/否則返回類型7,在主程序出錯(cuò),并明確寫出此單詞的具體內(nèi)容    Word+k='0'     else if (ch='+'|ch='-'|ch='*'|ch='/')/取出是運(yùn)算符號(hào)的單詞     Word+k=ch;  if (ch='+' | ch='-')/如果是+號(hào)或者是-號(hào),則還要判斷是不是正負(fù)數(shù)if (Lasttype

35、='6')/判斷其取出的當(dāng)前字母的前一個(gè)單詞是6號(hào)類型的,即是<、>、<=、>=、=、=時(shí)則可判斷現(xiàn)在取出的是整數(shù)     Fbuffer=scanner();  while(ch>='0' && ch<='9')/取出整數(shù)    Word+k=ch;  Fbuffer=scanner();    CType='3'/如果正負(fù)整數(shù),則直接返回類型為3,則表示此單詞為整數(shù)

36、 return(CType);    else Fbuffer=scanner();/如果不是整數(shù),則定義當(dāng)前取出的單詞是運(yùn)算符,定義此類型為4 Word+k='0'  CType='4'    else if (ch='>'|ch='<'|ch='='|ch='!')/取出運(yùn)算符的另幾類,即<、<=、>、>=、=、=、!=     W

37、ord+k=ch;Fbuffer=scanner();  if( ch='=')/判斷是不是<=、>=、=、!=     Word+k=ch;  Fbuffer=scanner();    Word+k='0'  for (int i=0;i<Sign_No;i+)/判斷取出的單詞是不是運(yùn)算符  if (strcmp(Signi,Word)=0)     flag=true;  break;    if (flag) CType='4'   Lasttype='6'     else if (ch=','|ch=''|ch=''|ch=''|ch='(&#

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論