




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、裝訂線 編譯原理實(shí)驗(yàn)報(bào)告 題目: C_minus語言詞法分析器 學(xué) 院 計(jì)算機(jī)科學(xué)與技術(shù) 專 業(yè) xxxxxxxxxxxxxxxx 學(xué) 號 xxxxxxxxxxxx 姓 名 xxxx 指導(dǎo)教師 xxxx 20xx年xx月xx日C_minus語言詞法分析器一、實(shí)驗(yàn)?zāi)康?#160; 1.理解詞法分析器的設(shè)計(jì)方法:利用DFA編寫相應(yīng)的程序。 2.掌握手工編寫詞法分析程序的方法。 3.復(fù)習(xí)熟悉以前學(xué)過的編程語言 4.通過實(shí)驗(yàn)了解
2、編譯器詞法分析的工作原理 二、實(shí)驗(yàn)原理 1.文法的概念,DFA的表示方法。 2.詞法分析程序的輸出和輸入:詞法分析程序的功能是讀入源程序,輸出單詞符號。單詞符號是程序設(shè)計(jì)語言的比本語法符號,程序設(shè)計(jì)語言的單詞符號一般分為如下幾種:關(guān)鍵字,標(biāo)示符,常數(shù),運(yùn)算符,界符,單詞的輸出是二元式的形式,需要知道二元式的表示方
3、法,把得到的二元式寫入輸出文件。 轉(zhuǎn)化圖如下: 源程序 詞法分析程序 記號文件 3.熟悉單詞的描述工具,如正規(guī)文法,正規(guī)式,以及知道正規(guī)文法和正規(guī)式的等價性以及他們之間的互相轉(zhuǎn)化。熟悉把正規(guī)文法轉(zhuǎn)化為正規(guī)式,把正規(guī)式轉(zhuǎn)化為NFA以及把NFA轉(zhuǎn)為相應(yīng)的DFA,最后再把DFA簡化,DFA的狀態(tài)轉(zhuǎn)化為相應(yīng)的子程序,最后得到詞法分析器
4、160; 4.C語言的基本語法。 三、實(shí)驗(yàn)要求 1、該個詞法分析器要求至少能夠識別以下幾類單詞: 關(guān)鍵字:else if int return void while共6個,所有的關(guān)鍵字都是保留字,并且必須是小寫; 標(biāo)識符:識別與C語言詞法規(guī)定相一致的標(biāo)識符,通過下列正則表達(dá)式定義:ID = letter (letter | digit)*; 常數(shù):NUM
5、 = digit digit*(.digit digit* |)(e(+ | - |) digit digit* |),letter = a|.|z|A|.|Z|,digit = 0|.|9,包括整數(shù),如123等;小數(shù),如123.45等;科學(xué)計(jì)數(shù)法表示的常數(shù),如1.23e3,2.3e-9等; 專用符號:+ - * / < <= > >=
6、0;= != = , ( ) /* */; 2、分析器的輸入為由上述幾類單詞構(gòu)成的程序,輸出為該段程序的機(jī)內(nèi)表示形式,即關(guān)鍵字、運(yùn)算符、界限符變?yōu)槠鋵?yīng)的機(jī)內(nèi)符,常數(shù)使用二進(jìn)制形式,標(biāo)識符使用相應(yīng)的標(biāo)識符表指針表示。 3、詞法分析器應(yīng)當(dāng)能夠指出源程序中的詞法錯誤,如不可識別的符號、錯誤的詞法等。四、實(shí)驗(yàn)結(jié)果(程序)及分析 #include<stdio.h> #include<stdlib.h>
7、;#include<string.h> #define N 100 typedef struct char name30; int code; int addr; token;/存儲剛從文件中讀取的字符typedef struct char name30; int code; Keyword;
8、typedef struct char name30; int code; int addr;symbol; Keyword key6="else",1,"if",2,"int",3,"return",4,"void",5,"where",6; char ch;/接受字符 FILE *source;
9、/源文件 FILE *keytxt;/關(guān)鍵字輸出文件 FILE *badgetxt;/標(biāo)識符輸出文件 FILE *othertxt;/其他單詞輸出文件 FILE *number; int error_count;/錯誤的個數(shù) int addr_count;/標(biāo)識符表的指針 int lineof;/行號 token current;/ 暫時存放讀入的字符 token zancun;
10、160;symbol currentsymbol; symbol symboltableN;/標(biāo)識符表void error(int i); void main() void scan(); error_count=0; addr_count=0; error_count=0; lineof=0; scan();
11、160;void scan() int i=0; void iskeyword();/判斷關(guān)鍵字void isOthers() /判斷其他單詞 void output_1();/關(guān)鍵字輸出文件 void output_2();/標(biāo)識符輸出文件 void output_others();/其他單詞輸出文件void Iszhushi(); void isnu
12、mber(); if(source=fopen("Source.txt","r")=NULL) /打開源文件printf("file open error/n"); exit(0); if(keytxt=fopen("key.txt","w")=NULL) /打開關(guān)鍵字文件printf("
13、;file open error/n"); exit(0); if(badgetxt=fopen("badge.txt","w")=NULL) /打開標(biāo)識符文件 printf("file open error/n"); exit(0); if(othertxt=fopen("
14、others.txt","w")=NULL) printf("file open errorn"); exit(0); if(number=fopen("number.txt","w")=NULL) printf("file open errorn");
15、;exit(0); ch=fgetc(source); while(ch!=EOF) for(i=0;i<30;i+) i='0' if(ch>='a' && ch<='z') |(ch&
16、gt;='A' && ch<='Z') | ch='_' ) iskeyword(); if(ch='') Iszhushi(); if(ch>='0'&&
17、0;ch<='9') isnumber(); else isOthers(); ch=fgetc(source); fclose(source); fclose(keytxt); fcl
18、ose(badgetxt); fclose(othertxt); fclose(number); void iskeyword() int i=0,k=0,j=0; int h=0; while(ch>='a') && (ch<='z') |(ch>='A') && (ch<=&
19、#39;Z') | ch='_' | (ch>'0' && ch<'9') i=ch; i+;
20、60; ch=fgetc(source); zancun=current; for(i=0;i<6;i+) for(j=0;j<30;j+) if(j=j) h=0; else h=1;
21、160; break; if(h=0) break; if(h=0) current.code=keyi.code; output_1(); else
22、160; strcpy(symboltableaddr_,); symboltableaddr_count.code=10; symboltableaddr_count.addr=addr_count;
23、 addr_count+; output_2(); void isOthers()char ch1;int i; for(i=0;i<30;i+) i='0'
24、; switch(ch) case '+': 0='+'
25、; current.code=13; current.addr=-1; output_others();
26、160; break; case '-': 0='-'
27、 current.code=14; current.addr=-1; output_others(); break;
28、160; case '*': 0='*' current.code=15;
29、160; current.addr=-1; output_others(); break; case
30、60;'/': 0='/' current.code=16; current.addr=-1; ou
31、tput_others(); break; case'<': ch1=fgetc(source);
32、; if(ch1='=') 0='<' 1='=' current.code=17;
33、0; output_others(); break; else fseek(source,-1,1);
34、160; 0='<' current.code=18; current.addr=-1;
35、; output_others(); break; case'>': ch1=fgetc(source); &
36、#160; if(ch1='=') 0='>' 1='=' current.code=19; output_ot
37、hers(); break; else fseek(source,-1,1); 0='>' current.code=20; output_others();
38、 break; case'=': ch1=fgetc(source); if(ch1='=')0='='1='='current.code=21;current.addr=-1;output_others();break;else 0='=' curr
39、ent.code=22; current.addr=-1; output_others(); fseek(source,-1,1);break;case '!': ch1=fgetc(source); if(ch1='=')0='!'1='='current.code=23;current.addr=-1;output_others();break;elsefseek(source,-1,1); cur
40、0='!' current.code=24; current.addr=-1;output_others();break;case '': 0='' current.code=25; current.addr=-1; output_others(); break; case ',':&
41、#160; 0=',' current.code=26; current.addr=-1; output_others(); case '(': int i=ftell(source); &
42、#160;char ch1=ch; char ch2; while(ch!=')') ch=fgetc(source); if(ch=')') 0=ch1;
43、160; 1=ch; current.code=27; current.addr=-1; output_others(); fseek(source,i,0); ch2=fgetc(source); ch2=fgetc(source);
44、60;break; else error_count+; error(1); fseek(source,i,0); ch2=fgetc(source); ch2=fgetc(source); break; case '': current.na
45、me0='' current.code=28; current.addr=-1; output_others(); break; case '': 0='' current.code=28; current.addr=-1; output_others(); &
46、#160; break; case '': 0='' current.code=29; current.addr=-1;
47、 output_others(); break; case '': 0='' current.code=29;
48、 current.addr=-1; output_others(); break; case'10': lineof+; break; void Iszhushi() char ch1;
49、60;ch1=ch;ch=fgetc(source); if(ch='*') for(;) ch=fgetc(source); if(ch=EOF) error(2); break; if(ch='*') ch1=ch; ch=fgetc(source); if(ch='') ch=fgetc(source); break;&
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同解除條件合同范本
- 反擔(dān)保合同范例app
- 小學(xué)課題申報(bào)書 寫字
- 高校省級課題申報(bào)書
- 員工合同范本表
- 師德建設(shè)課題申報(bào)書
- 企業(yè)員工租房合同范本
- 吉安農(nóng)村生意轉(zhuǎn)讓合同范例
- 申報(bào)課題沒申報(bào)書
- 醫(yī)療務(wù)工合同范本武威市
- 2025年國航機(jī)務(wù)系統(tǒng)AMECO工程師崗位校園招聘筆試參考題庫附帶答案詳解
- 《物聯(lián)網(wǎng)中間件》課件
- 2025年中國建材集團(tuán)所屬中建材聯(lián)合投資有限公司招聘筆試參考題庫附帶答案詳解
- 水幕噴淋系統(tǒng)的工作原理與應(yīng)用
- 門樓施工方案
- 全國職業(yè)院校技能大賽高職組(康復(fù)治療技術(shù)賽項(xiàng))考試及答案
- 2024年08月河北唐山銀行第二批社會招考筆試歷年參考題庫附帶答案詳解
- 小學(xué)生拗九節(jié)課件
- 《智能制造技術(shù)基礎(chǔ)》課件-第2章 智能系統(tǒng)方案與設(shè)計(jì)
- 人教版PEP小學(xué)五年級英語下冊全冊教案(含計(jì)劃)
- 2025年幼兒園膳食工作計(jì)劃
評論
0/150
提交評論