編譯原理詞法分析器實(shí)驗(yàn)報(bào)告最終_第1頁(yè)
編譯原理詞法分析器實(shí)驗(yàn)報(bào)告最終_第2頁(yè)
編譯原理詞法分析器實(shí)驗(yàn)報(bào)告最終_第3頁(yè)
編譯原理詞法分析器實(shí)驗(yàn)報(bào)告最終_第4頁(yè)
編譯原理詞法分析器實(shí)驗(yàn)報(bào)告最終_第5頁(yè)
已閱讀5頁(yè),還剩8頁(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é)號(hào)專業(yè)班級(jí)實(shí)驗(yàn)項(xiàng)目實(shí)驗(yàn)一:詞法分析課程名稱編譯原理課程代碼0310243實(shí)驗(yàn)時(shí)間 2013年 4月28 日 第 1、2 節(jié) 2013年 5月 7 日 第1 、2 節(jié)實(shí)驗(yàn)地點(diǎn)第一教學(xué)樓1508批改意見成績(jī)教師簽字: 實(shí)驗(yàn)內(nèi)容: 實(shí)現(xiàn)標(biāo)準(zhǔn)C語言詞法分析器實(shí)驗(yàn)?zāi)康模?掌握程序設(shè)計(jì)語言詞法分析的設(shè)計(jì)方法;2掌握DFA的設(shè)計(jì)與使用方法;3掌握正規(guī)式到有限自動(dòng)機(jī)的構(gòu)造方法;實(shí)驗(yàn)要求:1單詞種別編碼要求 基本字、運(yùn)算符、界符:一符一種; 標(biāo)識(shí)符:統(tǒng)一為一種; 常量:按類型編碼;2詞法分析工作過程中建立符號(hào)表、常量表,并以文本文件形式輸出;3詞法分析的最后結(jié)果以文本文件形式

2、輸出;4完成對(duì)所設(shè)計(jì)詞法分析器的功能測(cè)試,并給出測(cè)試數(shù)據(jù)和實(shí)驗(yàn)結(jié)果;5為增加程序可讀性,請(qǐng)?jiān)诔绦蛑羞M(jìn)行適當(dāng)注釋說明;6整理上機(jī)步驟,總結(jié)經(jīng)驗(yàn)和體會(huì);7認(rèn)真完成并按時(shí)提交實(shí)驗(yàn)報(bào)告。實(shí)驗(yàn)步驟:1.基本思想:從源程序中依次讀入字符并解析,與關(guān)鍵字、運(yùn)算符、結(jié)束符進(jìn)行比較,得出其中的關(guān)鍵字,并將它存入到數(shù)組中去。2.程序源代碼:#include<stdio.h>#include<cstring>#include<stdlib.h>#define MaxSize1 17/關(guān)鍵字的個(gè)數(shù)#define MaxSize2 20/運(yùn)算符的個(gè)數(shù)#define MaxSize3

3、4/結(jié)束符的個(gè)數(shù)/數(shù)據(jù)結(jié)構(gòu)struct TNodechar value20;/存放標(biāo)識(shí)符的值int number; /存放標(biāo)識(shí)符的種別碼char description20;/描述KeyWordsMaxSize1,OperationMaxSize2,EndOperationMaxSize3;/存放關(guān)鍵字的數(shù)組char *WordsBuffMaxSize1="const","long","float","double","void","main","if",

4、"else","then","break","int","char","include","for","while","printf","scanf"/存放運(yùn)算符的數(shù)組char *OperationBuffMaxSize2="+","-","*","/","+=","-=",&q

5、uot;*=","+","-","<","<=",">",">=","<>","=","(",")","#","",""char EndOperationBuffMaxSize3=' ','','n','t'/存放詞法分析程序輸出

6、的結(jié)果TNode Table1500;TNode Variable100;/標(biāo)識(shí)符表TNode Const100;/關(guān)鍵字?jǐn)?shù)組初始化void inputKeyWords(char * buff,int size)/關(guān)鍵字編碼從1-sizefor(int i=0;i<size;i+)strcpy(KeyWordsi.value,buffi);KeyWordsi.number=i+1;strcpy(KeyWordsi.description,"關(guān)鍵字");/運(yùn)算符數(shù)組初始化void inputOperation(char * buff,int size)/運(yùn)算符編碼從50

7、-(50+size)for(int i=0;i<size;i+)strcpy(Operationi.value,buffi);Operationi.number=i+50;strcpy(Operationi.description,"運(yùn)算符");/結(jié)束符數(shù)組初始化void inputEndOperation(char buff,int size)/結(jié)束符編碼從100-(100+size);for(int i=0;i<size;i+)EndOperationi.value0=buffi;EndOperationi.value1='0'EndOper

8、ationi.number=i+100;strcpy(EndOperationi.description,"結(jié)束符");/輸出數(shù)據(jù)結(jié)構(gòu)數(shù)組中的信息void outputInfo(TNode a,int size)for(int i=0;i<size;i+)printf("(%d",ai.number);printf("t");printf("%s)",ai.value);printf("t");printf(ai.description);printf("n");voi

9、d outInfoToFile(TNode a,int size,FILE *out)/將詞法分析程序的結(jié)果輸出到文件中去for(int i=0;i<size;i+)fprintf(out,"(%d",ai.number);fprintf(out,"t");fprintf(out,"%s)",ai.value);fprintf(out,"t");fprintf(out,ai.description);fprintf(out,"n");/從文件中讀取一個(gè)字符/返回文件中讀取的字符char g

10、etChar(FILE *fp)char ch=fgetc(fp);return ch;/判讀是否是運(yùn)算符int isOperation(char a)/返回i表示是運(yùn)算符在運(yùn)算符數(shù)組中的位置/返回-1表示不是運(yùn)算符int result;for(int i=0;i<MaxSize2;i+)result=strcmp(a,Operationi.value);if(result=0)return i;break;return -1;/判讀是否是關(guān)鍵字int isKeyWords(char a)/返回i表示在關(guān)鍵字表中的位置/返回-1表示不是關(guān)鍵字int result;for(int i=0;

11、i<MaxSize1;i+)result=strcmp(a,KeyWordsi.value);if(result=0)return i;break;return -1;/判讀是否是結(jié)束符int isEndOperation(char a)/返回i表示是結(jié)束符在結(jié)束符表中的位置/返回-1表示不是結(jié)束符for(int i=0;i<MaxSize3;i+)if(a=EndOperationi.value0)return i;break;return -1;/判讀是否是字符int isChar(char a)/返回1表示是字符/返回0表示不是字符if(a>='a'&a

12、mp;&a<='z')return 1;else if(a>'A'&&a<='Z')return 1;elsereturn 0;/判讀是否是數(shù)字int isDigit(char a)/返回1表示是數(shù)字/返回0表示不是數(shù)字if(a>='0'&&a<='9')return 1;elsereturn 0;int count=0;/記錄結(jié)果表中的關(guān)鍵字及運(yùn)算符等表項(xiàng)個(gè)數(shù),用于返回int count1=0;/記錄標(biāo)識(shí)符的表項(xiàng)個(gè)數(shù)int count2=0;/

13、記錄常量的表項(xiàng)的個(gè)數(shù)/從屏幕上面獲得字符并解析,返回在結(jié)果表中的表項(xiàng)int start1(FILE *in)char buff20;/用于保存單詞的緩沖區(qū)char nextchar2;char temp20;/用于保存變量或常量的類型數(shù)組int i=0;/緩沖區(qū)指針int a;/比較的結(jié)果指針char op3;/用于保存第一個(gè)運(yùn)算符op2='0'nextchar0=fgetc(in);nextchar1='0'while(nextchar0!=EOF)if(isChar(nextchar0)buffi=nextchar0;i+;nextchar0=fgetc(i

14、n);else if(isDigit(nextchar0)buffi=nextchar0;i+;nextchar0=fgetc(in);else if(nextchar0='r'|nextchar0='n')buffi='0'a=isKeyWords(buff);if(a!=-1&&i>0)strcpy(Table1count.value,KeyWordsa.value);Table1count.number=KeyWordsa.number;strcpy(Table1count.description,KeyWordsa.

15、description);count+;/計(jì)數(shù)器加一i=0;/清空緩沖區(qū)else if(i>0)if(isChar(buff0)/是標(biāo)識(shí)符strcpy(Variablecount1.value,buff);Variablecount1.number=count1;strcpy(Variablecount1.description,"標(biāo)識(shí)符");count1+;/計(jì)數(shù)器加一i=0;/清空緩沖區(qū)else if(isDigit(buff0)/是常量strcpy(Constcount2.value,buff);Constcount2.number=count2;strcpy(

16、Constcount2.description,"常量");count2+;/計(jì)數(shù)器加一i=0;/清空緩沖區(qū)else/緩沖區(qū)為空!/處理回車符與換行符nextchar0=fgetc(in);else if(isEndOperation(nextchar0)!=-1)buffi='0'a=isKeyWords(buff);if(a!=-1&&i>0)strcpy(Table1count.value,KeyWordsa.value);Table1count.number=KeyWordsa.number;strcpy(Table1count

17、.description,KeyWordsa.description);strcpy(temp,KeyWordsa.value);count+;/計(jì)數(shù)器加一i=0;/清空緩沖區(qū)else if(i>0)if(isChar(buff0)/是標(biāo)識(shí)符strcpy(Variablecount1.value,buff);Variablecount1.number=count1;strcpy(Variablecount1.description,"標(biāo)識(shí)符");count1+;/計(jì)數(shù)器加一i=0;/清空緩沖區(qū)else if(isDigit(buff0)/是常量strcpy(Const

18、count2.value,buff);Constcount2.number=count2;strcpy(Constcount2.description,"常量");count2+;/計(jì)數(shù)器加一i=0;/清空緩沖區(qū)else/緩沖區(qū)為空!nextchar0=fgetc(in);else if(a=isOperation(nextchar)!=-1)/首先輸出緩沖區(qū)中的數(shù)據(jù)buffi='0'a=isKeyWords(buff);if(a!=-1&&i>0)strcpy(Table1count.value,KeyWordsa.value);Ta

19、ble1count.number=KeyWordsa.number;strcpy(Table1count.description,KeyWordsa.description);count+;/計(jì)數(shù)器加一i=0;/清空緩沖區(qū)else if(i>0)if(isChar(buff0)/是標(biāo)識(shí)符strcpy(Variablecount1.value,buff);Variablecount1.number=count1;strcpy(Variablecount1.description,"標(biāo)識(shí)符");count1+;/計(jì)數(shù)器加一i=0;/清空緩沖區(qū)else if(isDigit

20、(buff0)/是常量strcpy(Constcount2.value,buff);Constcount2.number=count2;strcpy(Constcount2.description,"常量");count2+;/計(jì)數(shù)器加一i=0;/清空緩沖區(qū)else/緩沖區(qū)為空!/處理運(yùn)算符op0=nextchar0;nextchar0=fgetc(in);if(nextchar0!='')if(isOperation(nextchar)!=-1)op1=nextchar0;if(a=isOperation(op)!=-1)/輸出雙目運(yùn)算符strcpy(Ta

21、ble1count.value,Operationa.value);Table1count.number=Operationa.number;strcpy(Table1count.description,Operationa.description);count+;/計(jì)數(shù)器加一/讀取下一個(gè)字符nextchar0=fgetc(in);else/錯(cuò)誤的雙目運(yùn)算符strcpy(Table1count.value,op);Table1count.number=-1;strcpy(Table1count.description,"未定義的運(yùn)算符");count+;/計(jì)數(shù)器加一/讀取下

22、一個(gè)字符nextchar0=fgetc(in);else/輸出一元運(yùn)算符op1='0'a=isOperation(op);strcpy(Table1count.value,Operationa.value);Table1count.number=Operationa.number;strcpy(Table1count.description,Operationa.description);count+;/計(jì)數(shù)器加一return count;void main()inputKeyWords(WordsBuff,MaxSize1);inputOperation(OperationBuff,MaxSize2);inputEndOperation(EndOperationBuff,MaxSize3);FILE *in,*out;bool Flag=true;while(Flag)printf("源文件的位置:C:input.txtn");if(in=fopen("C:input.txt","r")=NULL)printf("讀取源文件失?。?/p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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)論