編譯原理實(shí)驗(yàn)_詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
編譯原理實(shí)驗(yàn)_詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)_第2頁(yè)
編譯原理實(shí)驗(yàn)_詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)_第3頁(yè)
編譯原理實(shí)驗(yàn)_詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)_第4頁(yè)
編譯原理實(shí)驗(yàn)_詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、南華大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院實(shí)驗(yàn)報(bào)告(20182019學(xué)年度 第二學(xué)期)課程名稱編譯原理實(shí)驗(yàn)名稱詞法分析器的設(shè)計(jì)與 實(shí)現(xiàn)學(xué)號(hào)專業(yè)班級(jí)地點(diǎn)教師1 .實(shí)驗(yàn)?zāi)康募耙髮?shí)驗(yàn)?zāi)康募由顚?duì)詞法分析器的工作過程的理解;加強(qiáng)對(duì)詞法分析方法的掌握;能夠采 用一種編程語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的詞法分析程序;能夠使用自己編寫的分析程序?qū)?jiǎn)單 的程序段進(jìn)行詞法分析。實(shí)驗(yàn)要求1 .對(duì)單詞的構(gòu)詞規(guī)則有明確的定義;2 .編寫的分析程序能夠正確識(shí)別源程序中的單詞符號(hào);3 .識(shí)別出的單詞以種別碼,值的形式保存在符號(hào)表中,正確設(shè)計(jì)和維護(hù) 符號(hào)表;4 .對(duì)于源程序中的詞法錯(cuò)誤,能夠做出簡(jiǎn)單的錯(cuò)誤處理,給出簡(jiǎn)單的錯(cuò)誤 提示,保證順利完成整個(gè)源程序

2、的詞法分析;2 .實(shí)驗(yàn)步驟1 .詞法分析規(guī)則標(biāo)識(shí)符):=字母1標(biāo)識(shí)符X字母1標(biāo)識(shí)符X數(shù)字)常數(shù)數(shù)字|數(shù)字序列X數(shù)字)數(shù)字序列:=數(shù)字序列X數(shù)字,數(shù)字卜.字母::=a b|c|x|y|z數(shù)字 :=0|l 3|4|5|6|7 9運(yùn)算符:*關(guān)系運(yùn)算符1算術(shù)運(yùn)算符1邏輯運(yùn)算符1位運(yùn)算符| 賦值運(yùn)算符算數(shù)運(yùn)算符/ I. I-關(guān)系運(yùn)算符:=| ! = |=|=|=邏輯運(yùn)算符:二&&I II |!位運(yùn)算符:=&| | |!賦值運(yùn)算符:=| += |-= |/= |*=分界符:=,|;|(|)|1|: I / I/*/保留字:=main if elsewhile |do | for|.

3、 |void2.單詞符號(hào)的編碼單詞符號(hào)種別碼單詞符號(hào)種別碼main0>26if1二27else2<28while3二29do4130for51 = 31switch6二32case733int8(34double9)35float1036long11)37void12 38+13 39+二14140+1514116數(shù)字42一二17標(biāo)識(shí)符4318944&19/45&&20/46#21*22*=23/24/=253 .狀態(tài)轉(zhuǎn)換圖其它其它& ?,©4.算法分析詞法分析器工作的第一步是輸入源程序文本。為了更好地對(duì)單詞 符號(hào)識(shí)別,把輸入串預(yù)處理一下。

4、預(yù)處理主要濾掉空格,跳過注釋、換 行符等。對(duì)預(yù)處理后的輸入串依次掃描單個(gè)字符,使用if-while嵌套語(yǔ)句 和switch case語(yǔ)句判斷字符的類型,具體識(shí)別方法可看狀態(tài)轉(zhuǎn)換圖。 有時(shí)為了確定詞性,需要超前掃描,若超前掃描的字符對(duì)識(shí)別當(dāng)前單詞 無(wú)用處,則需要退還給輸入串,以備識(shí)別下一單詞字符時(shí)使用。若讀入的字符與單詞符號(hào)編碼表的字符匹配不上,則報(bào)錯(cuò),并輸 出出錯(cuò)行數(shù)。對(duì)識(shí)別處的單詞符號(hào)以(單詞符號(hào),種別碼)二元式的形 式輸出。3.實(shí)驗(yàn)容1 .流程圖2 .程序的變量與函數(shù)說明(1) input全局字符數(shù)組,用來存放輸入串(2) word全局字符數(shù)組,用來存放獲取到的單詞符號(hào),限定長(zhǎng)度為8(3)

5、 ch全局字符變量,用來存放最新讀入的字符(4) syn全局整型變量,(5) p全局整型變量,(6) in全局整型變量,(7) line全局整型變量,(8) keyword全局字符數(shù)組,(9) init()獲取輸入串(10) isKey()表示單詞符號(hào)的編碼表示當(dāng)前字符在input數(shù)組的位置表示最新讀入的字符在word數(shù)組的下標(biāo)當(dāng)前行數(shù)存放關(guān)鍵字判斷關(guān)鍵字的函數(shù),若參數(shù)數(shù)組中是關(guān)鍵字,則把syn置為該關(guān)鍵 字對(duì)應(yīng)的編碼并返回1,否則返回0(11) isLetter()判斷字母的函數(shù),若參數(shù)字符是字母,則返回1,否則返回0(12) isDigit()判斷數(shù)字的函數(shù),若參數(shù)字符是數(shù)字,則返回1,否

6、則返回0(13) isSpaceO判斷空白符的函數(shù),若參數(shù)字符是空格、TAB或換行符,則返回1, 否則返回0(14) scaner()掃描輸入串的函數(shù),對(duì)讀出的字符進(jìn)行判斷,若是單詞符號(hào)表中的 符號(hào),則將syn置為對(duì)應(yīng)的編碼3.源程序Sinclude <stdio. h>Sinclude <string. h>char input 1000;輸入串char word 8; 獲取到的單詞char ch;int syn;種別碼int p;int m;int line;行數(shù)關(guān)鍵字charkeyword8="main","if",&quo

7、t;else","while","do","for","switch","cas e“,"double","float”,long","void";void scaner(void);獲取輸入串void init ()(int i=0;printf(Mn please input a string(end with '#'):n"); doscanf(M%cM,&ch);inputi+=ch;while

8、(ch!='#');)判斷是不是關(guān)鍵字int isKey(char *str)(int n;for (n=0;n<13;n+)(if(strcmp(str,keywordn)-0)(syn=n;return 1;return 0; )判斷是不是數(shù)字 int isDigit(char c) (if (c>='0'&&c<二'9')return 1; elsereturn 0;)判斷是不是字母int isLetter(char c) (if (c<=*z'&&.c>='a,

9、) | | (c>=,A'&&c<='Z1) return 1;elsereturn 0;)int isSpace(char c) (if (c=f r |c=rtr |c=rnr)return 1;return 0;)void main()(init();輸入字符串line=0;p= 0;doscaner ();switch(syn)(case -1:string inprintf (wyou have input a wrong line %dn', line);break;default:printf (,r ( %s,%d ) nM,

10、 word, syn); break;)while(syn!=21);)void scaner(void)(清空wordfor(m=0;m<8;m+)(wordm=';)讀取字符ch二inputp+;m=0;當(dāng)ch為空格或換行符時(shí),繼續(xù)往下讀while(isSpace (ch)(if (ch=,nr)(line+;ch二inputp+;如果以字母開頭 if(isLetter(ch) (如果往后是字母或數(shù)字,把字符存入word中,然后往下繼續(xù) 讀串長(zhǎng)超過8則截?cái)鄔hile(isLetter(ch)I IisDigit(ch)&&m<8)(wordm+=ch;

11、ch二inputp+;)p;syn=43;wordm+='0';isKey (word) "/判斷是不是關(guān)鍵字如果是以數(shù)字開頭,并且往后是數(shù)字else if(isDigit(ch)(while(isDigit(ch) |ch=,. r)&&m<8)(wordm+=ch;ch二inputp+;)如果數(shù)字之后是字母,則出錯(cuò)if (isLetter(ch)(while(!isSpace(ch)(ch二inputp+;syn=-l;return ;)p;syn=42;) else(switch(ch)比較運(yùn)算符case '<': w

12、ordm+=ch; ch=inputp+; if(ch=,=') (syn=29;wordm+=ch; else(syn=28;p;break;case >:wordm+=ch; ch=inputp+; if(ch=,=') (syn=27;wordm+=ch; else(syn=26;p;break;case '!':ch=inputp+; if(ch=,=') (syn=31;wordm+=ch; else(syn=30;p;break;case r=,:wordm+=ch; ch=inputp+;if(chd')(syn=33;wor

13、dm+=ch;else(syn=32;p;break;算術(shù)運(yùn)算符+、二*、 case '+':wordm+=ch; ch=inputp+; if(ch=f+') (syn=15;wordm+=ch;else if(ch=,=,)(syn=14;wordm+=ch;else(syn=13;p;break;case '-':wordm+=ch; ch=inputp+; if(ch=,-1) (syn=18;wordm+=ch;else if(ch='=,)(syn=17;wordm+=ch;else if (isDigit(ch)(while(isD

14、igit (ch)(wordm+=ch;ch二inputp+;p;syn=42;else(syn=16;p;break;case '*':wordm+=ch;ch=inputp+;if(ch=,=')(syn=23;wordm+=ch;else(syn=22;p;break;case '/':wordm+=ch;ch=inputp+;if(ch=,=')(syn=25;wordm+=ch;如果是單行注釋,則讀到換行符為止else if (ch=V)(wordm+=ch;syn=45;while (ch!=,nf)ch二inputp+;)line+

15、;如果是多行注釋,則讀到匹配的*/為止 else if(ch='*') (wordm+=ch;syn=46;int flag=l;while (flag)(ch二inputp+;if (ch='*') (if (inputp+='/')(wordm+='*';wordm+='/1;flag=0;) else (p;)if (ch='n') (line+;)else(syn=24;p;break;界符case '(':syn=34;wordm+=ch; break;case ')

16、9;:syn=35; wordm+=ch; break;case '':syn=36; wordm+=ch; break;case '':syn=37; wordm+=ch; break;case ';':syn=38; wordm+=ch; break;case '#':syn=21; wordm+=ch; break;case ':':syn=39; wordm+=ch; break;case ',':syn=44; wordm+=ch; break;邏輯運(yùn)算符case '&&#

17、39;:wordm+=ch; ch=inputp+; if(ch=,&') (syn=20;wordm+=ch; else(syn=19;p一;break;case T :wordm+=ch; ch二inputp+; if(ch=r|f)syn=41;wordm+=ch;elsesyn=40;break;default:syn=-l; break;字符串結(jié)束符wordm+=,0f;4.實(shí)驗(yàn)結(jié)果93 C:Users十九號(hào)的小胖子DesklopQQ綏星原理'詞法分析器.exeplease input a string(end with H): void main()/abj

18、sksa/*kLscdaidvj*xkdjcsal*/(void, 12 )(main, 0 )(,34 )(),35 )(1, 36 )(/, 45 )(/*/, 46 )(,37 )(«,21 )Process exited after 45.41 seconds with return value 21 括按任意鉞繼續(xù)因?yàn)閜rintf和"”不是單詞符號(hào)表中的符號(hào),因而判定輸入有錯(cuò)S3 C:Uses十九號(hào)的小胖子DesktopQQ編譯原理、詞法分析SS.exeplease input a string(end with # ): int main()(int i=O;f

19、or(i=O;i<5:i+)(printfChello world");) ) ) ) o 777 JZ7 7J/J/x)fJf X17 8 » 8 5 5 >n456 >3228 *4322838283156 ti333 t4343 T343434 2 434 73 3 nla, , , n , , , , o , , , + , 9 i m (/ i »1 = o f ( i 二 o - 1 + )(printf, 43 )(,34 ).,vou have input a wrong string in line 5(hello, 43 )(

20、world, 43 ) ) ) ) )you have input a wrong string in line 5(),35(;,38(),37(1,37(#,21Process exited after 67.96 seconds with return value 21 請(qǐng)技任意犍繼續(xù). . 可C:Use0十九號(hào)的小胖子DesktopQQ編譯原理'詞法分析器.exeplease input a st ring (end with int a=l;float b=2t 3;double c=4.5:int al2=a;float lb=b;double d=12c;(int, 8 )(a, 43 )(=,32 )(1, 42 )(;,38 )(float, 10 )(b, 43

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論