C語(yǔ)言詞法分析器構(gòu)造實(shí)驗(yàn)報(bào)告_第1頁(yè)
C語(yǔ)言詞法分析器構(gòu)造實(shí)驗(yàn)報(bào)告_第2頁(yè)
C語(yǔ)言詞法分析器構(gòu)造實(shí)驗(yàn)報(bào)告_第3頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C語(yǔ)言詞法分析器構(gòu)造實(shí)驗(yàn)報(bào)告馮紹欣02 計(jì)算機(jī)(2)2002374203題目要求:完成一個(gè)C語(yǔ)言的詞法分析器的構(gòu)造。此詞法分析器能識(shí)別附值語(yǔ)句、循環(huán)語(yǔ)句、條件語(yǔ)句、并能處理注釋。選擇要分析這個(gè)詞法分析器分析的主要關(guān)鍵字有:main, int, float, char, if, else, for, while, do, switch, case, break; default的1、c文件,首先對(duì)其去掉注釋和與空格處理,再根據(jù)字符的不同類(lèi)型分析。全局?jǐn)?shù)據(jù)結(jié)構(gòu):字符數(shù)組set:存放從文件中讀到的所有字符;str:存放經(jīng)過(guò)注釋處理和預(yù)空格處理的字符;strtoken:存放當(dāng)前分析的字符;結(jié)構(gòu)體KEY

2、TABLE :存放關(guān)鍵字及其標(biāo)號(hào);全局字符變量 ch :當(dāng)前讀入字符;全局整型變量 sr, to:數(shù)組str, strtoken的指針。以層次圖形式描述模塊的組成及調(diào)用關(guān)系3、主要函數(shù)的設(shè)計(jì)要求(功能、參數(shù)、返回值):openfile :打開(kāi)文件;GetChar :將下一個(gè)輸入字符讀到ch中,搜索指示器前移一字符位置;GetBC :檢查ch中的字符是否為空白。若是,則調(diào)用GetChar直至ch中進(jìn)入一個(gè)非空白字符;Concat:將ch中的字符連接到 strtoken之后;IsLetter和IsDigit :布爾函數(shù)過(guò)程,分別判斷ch中的字符是否為字母和數(shù)字;Reserve:整型函數(shù)過(guò)程,對(duì)st

3、rtoken中的字符串查找關(guān)鍵字表,若是關(guān)鍵字則返回編碼,否則返回Retract :將搜索指示器回調(diào)一個(gè)字符位置,將ch置為空白字符;reflesh :刷新,把strtoken 數(shù)組置為空;prearra ngel :將注釋部分置為空格;prearra nge2 :預(yù)處理空格,去掉多余空格;an alysis: 詞法分析;main :主函數(shù)。4、狀態(tài)轉(zhuǎn)換圖:203字b45字符a2981 字母或數(shù)字字符c字母非字母或數(shù)字?jǐn)?shù)字.數(shù)字非數(shù)字字符a包括:=,& , | , + ,-字符b包括:-,< ,> ,| , *字符 c 包括:,:,(,), , , , , ! ,# , %

4、 ,”,/ , * , + ,-, > , <,.三、源代碼如下:#i nclude <stdio.h>#in clude <stri ng.h>char set1000,str500,strtoke n20;char sig n5010,co nsta nt5010;char ch;int sr,to,id=0,st=0;typedef struct keytable /* 放置關(guān)鍵字 */char n ame20;int kind;KEYTABLE;KEYTABLE keyword= /* 設(shè)置關(guān)鍵字 */"main",0,"

5、;int",1,"float",2,"char",3,"if",4,"else",5,"for",6,"while",7,"do",8,"switch",9,"case",10,"break",11,"default",12,;openfile() /* 打開(kāi)文件 */FILE *fp;char a,filename10;int n=0;printf("In

6、put the filename:");gets(filename);if(fp=fopen(filename,"r")=NULL)printf("cannot open file.n");exit(0);elsewhile(!feof(fp) /* 文件不結(jié)束,則循環(huán) */a=getc(fp); /*getc 函數(shù)帶回一個(gè)字符,賦給 a*/setn=a;/*文件的每一個(gè)字符都放入set數(shù)組中*/ n+;fclose(fp);/* 關(guān)閉文件 */setn-1='0'printf("nnSource Codenn&quo

7、t;);puts(set);printf("nn");reflesh() /* 清空 strtoken 數(shù)組 */to=0; /* 全局變量 to 是 strtoken 的指示器 */ strcpy(strtoken," ");prearrange1() /* 預(yù)處理程序 1*/int i,a,b,n=0;doif(setn='/' && setn+1='*')a=n; /* 記錄第一個(gè)注釋符的位置 */while(!(setn='*' && setn+1='/

8、9;)n+;b=n+1; /* 記錄第二個(gè)注釋符的位置 */for(i=a;i<=b;i+) /*/seti=' '/*把注釋的內(nèi)容換成空格,等待第二步預(yù)處理*/n+;while(setn!='0');prearrange2() /* 預(yù)處理程序 2*/int j=0;sr=O;/*全局變量sr是str的指示器*/doif(setj=' ' | setj='n')while(setj=' ' | setj='n') /* 掃描到有連續(xù)的空格或換行符 */ j+;str*/strsr='

9、 '/* 用一個(gè)空格代替掃描到的連續(xù)空格和換行符放入sr+;elsestrsr=setj; /* 若當(dāng)前字符不為空格或換行符就直接放入 str*/ sr+;j+;while(setj!='0');strsr='0'char GetChar()/*把字符讀入全局變量ch中,指示器sr前移*/ch=strsr;sr+;return(strsr-1);void GetBC() /*開(kāi)始讀入符號(hào),直至第一個(gè)不為空格 */while(ch=' ')ch=GetChar();Concat() /* 把 ch 中的字符放入 strtoken*/strt

10、okento=ch;to+; /* 全局變量 to 是 strtoken 的指示器 */ strtokento='0'int IsLetter()/* 判斷是否為字母 */if(ch>=65 && ch<=90)|(ch>=97 && ch<=122) return(1);else return(0);int IsDigit() /*判斷是否為數(shù)字 */if(ch>=48 && ch<=57)return(1);else return(0);1*/int Reserve() /* 對(duì) strto

11、ken 中的字符串查找保留字表,若是則返回它的編碼,否則返回int i,k=0;for(i=0;i<=20;i+)if(strcmp(strtoken,)=0) k=1;return(keywordi.kind);if(k!=1)return(-1);void Retract() /* 指示器 sr 回調(diào)一個(gè)字符位置,把 ch 置為空 */sr-;ch=' 'int InsertId()int i,k;for(i=0;i<id;i+)k=strcmp(strtoken,signi);if(k=0)return(i);strcpy(signi

12、d,strtoken); /* 插入標(biāo)識(shí)符 */id+;return(id-1);int InsertConst()int i,k;for(i=0;i<st;i+)k=strcmp(strtoken,constanti);if(k=0)return(i);strcpy(constantst,strtoken); /* 插入常數(shù) */st+;return(st-1);void analysis()int value;/* 清空 strtoken 數(shù)組 */*預(yù)處理,使注釋內(nèi)容換成單個(gè)空格,放回set中*/*預(yù)處理,使set中連續(xù)的空格置換成單個(gè)空格,并把set的內(nèi)容放到str中*/refl

13、esh();prearrange1();prearrange2();sr=0;GetChar();GetBC();/* 讀取第一個(gè)字符 */while(ch!='0') /* 當(dāng)不等于結(jié)束符,繼續(xù)執(zhí)行 */if(IsLetter()while(IsLetter() | IsDigit() /* 若第一個(gè)是字符,繼續(xù)讀取,直到出現(xiàn)空格*/Concat();GetChar();Retract();/*指示器sr回調(diào)一個(gè)字符位置,把 ch置為空*/value=Reserve();/*對(duì)strtoken中的字符串查找保留字表,若是則返回它的編碼,否則返回一1*/if(value=-1)

14、/*如果返回值是 1 ,那就是變量,把它輸出 */InsertId();/* 插入標(biāo)識(shí)符 */ printf("n%s",strtoken);getch();else /* 否則就是關(guān)鍵字,也輸出 */printf("n%s",strtoken); getch();reflesh();else if(IsDigit()while(IsDigit() /* 否則,若第一個(gè)是數(shù)字,繼續(xù)讀取,知道出現(xiàn)空格 */Concat();GetChar();/* 插入常數(shù) */Retract();InsertConst();printf("n%s",

15、strtoken);getch(); reflesh();elseswitch(ch)/* 否則,若是下面的符號(hào),就直接把它輸出 */ case ',':case '':case '(':case ')':case '':case '':case '':case '':case '!':case '#':case '%': case '"': case '/': case 

16、9;*':Concat();printf("n'%s'",strtoken);getch(); reflesh();break;default:if(ch='=' | ch='&' | ch='|' | ch='+' | ch='-')/* 如果是這些符號(hào),繼續(xù)讀取下一個(gè) */Concat();/* 判斷是否為 =,&&,|,+,- 的情況 */GetChar();if(ch=strtoken0)Concat();elseRetract();pri

17、ntf("n'%s'",strtoken);getch(); reflesh(); break;GetChar();GetBC();main()clrscr();openfile();analysis();printf( “analysis is over! ”); 五、測(cè)試結(jié)果: 1、分析文件 test1.c 中的程序: Input the filename:test.celse if(ch='+' | ch='-' | ch='<' | ch='>' | ch='!

18、9; | ch='*')Concat();/* 判斷是否為 +=,-=,<=,>=,!=,*= 的情況 */GetChar();if(ch='=')Concat();elseRetract();printf("n'%s'",strtoken);getch();reflesh();break;elseprintf("Error!");getch();break;*Original Code* /* HELLO.C - Hello, world */#include "stdio.h"#include "conio.h" main()printf("Hello, worldn"); getch();*'#' includeIllistdioI IhIlli'#' in

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論