北京科技大學(xué)編譯原理實(shí)驗(yàn)報(bào)告_第1頁(yè)
北京科技大學(xué)編譯原理實(shí)驗(yàn)報(bào)告_第2頁(yè)
北京科技大學(xué)編譯原理實(shí)驗(yàn)報(bào)告_第3頁(yè)
北京科技大學(xué)編譯原理實(shí)驗(yàn)報(bào)告_第4頁(yè)
北京科技大學(xué)編譯原理實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩18頁(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)介

編譯原理實(shí)驗(yàn)報(bào)告學(xué)院:計(jì)算機(jī)與通信工程學(xué)院專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)班級(jí):學(xué)號(hào):姓名:實(shí)驗(yàn)成績(jī):詞法分析實(shí)驗(yàn)?zāi)康脑O(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,加深對(duì)詞法分析原理的理解。實(shí)驗(yàn)要求2.1待分析的簡(jiǎn)單的詞法(1)關(guān)鍵字:beginifthenwhiledoend所有的關(guān)鍵字都是小寫(xiě)。(2)運(yùn)算符和界符:=+-*/<<=<>>>==;()#(3)其他單詞是標(biāo)識(shí)符(ID)和整型常數(shù)(SUM),通過(guò)以下正規(guī)式定義:ID=letter(letter|digit)*NUM=digitdigit*(4)空格有空白、制表符和換行符組成??崭褚话阌脕?lái)分隔ID、SUM、運(yùn)算符、界符和關(guān)鍵字,詞法分析階段通常被忽略。2.2各種單詞符號(hào)對(duì)應(yīng)的種別碼:表2.1各種單詞符號(hào)對(duì)應(yīng)的種別碼單詞符號(hào)種別碼單詞符號(hào)種別碼bgin1:17If2:=18Then3<20wile4<>21do5<=22end6>23lettet(letter|digit)*10>=24dightdight*11=25+13;26—14(27*15)28/16#02.3詞法分析程序的功能:輸入:所給文法的源程序字符串。輸出:二元組(syn,token或sum)構(gòu)成的序列。其中:syn為單詞種別碼;token為存放的單詞自身字符串;sum為整型常數(shù)。例如:對(duì)源程序beginx:=9:ifx>9thenx:=2*x+1/3;end#的源文件,經(jīng)過(guò)詞法分析后輸出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……三、詞法分析程序的算法思想:算法的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。3.1主程序示意圖:3.2詞法分析程序流程圖:開(kāi)始開(kāi)始變量初始化是否文件結(jié)束?返回拼數(shù)Syn=11返回拼字符串是否是關(guān)鍵字?Syn為對(duì)應(yīng)關(guān)鍵字的單詞種別碼Syn=10給不同的符號(hào)相同的Syn值報(bào)錯(cuò)是否數(shù)字字母是否、運(yùn)算符,界符等其他四、詞法分析程序的C++語(yǔ)言程序源代碼:#include"stdio.h"#include"stdlib.h"#include"string.h"#define_KEY_WORD_END"waitingforyourexpanding"typedefstruct{ inttypenum; char*word;}WORD;charinput[255];chartoken[255]="";intp_input;intp_token;charch;char*rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};WORD*scaner();intmain(){ intover=1; WORD*oneword=newWORD; printf("輸入源程序(以#結(jié)束):"); scanf("%[^#]s",input); p_input=0; printf("Yourwords:\n%s\n",input); while(over<1000&&over!=-1) { oneword=scaner(); if(oneword->typenum<1000) printf("(%d,%s)\n",oneword->typenum,oneword->word); over=oneword->typenum; } printf("\npress#toexit:"); scanf("%[^#]s",input); return0;}charm_getch(){ ch=input[p_input]; p_input=p_input+1; return(ch);}voidgetbc(){ while(ch==''||ch==10) { ch=input[p_input]; p_input=p_input+1; }}voidconcat(){ token[p_token]=ch; p_token=p_token+1; token[p_token]='\0';}intletter(){ if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') return1; else return0;}intdigit(){ if(ch>='0'&&ch<='9') return1; else return0;}intreserve(){ inti=0; while(strcmp(rwtab[i],_KEY_WORD_END)) { if(!strcmp(rwtab[i],token)) { returni+1; } i=i+1; } return10;}voidretract(){ p_input=p_input-1;}char*dtp(){ returnNULL;}WORD*scaner(){ WORD*myword=newWORD; myword->typenum=10; myword->word=""; p_token=0; m_getch(); getbc(); if(letter()) { while(letter()||digit()) { concat(); m_getch(); } retract(); myword->typenum=reserve(); myword->word=token; return(myword); } elseif(digit()) { while(digit()) { concat(); m_getch(); } retract(); myword->typenum=20; myword->word=token; return(myword); } elseswitch(ch) { case'=':m_getch(); if(ch=='=') { myword->typenum=39; myword->word="=="; return(myword); } retract(); myword->typenum=21; myword->word="="; return(myword); break; case'+':myword->typenum=22; myword->word="+"; return(myword); break; case'-':myword->typenum=23; myword->word="-"; return(myword); break; case'*':myword->typenum=24; myword->word="*"; return(myword); break; case'/':myword->typenum=25; myword->word="/"; return(myword); break; case'(':myword->typenum=26; myword->word="("; return(myword); break; case')':myword->typenum=27; myword->word=")"; return(myword); break; case'[':myword->typenum=28; myword->word="["; return(myword); break; case']':myword->typenum=29; myword->word="]"; return(myword); break; case'{':myword->typenum=30; myword->word="{"; return(myword); break; case'}':myword->typenum=31; myword->word="}"; return(myword); break; case',':myword->typenum=32; myword->word=","; return(myword); break; case':':myword->typenum=33; myword->word=":"; return(myword); break; case';':myword->typenum=34; myword->word=";"; return(myword); break; case'>':m_getch(); if(ch=='=') { myword->typenum=37; myword->word=">="; return(myword); } retract(); myword->typenum=35; myword->word=">"; return(myword); break; case'<':m_getch(); if(ch=='=') { myword->typenum=38; myword->word="<="; return(myword); } retract(); myword->typenum=36; myword->word="<"; return(myword); break; case'!':m_getch(); if(ch=='=') { myword->typenum=40; myword->word="!="; return(myword); } retract(); myword->typenum=-1; myword->word="ERROR"; return(myword); break; case'\0':myword->typenum=1000; myword->word="OVER"; return(myword); break; default:myword->typenum=-1; myword->word="ERROR"; return(myword);}}五、結(jié)果分析:輸入beginx:=9:ifx>9thenx:=2*x+1/3;end#后如圖所示:六、總結(jié):詞法分析的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),其基本思想是根據(jù)掃描到單詞符號(hào)的第一個(gè)字符的種類,拼出相應(yīng)的單詞符號(hào)。通過(guò)本試驗(yàn)的完成,更加加深了對(duì)詞法分析原理的理解。語(yǔ)法分析實(shí)驗(yàn)?zāi)康木幹埔粋€(gè)遞歸下降分析程序,實(shí)現(xiàn)對(duì)詞法分析程序所提供的單詞序列的語(yǔ)法檢查和結(jié)構(gòu)分析。實(shí)驗(yàn)要求利用C語(yǔ)言編制遞歸下降分析程序,并對(duì)簡(jiǎn)單語(yǔ)言進(jìn)行語(yǔ)法分析。2.1待分析的簡(jiǎn)單語(yǔ)言的語(yǔ)法用擴(kuò)充的BNF表示如下:⑴<程序>::=begin<語(yǔ)句串>end⑵<語(yǔ)句串>::=<語(yǔ)句>{;<語(yǔ)句>}⑶<語(yǔ)句>::=<賦值語(yǔ)句>⑷<賦值語(yǔ)句>::=ID:=<表達(dá)式>⑸<表達(dá)式>::=<項(xiàng)>{+<項(xiàng)>|-<項(xiàng)>}⑹<項(xiàng)>::=<因子>{*<因子>|/<因子>⑺<因子>::=ID|NUM|(<表達(dá)式>)2.2實(shí)驗(yàn)要求說(shuō)明輸入單詞串,以“#”結(jié)束,如果是文法正確的句子,則輸出成功信息,打印“success”,否則輸出“error”。例如:輸入begina:=9;x:=2*3;b:=a+xend#輸出success!輸入x:=a+b*cend#輸出error2.3語(yǔ)法分析程序的酸法思想(1)主程序示意圖如圖2-1所示。置初值置初值調(diào)用scaner讀下一個(gè)單詞符號(hào)調(diào)用scaner讀下一個(gè)單詞符號(hào)調(diào)用lrparser調(diào)用lrparser結(jié)束結(jié)束圖2-1語(yǔ)法分析主程序示意圖(2)遞歸下降分析程序示意圖如圖2-2所示。(3)語(yǔ)句串分析過(guò)程示意圖如圖2-3所示。是否begin?是否begin?調(diào)用statement函數(shù) 否調(diào)用statement函數(shù) 是是否;?調(diào)用scaner是否;?調(diào)用scaner否調(diào)用語(yǔ)句串分析程序調(diào)用語(yǔ)句串分析程序 是調(diào)用scaner調(diào)用scaner是否end?否是否end? 調(diào)用statement函數(shù)調(diào)用statement函數(shù) 是調(diào)用scaner調(diào)用scaner出錯(cuò)處理出錯(cuò)處理syn=0&&kk=0? 否syn=0&&kk=0? 圖2-3語(yǔ)句串分析示意圖是打印分析成功出錯(cuò)處理 打印分析成功出錯(cuò)處理 圖2-2遞歸下降分析程序示意圖(4)statement語(yǔ)句分析程序流程如圖2-4、2-5、2-6、2-7所示。調(diào)用term函數(shù)是否標(biāo)識(shí)符?調(diào)用term函數(shù)是否標(biāo)識(shí)符? 否調(diào)用expression函數(shù)調(diào)用scaner是否:=?調(diào)用scaner調(diào)用expression函數(shù)調(diào)用scaner是否:=?調(diào)用scaner是否+,-? 否是否+,-? 否 是調(diào)用scaner調(diào)用scaner調(diào)用term函數(shù)調(diào)用term函數(shù)出錯(cuò)處理出錯(cuò)處理出錯(cuò)處理出錯(cuò)處理圖2-4statement語(yǔ)句分析函數(shù)示意圖圖2-5expression表達(dá)式分析函數(shù)示意圖調(diào)用scaner調(diào)用factor函數(shù)出錯(cuò)處理是否*,/?調(diào)用factor函數(shù)調(diào)用scaner調(diào)用factor函數(shù)出錯(cuò)處理是否*,/?調(diào)用factor函數(shù)是否標(biāo)識(shí)符? 是是否標(biāo)識(shí)符? 否 否是否整常數(shù)? 是是否整常數(shù)? 是 否是否(? 否是否(? 是調(diào)用scaner調(diào)用scaner是否)?調(diào)用expression函數(shù)圖2-6term分析函數(shù)示意圖是否)?調(diào)用expression函數(shù) 否出錯(cuò)處理調(diào)用scaner調(diào)用scaner 是出錯(cuò)處理調(diào)用scaner調(diào)用scaner 圖2-7factor分析過(guò)程示意圖語(yǔ)法分析程序的C語(yǔ)言程序源代碼:#include<stdio.h>#include<string.h>#include<ctype.h>#include<stdlib.h>charGetChar(char*input,int*index,intlength);intClearBlank(char*input,int(*index),intlength);intreserve(char*s);voidlrparser(char*input,intinputLength,int*index);voidyucu(char*input,intinputLength,int*index);voidfactor(char*input,intinputLength,int*index);voidstatement(char*input,intinputLength,int*index);voidexpression(char*input,intinputLength,int*index);voidterm(char*input,intinputLength,int*index);char*retab[6]={"begin","if","then","while","do","end"};//關(guān)鍵字intsyn=0;intmyIsAlpha(charch){ if(islower(ch)==2||isupper(ch)==1) { return1; } else { return0; }}voidscaner(char*input,intinputLength,int*index){ chars[256]="";//保存當(dāng)前的字符 charch=GetChar(input,index,inputLength); intnowPosition=0; intj=0; if(myIsAlpha(ch)==1)//如果是字母 { while(((ch>='0'&&ch<='9')||(myIsAlpha(ch)==1))&&*index<=inputLength) { s[nowPosition]=ch;//添加到當(dāng)前字符串中 nowPosition++; ch=GetChar(input,index,inputLength); } if((ch<'0'||ch>'9')&&(myIsAlpha(ch)==0))//進(jìn)行回退操作,并輸出結(jié)果 { s[nowPosition]='\0';//添加結(jié)束標(biāo)志 j=reserve(s); if(j==0) { syn=10; } else { syn=j; } (*index)--; return; } else//超過(guò)范圍 { s[nowPosition++]=ch; s[nowPosition]='\0';//添加結(jié)束標(biāo)志 j=reserve(s); if(j==0) { syn=10; } else { syn=j; } getchar(); exit(0);*/ return; } } else if(ch>='0'&&ch<='9')//如果是數(shù)字 { while(ch>='0'&&ch<='9'&&*index<=inputLength) { s[nowPosition]=ch;//添加到當(dāng)前字符串中 nowPosition++; ch=GetChar(input,index,inputLength); } if(ch<'0'||ch>'9')//進(jìn)行回退操作 { (*index)--; syn=11; return; } else//超過(guò)范圍時(shí) { s[nowPosition]=ch; syn=11; return; } } else { switch(ch) { case'+': { syn=13; return; } case'-': { syn=14; return; } case'*': { syn=15; return; } case'/': { syn=16; return; } case'<': { ch=GetChar(input,index,inputLength); if(ch=='=') { syn=22; return; } else if(ch=='>') { syn=21; return; } else { syn=20; if(*index>inputLength) { return; } else { (*index)--; return; } } } case'>': { ch=GetChar(input,index,inputLength); if(ch=='=') { syn=24; return; } else { syn=23; if(*index>inputLength) { return; } else { (*index)--; return; } } } case':': { ch=GetChar(input,index,inputLength); if(ch=='=') { syn=18; return; } else { if(*index>inputLength) { return; } else { (*index)--; return; } } } case'=': { syn=25; return; } case';': {/* syn=26; return; } case'(': { syn=27; return; } case')': { Syn=28; return; } case'#': { syn=0; return; } case'': { syn=-1; return; } default: { printf("(非法符號(hào))"); } } }}intreserve(char*s){ if(strcmp(s,retab[0])==0) { return1; } else if(strcmp(s,retab[1])==0) { return2; } else if(strcmp(s,retab[2])==0) { return3; } else if(strcmp(s,retab[3])==0) { return4; } else if(strcmp(s,retab[4])==0) { return5; } else if(strcmp(s,retab[5])==0) { return6; } else { return0; }}charGetChar(char*input,int*index,intlength){ if(*index<=length) { (*index)++; returninput[(*index)-1]; } else return0;}intClearBlank(char*input,int(*index),intlength){ while((*index)!=length) { if(input[(*index)]==32&&(*index)!=length) { ((*index))++; } else if(input[(*index)]==32&&(*index)==length) { printf("\n謝謝使用!\n"); getchar(); exit(0); } else { return1; } }return0;}voidlrparser(char*input,intinputLength,int*index){ if (syn==1) { scaner(input,inputLength,index); while(syn==-1) { scaner(input,inputLength,index); } yucu(input,inputLength,index); if(syn==6) {scaner(input,inputLength,index); while(syn==-1) { scaner(input,inputLength,index); } if(syn==0) { printf("success\n"); getchar(); return; } } } else { printf("error!"); return; }}voidyucu(char*input,intinputLength,int*index){ statement(input,inputLength,index); while (syn==26) { scaner(input,inputLength,index); while(syn==-1) { scaner(input,inputLength,index); }statement(input,inputLength,index); } return;}voidstatement(char*input,intinputLength,int*index){ if(syn==10) { scaner(input,inputLength,index); while(syn==-1) { scaner(input,inputLength,index); } if(syn==18) { scaner(input,inputLength,index); while(syn==-1) { scaner(input,inputLength,index); } expression(input,inputLength,index); } else { printf("輸出賦值號(hào)錯(cuò)誤!\n"); getchar(); exit(0); } } else { printf("輸出語(yǔ)句錯(cuò)誤!%d\n",syn); getchar(); exit(0); } return;}voidexpression(char*input,intinputLength,int*index){ term(input,inputLength,index); while(syn==13||syn==14) { scaner(input,inputLength,index); while(syn==-1) { scaner(input,inputLength,index); }term(input,inputLength,index); } return;}voidterm(char*input,intinputLength,int*index){ factor(input,inputLength,index); while(syn==15||syn==16) { scaner(input,inputLength,index); whi

溫馨提示

  • 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)論