




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、編譯技術(shù)實驗報告 實驗題目: 詞法分析學(xué) 院: 信息學(xué)院專 業(yè): 計算機科學(xué)與技術(shù)學(xué) 號: 姓 名: 一、實驗?zāi)康?1) 理解詞法分析的功能;(2) 理解詞法分析的實現(xiàn)方法;二、實驗內(nèi)容PL0的文法如下為非終結(jié)符。 := 該符號的左部由右部定義,可讀作“定義為”。 | 表示或,為左部可由多個右部定義。 表示花括號內(nèi)的語法成分可以重復(fù)。在不加上下界時可重復(fù)0到任意次數(shù),有上下界時可重復(fù)次數(shù)的限制。 表示方括號內(nèi)的成分為任選項。 ( ) 表示圓括號內(nèi)的成分優(yōu)先。 上述符號為“元符號”, 文法用上述符號作為文法符號時需要用引號括起。程序=分程序分程序= 變量說明部分過程說明部分語句變量說明部分=VA
2、R標(biāo)識符,標(biāo)識符:INTEGER;無符號整數(shù)=數(shù)字?jǐn)?shù)字標(biāo)識符=字母字母|數(shù)字過程說明部分=過程首部分程序;過程說明部分;過程首部=PROCEDURE標(biāo)識符;語句=賦值語句|條件語句|過程調(diào)用語句|讀語句|寫語句|復(fù)合語句|空賦值語句=標(biāo)識符=表達(dá)式復(fù)合語句=BEGIN語句;語句END條件=表達(dá)式關(guān)系運算符表達(dá)式表達(dá)式=項加法運算符項 項=因子乘法運算符因子因子=標(biāo)識符|無符號整數(shù)|(表達(dá)式)加法運算符=+|-乘法運算符=*關(guān)系運算符=|=|=條件語句=IF條件THEN語句字母=a|b|X|Y|Z數(shù)字=0|1|2|8|9實現(xiàn)PL0的詞法分析三、實驗分析與設(shè)計PL0詞法分析程序是一個獨立的過程,其
3、功能是為語法語義分析提供單詞,把輸入的字符串形式的源程序分割成一個個單詞符號傳遞給語法語義分析。其主要方法步驟為從源程序掃描下一個字符,忽略空格、換行、TAB和注釋并識別單詞,再將不同類別的單詞歸類輸出。四、實驗的實現(xiàn)#include #include#include#include#include#definenorw 11 /norw-1個關(guān)鍵字#defineal 20 /最長的關(guān)鍵字的長度#define ID norw#define INT norw+1#define COMMA norw+2#define ENDF norw+3#define COLON norw+4#define S
4、EMIC norw+5#define ADD norw+6#define MINUS norw+7#define MULTI norw+8#define EVALU norw+9#define LE norw+10#define NE norw+11#define LT norw+12#define EQ norw+13#define GE norw+14#define GT norw+15#define FLOAT norw+16char TOKEN20; /字符數(shù)組用來依次存放單詞詞文的各個字符extern int lookup(char *); /以TOKEN字符串查保留字表extern
5、 void report_error(char); /報告程序中的詞法錯誤bool isalpha(char); /判斷接收字符是否為字母bool isalnum(char); /判斷接收字符是否為字母或者數(shù)字bool isdigit(char); /判斷接收字符是否為數(shù)字bool isannotation(char); /判斷接收字符是否為注釋extern char letter(char c); /用來將大寫字母轉(zhuǎn)化成小寫字母FILE* fin;FILE* fout;void scanner()/詞法分析的主體程序,對輸入的文本文件進行詞法分析char ch;int i,c;int err
6、or=0; /記錄文件中詞法錯誤的個數(shù)ch=fgetc(fin); /從輸入文件中讀取一個字符while(ch!=EOF)/當(dāng)從輸入文件接收的字符不是文件結(jié)束符時,執(zhí)行循環(huán)if(isalpha(ch)/如果從輸入文件接收的第一個字符是字母 ch=letter(ch);TOKEN0=ch;ch=fgetc(fin);i=1;while(isalnum(ch) ch=letter(ch);TOKENi=ch;i+;ch=fgetc(fin);TOKENi=0;c=lookup(TOKEN); /查保留字表if(c=0) fprintf(fout,(%d,%s)n, ID,TOKEN); /輸出標(biāo)識
7、符else fprintf(fout,(%d,%s)n, c,TOKEN); /輸出接收單詞為保留字if(isdigit(ch) /如果從輸入文件接收的第一個字符是數(shù)字 int cdot=0; /統(tǒng)計小數(shù)點個數(shù)TOKEN0=ch;ch=fgetc(fin);i=1;while(isdigit(ch)|ch=.)/從第二個接收字符開始,當(dāng)是數(shù)字或者是小數(shù)點時,執(zhí)行循環(huán)if(ch=.) cdot+;TOKENi=ch;i+;ch=fgetc(fin);/重復(fù)接收字符,直到接收到非數(shù)字if(cdot=2) error+; TOKENi=0; printf(%s is errorn, TOKEN);
8、break; if(isalpha(ch) /如果第二個字符是字母while(isalpha(ch) /接收完所有的字母,跳出循環(huán)TOKENi=ch;i+;ch=fgetc(fin);TOKENi=0;error+;printf(%s is errorn, TOKEN);else if(cdot=0) /當(dāng)接收的字符為整型單詞時fseek(fin,-1,1); TOKENi=0; int a,temp=0,c; for(c=0;ci;c+) a=TOKENc - 0; if(c!=0) temp=temp*10; temp=temp+a; else temp=a; fprintf(fout,(
9、%d,%d)n, INT, temp); /輸出接收單詞為整數(shù)else if(cdot=1) fseek(fin,-1,1); TOKENi=0; int a,part1=0,jc,b=0; /b用來確定小數(shù)點所在的位置 float c=0.1,part2=0.0; while(TOKENb!=.) b=b+1; for(jc=0;jcb;jc+) a=TOKENjc - 0; if(jc!=0) part1=part1*10; part1=part1+a; else part1=a; for(jc=b+1;jci;jc+) a=TOKENjc-0; part2=a*c+part2; c=c*
10、0.1; fprintf(fout,(%d,%f)n, FLOAT, part1+part2); /輸出接收單詞為小數(shù) else if(cdot=2) fseek(fin,-1,1); else /如果從輸入文件接收的第一個字符既不是字母又不是數(shù)字switch(ch)/將所接收到的符號字符進行分類,采取一符一類case:ch=fgetc(fin); if(ch=) fprintf(fout,(%d,:=)n, EVALU); /輸出接收符號為賦值號 elsech=fgetc(fin);fseek(fin,-1,1); /文件接收字符回推一個字符fprintf(fout,(%d,:)n, COL
11、ON); /輸出冒號break;case,:fprintf(fout,(%d,)n, COMMA); break; /輸出逗號case.:fprintf(fout,(%d,.)n, ENDF);break; /輸出句號case;:fprintf(fout,(%d,.)n, SEMIC);break; /輸出分號case+:fprintf(fout,(%d,+)n, ADD);break; /輸出加號case-:fprintf(fout,(%d,-)n, MINUS);break; /輸出減號case*:fprintf(fout,(%d,*)n, MULTI);break; /輸出乘號case:
12、ch=fgetc(fin);if(ch=)fprintf(fout,(%d,)fprintf(fout,(%d,)n, NE); /輸出不等于號elsefseek(fin,-1,1);fprintf(fout,(%d,:ch=fgetc(fin);if(ch=)fprintf(fout,(%d,=)n, GE); /輸出大于或等于號elsefseek(fin,-1,1);fprintf(fout,(%d,)n, GT); /輸出大于號break;case :break;casen:break;caset:break;case/:ch=fgetc(fin);/檢查是否為單行注釋if(ch=/)w
13、hile(ch!=n) ch=fgetc(fin); else fseek(fin,-1,1); printf(/ is errorn); error+; break; case: while(1) ch=fgetc(fin); if(ch=) break; if(ch=EOF) fseek(fin,-1,1); printf( is errorn); error+; break; break; default:printf(%c is errorn, ch); /接收非上述字符程序報告詞法錯誤error+;break;ch=fgetc(fin); /繼續(xù)從文件中讀取下一個單詞,直到文件結(jié)束/
14、while循環(huán)結(jié)束printf(共發(fā)現(xiàn)%d 個詞法錯誤!,error);return;int lookup(char *token)int j; char wordnorwal;strcpy(&(word10), begin );strcpy(&(word20), end);strcpy(&(word30), var);strcpy(&(word40), integer);strcpy(&(word50), while);strcpy(&(word60), do);strcpy(&(word70), if);strcpy(&(word80), then);strcpy(&(word90), procedure);strcpy(&(word100), else);for(j=1;j=a&c=A&c=a&c=A&c=0&c=0&c=A&c=Z) c=c+32; return c;int main()char filename20;printf(請輸入文件名:);scanf(%s,filename);if(fin=fopen(file
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉儲管理員崗位面試問題及答案
- 威海市重點中學(xué)2025屆化學(xué)高二下期末預(yù)測試題含解析
- 2025屆黑龍江省齊齊哈爾市第八中學(xué)高二下化學(xué)期末統(tǒng)考試題含解析
- 河北省承德市豐寧縣鳳山第一中學(xué)2025年高二下化學(xué)期末聯(lián)考模擬試題含解析
- 2025屆廣西欽州市靈山縣化學(xué)高一下期末監(jiān)測模擬試題含解析
- 江蘇裝飾裝修管理辦法
- 新疆旅居人員管理辦法
- 機械外協(xié)加工管理辦法
- 人臉3D建模與渲染-洞察及研究
- 北京隔離薪資管理辦法
- 2025年廣東高考政治試卷真題答案詳解講評(課件)
- 2025年家庭照護師職業(yè)資格考試試題及答案
- 國家開放大學(xué)2024年春季學(xué)期期末統(tǒng)一考試《中文學(xué)科論文寫作》試題(試卷代號11332)
- GB/T 33855-2017母嬰保健服務(wù)場所通用要求
- GB 8109-2005推車式滅火器
- 支架植入知情同意書模板
- 人教版四年級上冊語文生字組詞
- 茶文化講座優(yōu)選ppt資料
- 水不同溫度的熱焓值
- 綠化工程施工技術(shù)方案及措施(可編輯)
- 國航特殊餐食代碼表
評論
0/150
提交評論