版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 遼寧中醫(yī)藥大學(xué)《經(jīng)典電影作品研究》2023-2024學(xué)年第一學(xué)期期末試卷
- 蘭州現(xiàn)代職業(yè)學(xué)院《web應(yīng)用開(kāi)發(fā)基礎(chǔ)課程設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 江西理工大學(xué)《舞蹈專(zhuān)業(yè)教學(xué)法(1)》2023-2024學(xué)年第一學(xué)期期末試卷
- 濟(jì)南工程職業(yè)技術(shù)學(xué)院《紗線設(shè)計(jì)及打樣》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南工商大學(xué)《傳統(tǒng)武術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 重慶交通大學(xué)《J2EE框架技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 鐘山職業(yè)技術(shù)學(xué)院《組件式GIS開(kāi)發(fā)技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江汽車(chē)職業(yè)技術(shù)學(xué)院《中國(guó)傳統(tǒng)音樂(lè)賞析》2023-2024學(xué)年第一學(xué)期期末試卷
- 中國(guó)戲曲學(xué)院《食品微生物學(xué)與微生物檢驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)學(xué)校2024-2025學(xué)年度第二學(xué)期工作計(jì)劃
- 智慧農(nóng)業(yè)的傳感器與智能設(shè)備
- 旅游路線規(guī)劃設(shè)計(jì)方案
- DB37-T 5097-2021 山東省綠色建筑評(píng)價(jià)標(biāo)準(zhǔn)
- 五年級(jí)上冊(cè)簡(jiǎn)易方程練習(xí)100題及答案
- MDR醫(yī)療器械法規(guī)考核試題及答案
- 讓學(xué)生看見(jiàn)你的愛(ài)
- 領(lǐng)導(dǎo)溝通的藝術(shù)
- 發(fā)生用藥錯(cuò)誤應(yīng)急預(yù)案
- 南潯至臨安公路(南潯至練市段)公路工程環(huán)境影響報(bào)告
- 綠色貸款培訓(xùn)課件
- 大學(xué)生預(yù)征對(duì)象登記表(樣表)
評(píng)論
0/150
提交評(píng)論