編譯原理設計c語言的詞法分析器_第1頁
編譯原理設計c語言的詞法分析器_第2頁
編譯原理設計c語言的詞法分析器_第3頁
編譯原理設計c語言的詞法分析器_第4頁
已閱讀5頁,還剩13頁未讀 繼續免費閱讀

付費下載

下載本文檔

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

文檔簡介

1、編譯原理課程設計報告題目:學院:教師:學號:班級:評分:簽字:編譯原理課程設計一:設計c 語言的詞法分析器一、實驗目的了解高級語言單詞的分類,了解狀態圖以及如何表示并識別單詞規則,掌握狀態圖到識別程序的編程,加深對詞法原理的理解。二、實驗要求了解高級語言單詞的分類,了解狀態圖以及如何表示并識別單詞規則,掌握狀態圖到識別程序的編程。三、實驗設計3.1單詞分類及表示語言的子集分類( 1)標識符:以字母開頭的字母數字串( 2)整數或浮點型。( 3)保留字: for,while,do,else,if,static,int,sizeof,break,continue( 4)運算符: +, - , * ,

2、 / , %,>,<,=,!=,=,<=,>=,!,&,&&,|;( 5)界符: "(",")",",",":","","",""單詞二元組(單詞分類號、單詞自身值)單詞分類號標識符1整數或浮點型2保留字3運算符4界符53.2 詞法分析器的設計算法設計概要設計從文件中逐個讀取字符,只要這五大類的狀態序列則繼續讀取,否則回退字符, 在對應類別進行查找,輸出單元二次組至另一文件夾。開始打開 txt 文件讀取c語言

3、代碼掃描Y是否讀取到Y相應字符Y常數?標識符保留字運算符界符?記錄標號結束狀態圖設計輸入輸出設計輸入:通過文件指針從文件中一個一個讀取字符輸出:輸出單詞二元組至文件。格式為(種別碼,值)主要函數void Getchar(FILE *fp ) / 讀入一個字符void GetBC(FILE *fp)/ 讀入一個非空字符void contacat()/ 連接字符int letter()/ 判斷是否為字母int digit()/ 判斷是否為字母void retract(FILE *fp,char *c)/回退int reserve (char *k)/處理保留字int sysmbol(identif

4、ier *id)/處理標識符,查找符號表并存放位置若沒有則添加int constant(constnumber *con)/存入常數表,并返回它在常數表中的位置void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)/寫到文件void WordAnalyze(char *k,char *c, char *CODE, identifier *id, constnumber *con, FILE *fp, FILE *fw)/ 詞法分析函數四、結果測試文件輸入int main()int a=1,b=3;if(

5、a>1)b=b-2;輸出結果:結論:程序輸出結果與期望輸出結果相符。四、收獲與感想通過我本次課程設計掌握了詞法分析器設計的基本方法與相關知識。詞法分析的關鍵是明確各類字符的狀態轉換過程。同時輔助標識符、 常量結構體與保留字表用于查找返回值。同時我也對分析問題解決問題有了更深入全面的認識與理解。面對一個大的問題,需要理清解決的步驟再將其分解成小的模塊逐個解決最后再串聯在一起,問題就會變得更容易,思路也會更加清晰。五、實驗代碼#include<iostream>using namespace std;#define LENGTH 10char ch;char *CODE = &q

6、uot;identifier","constant","keyword"/* 保 留 字 */,"+","-","*","/","<","<=",">",">=","!=","=","=","(",")",",",":",&q

7、uot;","","" ;char *k = "for","while","do","else","if","static","int","sizeof","break","continue" ;/保留字char token16;/ 存放處理后的字符串/標識符結構體typedef structchar *I256;int len;identifie

8、r;typedef structint cont300;int len;constnumber;/讀入一個字符void Getchar(FILE *fp )if (ch = getc(fp) = EOF)exit(1);/讀入一個非空字符void GetBC(FILE *fp)while (ch = ' ' | ch = 'n' | ch = 9)Getchar(fp);/連接字符void contacat()char * cht = &(ch);strcat_s(token, cht);/判斷是否為字母int letter()returnisalpha

9、(ch);int digit()return isdigit(ch);/回退void retract(FILE *fp,char *c)int a=ftell(fp);fseek(fp,0,SEEK_SET);fprintf_s(fp, "%c", ch);ch = ' 'fseek(fp, a, SEEK_SET);/處理保留字int reserve (char *k)int i;for (i = 0;i < LENGTH;i+)if (strcmp(token, ki) = 0)return (i + 1);return 0;/處理標識符,查找符號

10、表并存放位置若沒有則添加int sysmbol(identifier *id)int i;for (i = 0;i < id->len;i+)if (strcmp(token, id->Ii) = 0)return i + 1;if (id->len > 256)cout << "error"id->Iid->len = token;id->len+;return id->len;/數字字符串轉化為整數int str_to_num()int i=0;int k = tokeni-'0'for

11、(i = 1;tokeni != '0'i+)k = k * 10 + tokeni - '0'return k;/存入常數表,并返回它在常數表中的位置int constant(constnumber *con)con->contcon->len = str_to_num();con->len+;return con->len;/寫到文件void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)int num_ = num;fprintf_s(fw,

12、"(%d,",num);if (num >= 4)fprintf_s(fw,"%s", CODEnum-1);if (num < 4)switch (num)case 1:fprintf_s(fw, "%s", id->Ival - 1);break;case 2:fprintf_s(fw, "%d", con->contval - 1);break;case 3:fprintf_s(fw, "%s", kval - 1);break;fprintf_s(fw,"

13、;)n");void error(FILE *fw)cout << "(Error," << ch << ")" << endl;fprintf_s(fw,"(Error,%cn)", ch );/詞法分析函數void WordAnalyze(char *k,char *c, char *CODE, identifier *id, constnumber *con, FILE *fp, FILE *fw)int num, val;strcpy_s(token, "&q

14、uot;);/ 初始化為空字符串Getchar(fp);GetBC(fp);if (ch >= 'A'&&ch <= 'Z') | (ch >= 'a'&&ch <= 'z')/ 分析標識符和保留字/若字符為AZ 或 09,則繼續讀取while (letter() | digit()contacat();Getchar(fp);retract(fp, c);num = reserve(k);if (num != 0)Tofile(3, num, id, con,fw);els

15、eval = sysmbol(id);Tofile(1, val, id, con,fw);else if (digit()/ 處理常數while (digit()contacat();Getchar(fp);retract(fp,c);val = constant(con);Tofile(2, val, id, con,fw);else /分析符號switch (ch)case'<':Getchar(fp);if (ch = '=')Tofile(9, 0, id, con,fw);elseretract(fp,c);Tofile(8, 0, id, c

16、on,fw);break;case'>':Getchar(fp);if (ch = '=')Tofile(11, 0, id, con,fw);elseretract(fp,c);Tofile(10, 0, id, con,fw);break;case'=':Getchar(fp);if (ch = '=')Tofile(13, 0, id, con,fw);elseretract(fp,c);Tofile(14, 0, id, con,fw);break;case'!':Getchar(fp);if (ch

17、 = '=')Tofile(12, 0, id, con,fw);elseerror(fw);break;case'+':Tofile(4, 0, id, con,fw);break;case'-':Tofile(5, 0, id, con,fw);break;case'*':Tofile(6, 0, id, con,fw);break;case'/':Tofile(7, 0, id, con, fw);break;case'(':Tofile(15, 0, id, con, fw);break;c

18、ase')':Tofile(16, 0, id, con, fw);break;case',':Tofile(17, 0, id, con, fw);break;case':':Tofile(18, 0, id, con, fw);break;case'':Tofile(19, 0, id, con, fw);break;case'':Tofile(20, 0, id, con, fw);break;case'':Tofile(21, 0, id, con, fw);break;default:error(f

溫馨提示

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

評論

0/150

提交評論