編譯原理詞法分析器實驗報告最終_第1頁
編譯原理詞法分析器實驗報告最終_第2頁
編譯原理詞法分析器實驗報告最終_第3頁
編譯原理詞法分析器實驗報告最終_第4頁
編譯原理詞法分析器實驗報告最終_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 學院(系)名稱:計算機工程系姓名學號專業(yè)班級實驗項目實驗一:詞法分析課程名稱編譯原理課程代碼0310243實驗時間 2013年 4月28 日 第 1、2 節(jié) 2013年 5月 7 日 第1 、2 節(jié)實驗地點第一教學樓1508批改意見成績教師簽字: 實驗內容: 實現(xiàn)標準C語言詞法分析器實驗目的:1掌握程序設計語言詞法分析的設計方法;2掌握DFA的設計與使用方法;3掌握正規(guī)式到有限自動機的構造方法;實驗要求:1單詞種別編碼要求 基本字、運算符、界符:一符一種; 標識符:統(tǒng)一為一種; 常量:按類型編碼;2詞法分析工作過程中建立符號表、常量表,并以文本文件形式輸出;3詞法分析的最后結果以文本文件形式

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

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

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

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

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

7、-(50+size)for(int i=0;i<size;i+)strcpy(Operationi.value,buffi);Operationi.number=i+50;strcpy(Operationi.description,"運算符");/結束符數(shù)組初始化void inputEndOperation(char buff,int size)/結束符編碼從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,"結束符");/輸出數(shù)據(jù)結構數(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)/將詞法分析程序的結果輸出到文件中去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");/從文件中讀取一個字符/返回文件中讀取的字符char g

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

11、i<MaxSize1;i+)result=strcmp(a,KeyWordsi.value);if(result=0)return i;break;return -1;/判讀是否是結束符int isEndOperation(char a)/返回i表示是結束符在結束符表中的位置/返回-1表示不是結束符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;/記錄結果表中的關鍵字及運算符等表項個數(shù),用于返回int count1=0;/記錄標識符的表項個數(shù)int count2=0;/

13、記錄常量的表項的個數(shù)/從屏幕上面獲得字符并解析,返回在結果表中的表項int start1(FILE *in)char buff20;/用于保存單詞的緩沖區(qū)char nextchar2;char temp20;/用于保存變量或常量的類型數(shù)組int i=0;/緩沖區(qū)指針int a;/比較的結果指針char op3;/用于保存第一個運算符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+;/計數(shù)器加一i=0;/清空緩沖區(qū)else if(i>0)if(isChar(buff0)/是標識符strcpy(Variablecount1.value,buff);Variablecount1.number=count1;strcpy(Variablecount1.description,"標識符");count1+;/計數(shù)器加一i=0;/清空緩沖區(qū)else if(isDigit(buff0)/是常量strcpy(Constcount2.value,buff);Constcount2.number=count2;strcpy(

16、Constcount2.description,"常量");count2+;/計數(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+;/計數(shù)器加一i=0;/清空緩沖區(qū)else if(i>0)if(isChar(buff0)/是標識符strcpy(Variablecount1.value,buff);Variablecount1.number=count1;strcpy(Variablecount1.description,"標識符");count1+;/計數(shù)器加一i=0;/清空緩沖區(qū)else if(isDigit(buff0)/是常量strcpy(Const

18、count2.value,buff);Constcount2.number=count2;strcpy(Constcount2.description,"常量");count2+;/計數(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+;/計數(shù)器加一i=0;/清空緩沖區(qū)else if(i>0)if(isChar(buff0)/是標識符strcpy(Variablecount1.value,buff);Variablecount1.number=count1;strcpy(Variablecount1.description,"標識符");count1+;/計數(shù)器加一i=0;/清空緩沖區(qū)else if(isDigit

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

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

22、一個字符nextchar0=fgetc(in);else/輸出一元運算符op1='0'a=isOperation(op);strcpy(Table1count.value,Operationa.value);Table1count.number=Operationa.number;strcpy(Table1count.description,Operationa.description);count+;/計數(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("讀取源文件失??!

溫馨提示

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

評論

0/150

提交評論