




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、編譯技術(shù)實(shí)驗(yàn)報(bào)告一、 實(shí)驗(yàn)要求a) 詞法分析器實(shí)驗(yàn)概述:設(shè)計(jì)、編制、調(diào)試一個(gè)識(shí)別簡單語言單詞的詞法分析程序。具體要求:1) 識(shí)別該簡單語言的單詞符號(hào)。2) 根據(jù)表1-1區(qū)分單詞符號(hào)是該簡單語言的基本字、普通標(biāo)識(shí)符、運(yùn)算符、浮點(diǎn)數(shù)以及界符。3) 輸入為源程序字符串,以#結(jié)束;輸出是單詞符號(hào)的二元組。例如:輸入: x=9#,輸出:(10,x)(21,=)(20,9)。 單詞符號(hào)種別編碼單詞值main1int 2float3double4char5if 6else 7do8while9l(l|d)*10內(nèi)部字符串 ( +|-| ) dd*(.dd* | )( e ( +|-| ) dd*|) 20二
2、進(jìn)制數(shù)值表示=21+22- 23* 24/ 25(26)272829,30;31>32>=33<34<=35=36!=37'0'1000Error-1表1-1 某簡單語言的單詞表及其種別碼b) 語法分析器實(shí)驗(yàn)概述:設(shè)計(jì)、編制、調(diào)試一個(gè)識(shí)別簡單語言單詞的語法分析程序。具體要求:1) 根據(jù)簡單語言單詞表以及其種別碼(見表1-1)和以下語法結(jié)構(gòu)定義處理用戶提交的符合上述文法的源代碼序列,進(jìn)行語法分析,并給出語法是否正確的結(jié)論:<表達(dá)式> := <項(xiàng)> +<項(xiàng)>|-<項(xiàng)><項(xiàng)> := <因子>
3、;*<因子>|/<因子><因子> :=ID|num|(<表達(dá)式>)num:= ( +|-| ) 數(shù)字?jǐn)?shù)字*(.數(shù)字?jǐn)?shù)字* | )( e ( +|-| ) 數(shù)字?jǐn)?shù)字*|)ID:=字母(字母|d數(shù)字)*字母:=a|b|c|z|A|B|C|Z數(shù)字:=0|1|2|92) 輸入為源程序字符串,以#結(jié)束;輸出為語法是否正確的結(jié)論。例如:輸入:1+2#,輸出:success!二、 實(shí)驗(yàn)?zāi)康?1) 通過該實(shí)驗(yàn),熟練應(yīng)用編譯原理的基本理論和方法。2) 學(xué)會(huì)用C/C+高級(jí)程序設(shè)計(jì)語言設(shè)計(jì)一個(gè)詞法分析器和語法分析器的技術(shù)。3) 加深對(duì)編譯原理的分析理論的理解,培養(yǎng)動(dòng)手
4、實(shí)踐能力。三、 實(shí)驗(yàn)步驟1) 畫出識(shí)別上述簡單語言單詞的狀態(tài)轉(zhuǎn)換圖。2) 用C/C+語言編寫詞法分析程序(應(yīng)考慮能被語法分析程序調(diào)用)。3) 完善詞法分析程序的預(yù)處理,去除忽略輸入程序中的注釋、多余空格、回車換行符等。4) 設(shè)計(jì)實(shí)現(xiàn)語法分析程序(調(diào)用上述詞法程序分析單詞),采用遞歸下降分析法對(duì)算術(shù)表達(dá)式進(jìn)行語法分析。5) 設(shè)計(jì)若干用例,上機(jī)測(cè)試并通過所設(shè)計(jì)實(shí)現(xiàn)的語法分析器。四、 實(shí)驗(yàn)整體設(shè)計(jì)思想本實(shí)驗(yàn)的任務(wù)是完成編譯過程中的詞法分析和語法分析兩個(gè)階段。其中,詞法分析階段的基本任務(wù)是從以字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),并以二元組的形式輸出,以作為語法分析階段的輸入。而語法分析階
5、段的基本任務(wù)是將詞法分析階段產(chǎn)生的二元組作為輸入,根據(jù)語言的語法規(guī)則,識(shí)別出各種語法成分,并判斷該單詞符號(hào)序列是否是該語言的一個(gè)句子。在詞法分析階段,通過DOS環(huán)境手動(dòng)輸入字符串序列(以#作為結(jié)束標(biāo)志)作為帶分析的源程序,調(diào)用詞法掃描子程序?qū)⒆址远M的形式輸出(若有不屬于該語言單詞符號(hào)出現(xiàn),則進(jìn)行出錯(cuò)處理),詞法掃描子程序包括了對(duì)源程序的預(yù)處理(忽略多余空格、回車換行符等空白字符),以及對(duì)單詞的識(shí)別和分類,以形成(單詞種別,單詞自身的值)形式的二元組。在語法分析階段,采用自上而下的遞歸下降分析法,根據(jù)遞歸下降分析函數(shù)編寫規(guī)則來編寫相應(yīng)的函數(shù),在各個(gè)函數(shù)的分析過程中調(diào)用詞法分析程序中的掃描
6、程序,發(fā)出“取下一個(gè)單詞符號(hào)”的命令,以取得下一個(gè)單詞符號(hào)作語法分析。實(shí)驗(yàn)的整體設(shè)計(jì)思想可由以下圖示表示: 圖4-1實(shí)驗(yàn)整體設(shè)計(jì)思想五、 程序詳細(xì)算法設(shè)計(jì) a) 詞法分析部分 詞法分析的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。具體思路如下:首先建立關(guān)鍵字表,將關(guān)鍵字作為特殊標(biāo)示符處理,把它們預(yù)先安排在char * rwtab中,將需要被識(shí)別出的關(guān)鍵字存入表中,當(dāng)掃描程序識(shí)別出標(biāo)識(shí)符時(shí),查關(guān)鍵字表。如能查到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標(biāo)識(shí)符。主要變量說明: 用token存放構(gòu)成單詞符號(hào)的字符串
7、,sum存放雙精度浮點(diǎn)數(shù)單詞,syn 存放單詞符號(hào)的種別碼,f標(biāo)識(shí)數(shù)值的符號(hào),如果是正數(shù),則將f置1,如果是負(fù)數(shù),則將f置-1,ef標(biāo)識(shí)指數(shù)的符號(hào),如果是正數(shù),則將ef置1,如果是負(fù)數(shù),則將ef置-1。在主函數(shù)中讓用戶輸入要識(shí)別的符號(hào)串,然后將輸入的符號(hào)串讀入到prog函數(shù)中,遇#結(jié)束。再依次掃描prog中的每一個(gè)符號(hào),調(diào)用 scaner()子函數(shù)分析每一個(gè)符號(hào),再將分析的結(jié)果輸出,也是遇#結(jié)束。在scaner()子函數(shù)中,先將 token 全部置空初始化,然后讀一個(gè)字符,如果是空格,就接著往下讀,直到讀到一個(gè)非空格的字符,分析它是什么類型。 如果是字母類型,則接著往下讀,直到讀到非字母且非數(shù)
8、字的字符,存入token中,依次對(duì)比關(guān)鍵字表中的元素,如果相同,則將syn置為相應(yīng)的種別碼,如果全都掃描后沒發(fā)現(xiàn)相同的關(guān)鍵字,則為普通的標(biāo)識(shí)符,將syn置為10,返回主函數(shù)輸出。如果是數(shù)字類型或正負(fù)符號(hào),首先分析第一個(gè)符號(hào),看它是數(shù)字還是+,-符號(hào),如果是+,-符號(hào),先判斷它們是正負(fù)符號(hào)還是加減符號(hào),判斷的依據(jù)是這個(gè)符號(hào)的前一個(gè)符號(hào)是不是數(shù)字類型或者是),如果是,則是加減符號(hào),將syn置為相應(yīng)的種別碼,并將它存入token中返回主函數(shù)輸出,如果不是,則為正負(fù)號(hào),如果是正號(hào),則將f置1,如果是符號(hào),則將f置-1。接著讀下一個(gè)字符串,直到讀到一個(gè)不是數(shù)字的字符串位置,每讀一個(gè)數(shù)字字符,就將他們轉(zhuǎn)化
9、為相應(yīng)的數(shù)字,使用輾轉(zhuǎn)相乘法,每次都讓sum先自乘10,然后加上這個(gè)數(shù)字,這樣就將字符串表示的數(shù)字轉(zhuǎn)化成了相應(yīng)的數(shù)。這之后看下一個(gè)字符是不是小數(shù)點(diǎn),如果是小數(shù)點(diǎn),就接著讀下面的數(shù)字字符,轉(zhuǎn)化為響應(yīng)的數(shù)字,除以變量p,p初值為10,每再讀下一個(gè)字符,就讓p乘10,直到讀到非數(shù)字字符。檢查下一個(gè)字符是否為e或E,如果為e或者E,則讀下面的數(shù)字字符,將它們存在etemp的整型變量中,如果ef為正,則讓sum自乘etemp次的10,如果ef為負(fù),則讓sum自除etemp次的10。最后將syn置為20,返回主函數(shù)輸出。如果是其他單詞表的符號(hào),則將他們的 syn 置為相應(yīng)的種別碼,并將字符存到token
10、中返回主函數(shù)輸出。 b) 語法分析部分 (遞歸下降算法分析)語法分析的基本任務(wù)是使用詞法分析的結(jié)果,使用遞歸下降算法分析是否符合語法規(guī)則,如果符合,則輸出success,若果不符合,則輸出error。語法分析是在詞法分析的基礎(chǔ)上加上判斷是否符合語法規(guī)則的語句。設(shè)置整數(shù) tag1表示'+'/'-'出現(xiàn)的情況,1表示已出現(xiàn)過,0表示第一次出現(xiàn)在main函數(shù)最后調(diào)用express函數(shù)判斷,如果調(diào)用之后返回時(shí)syn = 0且k = 0,就輸出success,否則輸出error。其中k為設(shè)定的標(biāo)志,初值為0,如果在調(diào)用子函數(shù)的過程中如果有錯(cuò)誤,則置k為1。express函
11、數(shù),調(diào)用statement函數(shù),返回后看是否是+或-,如果是,則調(diào)用 scaner 函數(shù),再調(diào)用statement函數(shù),如果不是,進(jìn)行出錯(cuò)處理。statement函數(shù),調(diào)用factor函數(shù),返回后看是否是*或/,如果是,則調(diào)用scaner函數(shù),再調(diào)用factor函數(shù),如果不是,進(jìn)行出錯(cuò)處理。factor函數(shù),檢查是否標(biāo)識(shí)符,如果是,調(diào)用scaner函數(shù),如果不是,檢查是否是數(shù)值,如果是,調(diào)用scaner函數(shù),如果不是,檢查是否是(,如果不是,進(jìn)行出錯(cuò)處理,如果是,調(diào)用scaner函數(shù),再調(diào)用express函數(shù),返回后檢查是否是),如果不是,進(jìn)行出錯(cuò)處理,如果是,調(diào)用scaner函數(shù),返回。c)
12、語義分析部分語義分析時(shí)采用自下而上語法制導(dǎo)翻譯,分析時(shí)有如下的特點(diǎn): 1. 當(dāng)棧頂形成句柄執(zhí)行歸約時(shí),調(diào)用相應(yīng)的語義動(dòng)作。 2. 語法分析棧與語義分析棧同步操作。下面以簡單算術(shù)表達(dá)式語句的翻譯為例詳細(xì)說明算法設(shè)計(jì)。實(shí)現(xiàn)簡單算術(shù)表達(dá)式的翻譯一般采取下列步驟: i. 分析文法的中。ii. 設(shè)置一系列語義變量,定義語義過程,語義函數(shù)。iii. 修改文法,寫出每一規(guī)則式的語義子程序。iv. 擴(kuò)充LR分析棧,構(gòu)造LR分析表。對(duì)文法E->E+TE-TT;T->T*F|T/F|F;F->(E)|id 進(jìn)行翻譯時(shí), c) 設(shè)置語義變量:對(duì)非終結(jié)符E定義語義變量 E.place 。 d) E.
13、place 表示存放E值的變量名在符號(hào)表中的入口地址或臨時(shí)變量名的整數(shù)碼。e) 定義語義函數(shù)newtemp()用于門生一個(gè)新的臨時(shí)變量的名字,具體實(shí)現(xiàn)時(shí)每產(chǎn)生一個(gè)T,就及時(shí)送到符號(hào)表中,也可以不進(jìn)符號(hào)表,直接將單詞值用整數(shù)碼表示。f) 定義語義過程函數(shù)emit(T=arg1 op arg2),產(chǎn)生一個(gè)四元式,并及時(shí)填進(jìn)四元式表中。利用上面定義的語義變量、過程、函數(shù)等,根據(jù)文法,寫出每一個(gè)規(guī)則式的語義過程子程序。 1. E->E+T E.place=newtemp();Emit(E.place=E1.place+T.place);2. E->E-T E.place=newtemp()
14、;Emit(E.place=E1.place-T.place);3. T->T*F T.place=newtemp();E4. T->T/F T.place=newtemp();Emit(T.place=T1.place/F.place);5. F->idp=lookup();if(p!=NULL) F.place=p;else error;6. d)狀態(tài)轉(zhuǎn)換圖六、 程序流程框圖開始定義關(guān)鍵字表請(qǐng)用戶輸入字符串讀入用戶輸入的字符串輸出單詞二元組調(diào)用掃描子程序輸入串結(jié)束?是結(jié)束 掃描子程序部分:1讀取下一個(gè)字符忽略空格變量初始化321是否字母?拼標(biāo)識(shí)符 否是否關(guān)鍵字
15、?是否數(shù)字或正負(fù)號(hào)? Syn=10Syn為對(duì)應(yīng)關(guān)鍵字的單詞種別碼是否運(yùn)算符、界符等符號(hào)? 否 是對(duì)不同符號(hào)給出相應(yīng)的syn值返回報(bào)錯(cuò)返回2是+? 是應(yīng)為負(fù)號(hào)?應(yīng)為正號(hào)? 否 否是-? 是Syn=22是+? 否 否 是返回f=1 否是-?Syn=23返回f=-1 否讀取下一個(gè)字符是否數(shù)字?拼數(shù)到sum讀取下一個(gè)字符4443是否是e?是否數(shù)字?是否小數(shù)點(diǎn)?讀取下一個(gè)字符讀取下一個(gè)字符拼數(shù)到sum是ef=1?是否數(shù)字?是否-?是否+?ef=1 是否efl=-1 是 否拼數(shù)到etmp讀取下一個(gè)數(shù) Sum自除etmp次10Sum自乘etmp次104Syn=20回退一個(gè)字符返回a) 語法分析部分 (遞歸下
16、降算法分析)開始定義關(guān)鍵字表請(qǐng)用戶輸入字符串讀入用戶輸入的字符串調(diào)用掃描子程序調(diào)用語法檢查子程序已到字符串末尾且無錯(cuò)誤? 輸出error輸出success 是結(jié)束掃描子程序流程圖見詞法分析部分語法檢查子程序express流程圖如下:調(diào)用statement函數(shù)是否加減符號(hào)號(hào)? 否出錯(cuò)處理 是調(diào)用scaner調(diào)用statement函數(shù)Factor函數(shù)流程圖如下:調(diào)用factor函數(shù)是否乘除符號(hào)號(hào)? 否出錯(cuò)處理 是調(diào)用scaner調(diào)用factor函數(shù)是否(是否是數(shù)值是否標(biāo)識(shí)符 是 否 是 否出錯(cuò)處理 否 是調(diào)用scaner55調(diào)用express函數(shù)是否) 否出錯(cuò)處理調(diào)用scaner七、 函數(shù)相關(guān)說明
17、scaner() 函數(shù)相關(guān)說明: scaner() 函數(shù)的作用是掃描輸入字符串,并作出邏輯判斷。1) 首先將 token 數(shù)組置空,然后將讀輸入字符串的第一個(gè)字符; 2) 如果讀入的是一個(gè)數(shù)字,則調(diào)用 handleNum() 函數(shù); 3) 如果輸入的是一個(gè)字母字符,則繼續(xù)讀入下一個(gè)字符,直到讀入的字符不是字母字符或數(shù)字字符。如果讀入的是 "begin", "if", "then", "while", "do", "end" 其中的一個(gè),則按照他們各自對(duì)應(yīng)的編號(hào)輸出;如果讀入的
18、不是上述情況,則將這一串字符作為變量輸出; 4) 如果輸入的是 “+” “-”, 則需要判斷其后面跟的是不是數(shù)字。若輸入的不是數(shù)字,則輸出“+” “-”; 若輸出的是數(shù)字,則應(yīng)該進(jìn)行判斷:若“+”“-” 之前不是數(shù)字字符、字母字符和)時(shí),“+”“-” 應(yīng)該作為正負(fù)號(hào)處理,否則,應(yīng)該作為加減符號(hào)處理; 5) 若輸入的是#,則表示輸入的字符串已經(jīng)讀完,返回碼是0;6) 若輸入的是除上的其他情況,則分別對(duì)應(yīng)他們各自的種別碼依次輸出到屏幕上。 a) 詞法分析部分uvoid main()該函數(shù)輸出提示字符,接收輸入的字符串放入 prog 數(shù)組中,通過循環(huán)調(diào)用scaner函數(shù)直到syn=0(即接收到#).
19、uvoid scaner r()該函數(shù)是用來識(shí)別單詞符號(hào)(詞法分析器表格中給出)同時(shí)給出syn的值。b) 語法分析部分 (遞歸下降算法分析) 該程序共有四個(gè)函數(shù)uvoid main()該函數(shù)輸出提示字符,接收輸入的字符串放入prog 數(shù)組中,調(diào)用expression來判斷輸入的字符串是否是合法的表達(dá)式。最后根據(jù)K的值來輸出success或者error,k=0成功,k=1失敗。uvoid scaner()該函數(shù)和詞法分析器中scaner函數(shù)的功能一致,都是掃描輸入的字符串識(shí)別單詞符號(hào)。Factor() 函數(shù)相關(guān)說明: factor () 函數(shù)的作用是判斷出輸入的是各種字符單位。 1) 如果輸入的
20、種類碼是10、11、或者99,則說明輸入的是變量、整數(shù)或者浮點(diǎn)型數(shù),將他們輸出后繼續(xù)掃描; 2) 如果輸入的種類碼是27,說明輸入的是(,則判斷接下來輸入的是不是滿足 expression() 函數(shù)。若不滿足則發(fā)生錯(cuò)誤,若滿足,則分析接下來的是不是),若不是依舊報(bào)錯(cuò); 3) 若滿足文法 Fà(E)|id 所對(duì)應(yīng)的識(shí)別函數(shù),則開辟內(nèi)存空間,將對(duì)應(yīng)的四元式保存并輸出,若不滿足,則把kk置1;term()函數(shù)相關(guān)說明: term()函數(shù)的作用是判斷輸入的是否是由*/連接成的因式。 1)如果輸入的是*/, 則判斷接下來輸入的是不是滿足 factor() 函數(shù),若不滿足,則函數(shù)結(jié)束;若滿足,則
21、繼續(xù)循環(huán); 2)若滿足文法T=T*F|T/F|F所對(duì)應(yīng)的識(shí)別函數(shù),則開辟內(nèi)存空間,將對(duì)應(yīng)的四元式保存并輸出,若不滿足,則把kk置1;Expression() 函數(shù)相關(guān)說明:expression () 函數(shù)的作用是判斷輸入的是否是由 +- 連接成的因式。1)如果輸入的是+-,則 判斷接下來輸入的是不是滿足 term()函數(shù),若不滿足,則函數(shù)結(jié)束,若滿足,則繼續(xù)循環(huán);2)若滿足文法E=E+T|E-T|T所對(duì)應(yīng)的識(shí)別函數(shù),則開辟內(nèi)存空間,將對(duì)應(yīng)的四元式保存并輸出,若不滿足,則把kk置1;八、 程序運(yùn)行結(jié)果(屏幕截圖) 八 語法分析器使用說明1)安裝VC+6.0軟件2)打開語法分析器源程序3)編譯運(yùn)行
22、源程序4)若正確運(yùn)行,根據(jù)提示字符輸入一個(gè)字符串,以#結(jié)尾5)若輸入的是一個(gè)正確的表達(dá)式,則輸出提示符success!否則,輸出提示符error!。九、 總結(jié) 體會(huì)由于課堂上的上,學(xué)習(xí)的東西比較淺,難免眼高手低,故而,通過實(shí)驗(yàn)和課程,遇到了很多課本上面見不到的問題,完成實(shí)驗(yàn)后,個(gè)人在成就感的同時(shí),也學(xué)習(xí)到了編程的具體過程中的很多知識(shí)。 通過一定的程序編輯,可以將我們輸入的一個(gè)句子進(jìn)行分離和剖析來檢查一定內(nèi)容的錯(cuò)誤,也能判斷我們輸入的某段東西的對(duì)錯(cuò)。 然后,對(duì)代碼的規(guī)格化有了更新的認(rèn)識(shí)。 需要很多層次的判斷。最后,代碼規(guī)范化很重要,好的代碼,在復(fù)查和測(cè)試中能夠給我們很大幫助。.十、 源程序清單#
23、include <stdio.h>#include <stdlib.h>#include<math.h>#include<string.h>struct Quadchar result12;char ag112;char op12;char ag212;char prog80,token8;char *temp9="main","int","float","double","char","if","else"
24、,"do","while"char ch;int sum,syn,p,m,n;int intOrDou;double dou;int Flag;int IsSuccess=0;int NXQ=0,suffix=0,ntc,nfc; struct Quad *quad;void lrparser();void lanblock(int *a);void lanbar(int *a);void statement(int *a);char *expression();char *term();void condition();char *factor();i
25、nt degit(char ch);int letter(char ch);int Int();void Double();void scaner();void main()p=0;printf("nPlease enter a string,and end with # :n");doch=getchar();progp+=ch;while(ch!='#');p=0;m=0;n=0;intOrDou=0; sum=0;dou=0.0;Flag=2;syn=0;quad=(Quad *)malloc(strlen(prog)*sizeof(Quad);NXQ
26、=1;suffix=0;ntc=nfc=1;scaner();lrparser();void emit(char *op,char *ag1,char *ag2,char *result) /生成四元式sprintf(quadNXQ.op,op);sprintf(quadNXQ.ag1,ag1);sprintf(quadNXQ.ag2,ag2);sprintf(quadNXQ.result,result);NXQ+;return;void Printemit() /打印四元式int nloop;for(nloop=1;nloop<NXQ;nloop+)printf("n(%s:
27、 %s,t%s,t%s)",quadnloop.op,quadnloop.ag1,quadnloop.ag2,quadnloop.result);char *newtemp() /產(chǎn)生臨時(shí)變量char*p;char m8;p=(char *)malloc(8);suffix+;itoa(suffix,m,10);strcpy(p+1,m);p0='t'return(p);int merg(int p1,int p2)int p,Result;if(p2=0) Result=p1;elseResult=p=p2;while(atoi(quadp.result)p=ato
28、i(quadp.result);sprintf(quadp.result,"%s",p1);return Result;void bp(int p,int t)int w,q=p;while(q)w=atoi(quadq.result);sprintf(quadq.result,"%d",t);q=w;return;char *factor()char *fplace;fplace=(char *)malloc(12);strcpy(fplace,"");if(syn=10)strcpy(fplace,token);scaner();
29、elseif(syn=20)if(intOrDou=1)itoa(sum,fplace,10); if(intOrDou=2) gcvt(dou,5,fplace);scaner();elseif(syn=26)scaner();fplace=expression();if(syn=27)scaner();return (fplace);void condition(int *etc,int *efc)char *op,*ep1,*ep2,*tp;char strtemp4;op=(char *)malloc(3);ep1=(char *)malloc(12);ep2=(char *)mall
30、oc(12);tp=(char *)malloc(12);ep1=expression();if(syn=32|syn=33|syn=34|syn=35|syn=36|syn=37)sprintf(op,"%s",token); scaner();ep2=expression();*etc=NXQ;*efc=NXQ+1;sprintf(strtemp,"j%s",op);emit(strtemp,ep1,ep2,"0");emit("j","","","0"
31、;);char * term()char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt=(char *)malloc(12);strcpy(eplace,factor();while(1)if(syn=24|syn=25)strcpy(tt,token);scaner();strcpy(ep2,factor();strcpy(tp,newtemp();emit(tt,eplace,ep2,tp);strcpy(eplace,tp);else break
32、;return eplace;char * expression()char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt=(char *)malloc(12);strcpy(eplace,term();while(1)if(syn=22|syn=23)strcpy(tt,token);scaner();strcpy(ep2,term();strcpy(tp,newtemp();emit(tt,eplace,ep2,tp);strcpy(eplace,
33、tp);else break;return eplace;void statement(int *nchain)char *str,*ep1;str=(char *)malloc(255);ep1=(char *)malloc(255);int nchaintemp,nwquad;if(syn=10)strcpy(str,token);scaner();if(syn=21)scaner();strcpy(ep1,expression();emit("=",ep1,"",str);*nchain=0;return;else return;elseif(sy
34、n=6)scaner();condition(&ntc,&nfc);bp(ntc,NXQ);lanblock(&nchaintemp);*nchain=merg(nchaintemp,nfc);return;elseif(syn=9)scaner();nwquad=NXQ;condition(&ntc,&nfc);bp(ntc,NXQ);lanblock(&nchaintemp);sprintf(str,"%d",nwquad);emit("j","","",str)
35、;*nchain=nfc;return;else return;void lanbar(int nchain)statement(&nchain);while(syn=31)scaner();bp(nchain,NXQ); statement(&nchain);bp(nchain,NXQ);return;void lanblock(int *nchain)if(syn=28)scaner();lanbar(*nchain);if(syn=29)IsSuccess=1;scaner();return;else return;else return;void lrparser()i
36、nt nchain=0;if(syn=1)scaner();if(syn=26)scaner();if(syn=27)scaner();lanblock(&nchain);if(syn=0&&IsSuccess=1)Printemit();else printf("n Failed!n");else printf("n Failed!n");else printf("n Failed!n");else printf("n Failed!n");int degit(char ch)if(ch&
37、gt;='0'&&ch<='9')return 1;else return -1;int letter(char ch)if(ch>='a'&&ch<='z'|ch>='A'&&ch<='Z')return 1;elsereturn -1;int Int()int sum1=0;while(degit(ch)=1)sum1=sum1*10+ch-'0'tokenm+=ch;ch=progp+;return
38、sum1;void Double()int sum1=0;while(degit(ch)=1)dou=dou*10+ch-'0'tokenm+=ch;ch=progp+;if(ch='.')tokenm+=ch;ch=progp+;int count=1;while(degit(ch)=1)dou=dou+(ch-'0')/pow(10,count);count+;tokenm+=ch;ch=progp+;if(ch='e')char flag;tokenm+=ch;ch=progp+;if(ch='-'|ch=&
39、#39;+')flag=ch;tokenm+=ch;ch=progp+;if(ch='+'|ch='-')tokenm+=ch;ch=progp+;while(degit(ch)=1)tokenm+=ch;ch=progp+;p-;syn=-1;return;elsewhile(degit(ch)=1)sum1=sum1*10+ch-'0'tokenm+=ch;ch=progp+;if(flag='+')dou=dou*pow(10,sum1);elsedou=dou/pow(10,sum1);p-;syn=20;intO
40、rDou=2;return;elsewhile(degit(ch)=1)sum1=sum1*10+ch-'0'tokenm+=ch;ch=progp+;dou=dou*pow(10,sum1);syn=20;intOrDou=2;return;syn=20;intOrDou=2;p-;void scaner()for(int i=0;i<8;i+)tokeni=NULL;m=0;sum=0;dou=0.0;ch=progp+;intOrDou=0;while(ch=' '|ch=10|ch=9)ch=progp+;if(letter(ch)=1)while
41、(ch>='a'&&ch<='z'|ch>='0'&&ch<='9')tokenm+=ch;ch=progp+;p-;syn=10;tokenm+='0'for(int i=0;i<9;i+)if(strcmp(token,tempi)=0)syn=i+1;break;elseif(degit(ch)=1)int r=p;while(degit(ch)=1)ch=progr+;if(ch!='e'&&ch!='.&
42、#39;)ch=progp-1;sum=Int();if(letter(ch)=1)syn=-1;while(letter(ch)=1)ch=progp+;p-;return;p-;syn=20;intOrDou=1;return;elsech=progp-1;Double();intOrDou=2;return;else switch(ch)case '+':m=0; tokenm+=ch; ch=progp+; if(ch='+'|ch='-')&&Flag=2) Flag-; syn=22; p-; tokenm+='
43、;0' return; if(Flag=1&°it(ch)=1) Flag=2; int r=p; while(degit(ch)=1) ch=progr+; if(ch!='e'&&ch!='.') ch=progp-1; sum=Int(); if(letter(ch)=1) syn=-1; while(letter(ch)=1) ch=progp+; p-; return; p-; syn=20; intOrDou=1; return; else ch=progp-1; Double(); intOrDou=2; return; tokenm+='0' syn=22; p-; break;case '-':m=0; tokenm+=ch; ch=progp+; if(ch='+'
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 解除聘用司機(jī)協(xié)議書
- 門面解除合同協(xié)議書
- 避孕節(jié)育措施協(xié)議書
- 農(nóng)業(yè)合作社合同協(xié)議書
- 兩個(gè)人分包合同協(xié)議書
- 鋼筋工程出資協(xié)議書
- 餐桌合作合同協(xié)議書
- cbd土地置換協(xié)議書
- 鏟車機(jī)器轉(zhuǎn)讓協(xié)議書
- 轉(zhuǎn)讓寵物診所協(xié)議書
- 材料科學(xué)基礎(chǔ)chp1-原子結(jié)構(gòu)與鍵合課件
- (完整word版)餐券模板
- 《滑炒技法-滑炒雞絲菜肴制作》說課課件
- 減速機(jī)設(shè)備維修技術(shù)標(biāo)準(zhǔn)
- GB/T 26480-2011閥門的檢驗(yàn)和試驗(yàn)
- 中文版自殺可能量表
- 裝飾藝術(shù)運(yùn)動(dòng)課件
- 【審計(jì)工作底稿模板】FH應(yīng)付利息
- 工貿(mào)企業(yè)安全管理臺(tái)賬資料
- 三方協(xié)議書(消防)
- 預(yù)激綜合征臨床心電圖的當(dāng)前觀點(diǎn)
評(píng)論
0/150
提交評(píng)論