




版權(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) 2 詞法分析程序的設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康恼莆沼?jì)算機(jī)語(yǔ)言的詞法分析程序的開發(fā)方法。二、實(shí)驗(yàn)內(nèi)容編制一個(gè)能夠分析三種整數(shù)、標(biāo)識(shí)符、主要運(yùn)算符和主要關(guān)鍵字的詞法分析程序。三、實(shí)驗(yàn)要求1、根據(jù)以下的正規(guī)式,編制正規(guī)文法,畫出狀態(tài)圖; 標(biāo)識(shí)符(|)*十進(jìn)制整數(shù)0 | (1|2|3|4|5|6|7|8|9)( 0|1|2|3|4|5|6|7|8|9) *)八進(jìn)制整數(shù)0(1|2|3|4|5|6|7)( 0|1|2|3|4|5|6|7) *十六進(jìn)制整數(shù)0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|)f ( 0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|)f *運(yùn)算符和界符+
2、- * / = ( ) ;關(guān)鍵字if then else while do2、根據(jù)狀態(tài)圖,設(shè)計(jì)詞法分析函數(shù)int scan( ) ,完成以下功能:1) 從文本文件中讀入測(cè)試源代碼,根據(jù)狀態(tài)轉(zhuǎn)換圖,分析出一個(gè)單詞,2) 以二元式形式輸出單詞 其中單詞種類用整數(shù)表示:0:標(biāo)識(shí)符1:十進(jìn)制整數(shù)2:八進(jìn)制整數(shù)3:十六進(jìn)制整數(shù) 運(yùn)算符和界符,關(guān)鍵字采用一字一符,不編碼 其中單詞屬性表示如下: 標(biāo)識(shí)符,整數(shù)由于采用一類一符,屬性用單詞表示 運(yùn)算符和界符,關(guān)鍵字采用一字一符,屬性為空3、編寫測(cè)試程序,反復(fù)調(diào)用函數(shù) scan( ),輸出單詞種別和屬性。四、實(shí)驗(yàn)環(huán)境PC 微機(jī)DOS 操作系統(tǒng)或 Windows
3、操作系統(tǒng)Turbo C 程序集成環(huán)境或 Visual C+ 程序集成環(huán)境五、實(shí)驗(yàn)步驟1、 根據(jù)正規(guī)式,畫出狀態(tài)轉(zhuǎn)換圖;2、根據(jù)狀態(tài)圖,設(shè)計(jì)詞法分析算法;觀察狀態(tài)圖,其中狀態(tài)2、4、7、10 (右上角打了星號(hào))需要回調(diào)一個(gè)字符。聲明一些變量和函數(shù):ch:字符變量,存放最新讀進(jìn)的源程序字符。 strToken:字符串變量,存放構(gòu)成單詞符號(hào)的字符串。GetChar():子函數(shù),將下一輸入字符讀到ch中,搜索指示器前移一字符位置。GetBC():子函數(shù),檢查 ch中的字符是否為空白。若是,則調(diào)用GetChar()直至ch中進(jìn)入一個(gè)非空白字符。Concat():子函數(shù),將ch中的字符連接到 strTok
4、en之后。IsLetter():布爾函數(shù),判斷ch中的字符是否為字母。 lsDigit():布爾函數(shù),判斷ch中的字符是否為數(shù)字。Reserve。:整型函數(shù),對(duì)strToken中的字符串查找保留字表,若它是一個(gè)保留字則返回它的編碼,否則返回0。SearchOp():整型函數(shù),對(duì)ch查找運(yùn)算符和界符,若它是一個(gè)運(yùn)算符或界符,則返回它的編碼,否則返回0。Retract():子函數(shù),將搜索指示器回調(diào)一個(gè)字符位置,將ch置為空白字符。ProError():錯(cuò)誤處理函數(shù)。關(guān)鍵字保存在字符數(shù)組中,定義編碼為相對(duì)數(shù)組首地址的位置+1。保留子表順序如下: if ,then ,else ,while, do,則
5、相應(yīng)編碼為:1,2,3,4,5。運(yùn)算符和界符保存在字符數(shù)組中,編碼定義與關(guān)鍵字相同,順序如下: + ,- , * , / , , ,=,(,),;,編碼為:110。二元表單詞單詞種類屬性標(biāo)識(shí)符0單詞自身十進(jìn)制整數(shù)1單詞自身八進(jìn)制整數(shù)2單詞自身十六進(jìn)制整數(shù)3單詞自身運(yùn)算符和界符單詞自身-關(guān)鍵字單詞自身-算法如下:ch= ;strToken=” ”;GetBC();if(lsLetter() while(lsLetter() | IsDigit()Con cat();GetChar(); Retract();If(Reserve() printf( , strToken); else printf
6、(v,o,%s , strToken );else if( 1 =ch & ch = 9)while(lsDigit()Con cat();GetChar(); Retract();printf( , strToken );else if(ch= O)GetChar();if(ch =1 & ch = 0 & ch = 7) Con cat(); GetChar(); Retract();printf( , strToken );else if(ch= x)GetChar();while(IsDigit() | ch= a& ch=) Con cat(); GetChar(); Retract
7、();printf( , strToken ); else Retract();printf( );else if(SearchOp() printf( , ch );else ProError();3、米用C或C+語(yǔ)言,設(shè)計(jì)函數(shù)scan(),實(shí)現(xiàn)該算法;char GetChar( FILE* fp ) /讀取文件中的一個(gè)字符char ch;ch = fgetc( fp);return ch;char GetBC(FILE* fp ) /讀取文件的字符直至ch不是空白char ch;do ch = GetChar( fp); while (ch = | ch =t| ch =n);return
8、 ch;void Concat( char ch , char strToken ) / 將ch 中的字符連接到 strToken 之后char str2;str0 =ch;str1 =0;strcat( strToken ,str);int IsLetter( char ch) 為字母,是返回1,否則返回0int flag = 0;if ( ch = a & ch = 0 & ch = 9 ) flag = 1;return flag;/布爾函數(shù),判斷ch中的字符是否為數(shù)int Reserve( char strToken ) /整型函數(shù),對(duì)strToken中的字符串查找保留字表,若它是一個(gè)
9、保留字則返回它的編碼,否則返回0int code = 0,i;char keyword66 = if , then , else , while , do ;for (i = 0; i 5; i+) if (strcmp( strToken , keyWordi) = 0) code = i + 1;break;return code;int SearchOP( char ch) /整型函數(shù),對(duì)strToken中的字符串查找運(yùn)算符和界符,若它是一個(gè)運(yùn)算符或界符,則返回它的編碼,否則返回0int code = 0, i;char OP11 = +,- , * , / , = , ( , ) ,
10、;for (i = 0; i 10; i+) if ( ch = OPi) code = i + 1;break;return code;char Retract( FILE* fp , char ch) /子函數(shù),將搜索指示器回調(diào)一個(gè)字符位置,將ch置為空白字符ch =;fseek( fp , -1L, 1);return ch;void ProError( ) printf(輸入錯(cuò)誤! n);return ;/錯(cuò)誤處理函數(shù)FILE* scan( FILE* fp ) char ch;/輸出單個(gè)二元式char strToke n10; strToken0 =0;ch = GetBC( fp)
11、;/置strToken為空串/先讀取一個(gè)非空白的字符if (feof( fp)return fp;/判斷文件尾,是則返回調(diào)用程序if (IsLetter(ch) / 判斷標(biāo)識(shí)符while (IsLetter(ch) | IsDigit(ch) Con cat(ch, strToke n);ch = GetChar( fp);ch = Retract( fp ,ch);if (Reserve(strToken) / 判斷關(guān)鍵字printf( n , strToken);elseprintf( n , strToken);else if (ch =1 & ch = 9while (IsDigit(
12、ch) Con cat(ch, strToke n); ch = GetChar( fp);ch = Retract( fp , ch);printf( n , strToken);else if (ch =O ) ch = GetChar( fp);if (ch =1& ch =0 & ch =Con cat(ch, strToke n); ch = GetChar( fp);ch = Retract( fp , ch); printf( n , strToken);else if (ch =x ) ch = GetChar( fp);while (IsDigit(ch) | ch = Co
13、n cat(ch, strToke n); ch = GetChar( fp);/判斷十進(jìn)制整數(shù)/判斷八進(jìn)制整數(shù)7 ) /判斷十六進(jìn)制整數(shù)a & ch = f ) ch = Retract( fp , ch);printf(n , strToken);else /判斷十進(jìn)制的0ch = Retract( fp , ch);printf(n);else if (SearchOP(ch) /判斷運(yùn)算符和界符printf( n , ch);|else /出錯(cuò)ProError();return fp;4、編制測(cè)試程序(主函數(shù)main);#include using namespacestd;#defi
14、 ne NULLOnt main( ) FILE* fp;if (fp = fopen(C:UsersAdministratorWDesktopWCode.txt/以只讀方式打開文件,失敗則退岀程序prin tf( file can not ope n!);exit(0);r ) = NULLwhile (!feof(fp) /若不是文件尾則執(zhí)行循環(huán)fp = sca n(fp);/輸出單詞種類、屬性的二元式printf(詞法分析結(jié)果如下:n);fclose(fp);/關(guān)閉文件fp = NULL5、調(diào)試程序:讀入文本文件,檢查輸出結(jié)果。/避免指向非法內(nèi)存:Codelxt -記事本文件(F)扁輻(
15、E)植式3 章看 if data+920x3f then data=data+01;elsedata=da-ta-01;戈件(F)舉輯(日恪式(0)査蠶(V)報(bào)助(出 if (flag 0) thendo曲ta = data + 01, fl ag - flag + 0x89;while (dat a)|else-MMM辛 program.txrmM辛甘鴦 n-H_ if da5r+92vox3f fhen dafaudafa+ol 八e-sedafaudafaol 八f 一 IVAo . daQrvA+.VA- 一 92V Av.VA3 一 3fv hen . iv Ao . daQrv ahVAo . daQrvA+.VA2 一 IVA.VAe-seiv Ao . daQrv ah.VAo . daQrv A-.VA2v A一 .V七、實(shí)驗(yàn)報(bào)告要求實(shí)驗(yàn)報(bào)告應(yīng)包括以下幾個(gè)部分:1、詞法的正規(guī)式描述;2、變換后的 狀態(tài)圖;3、詞法分析程序的數(shù)據(jù)結(jié)構(gòu)與算法。八、思考題1、 詞法分析能否采用空格來(lái)區(qū)分單詞? 答:不能,因?yàn)槌绦虻恼Z(yǔ)法里有包括:;, , ,(,)等界符或 連接符號(hào)存在,這些符號(hào)符與單詞的連接無(wú)空格,用空格區(qū)分單詞將無(wú)法保證程序 語(yǔ)法的正確。2、 程序設(shè)計(jì)中哪些環(huán)節(jié)影響詞法分析的效率?如何提高效率? 答: 本程序在判斷關(guān)鍵
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年常見會(huì)計(jì)面試試題及答案
- 2025年c 開發(fā)筆試題及答案
- “去有風(fēng)的地方”春日風(fēng)箏主題暖場(chǎng)露營(yíng)文旅方案
- 2025年日本gd面試試題及答案
- 2025年寫字風(fēng)格測(cè)試題及答案
- 2025年中招速寫考試試題及答案
- 2025年濟(jì)寧二模物理試題及答案
- 2025年pest商務(wù)理論與實(shí)務(wù)試題及答案
- 2025年招聘公告筆試題庫(kù)及答案
- 2025年醫(yī)師編制面試試題及答案
- 兩、三位數(shù)乘一位數(shù)(連續(xù)進(jìn)位)(教案)-三年級(jí)上冊(cè)數(shù)學(xué)人教版
- 五年級(jí)數(shù)學(xué)(小數(shù)乘法)計(jì)算題及答案匯編
- 新質(zhì)生產(chǎn)力課件
- T-NAHIEM 101-2023 急診科建設(shè)與設(shè)備配置標(biāo)準(zhǔn)
- 【綠色家園你我共建】約會(huì)春天擁抱綠色-2024年3月12日植樹節(jié)主題班會(huì)(小學(xué)通用版)
- 解分式方程50題八年級(jí)數(shù)學(xué)上冊(cè)
- 手術(shù)患者vte預(yù)防
- 消化道出血應(yīng)急預(yù)案
- 2023年城市體檢基礎(chǔ)指標(biāo)體系
- 2024年《滕王閣序》原文及翻譯
- AI技術(shù)在保險(xiǎn)行業(yè)的應(yīng)用
評(píng)論
0/150
提交評(píng)論