版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
編譯原理實驗報告學院:計算機與通信工程學院專業(yè):計算機科學與技術班級:學號:姓名:實驗成績:詞法分析實驗目的設計、編制并調試一個詞法分析程序,加深對詞法分析原理的理解。實驗要求2.1待分析的簡單的詞法(1)關鍵字:beginifthenwhiledoend所有的關鍵字都是小寫。(2)運算符和界符:=+-*/<<=<>>>==;()#(3)其他單詞是標識符(ID)和整型常數(shù)(SUM),通過以下正規(guī)式定義:ID=letter(letter|digit)*NUM=digitdigit*(4)空格有空白、制表符和換行符組成??崭褚话阌脕矸指鬒D、SUM、運算符、界符和關鍵字,詞法分析階段通常被忽略。2.2各種單詞符號對應的種別碼:表2.1各種單詞符號對應的種別碼單詞符號種別碼單詞符號種別碼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)構成的序列。其中:syn為單詞種別碼;token為存放的單詞自身字符串;sum為整型常數(shù)。例如:對源程序beginx:=9:ifx>9thenx:=2*x+1/3;end#的源文件,經過詞法分析后輸出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……三、詞法分析程序的算法思想:算法的基本任務是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據掃描到單詞符號的第一個字符的種類,拼出相應的單詞符號。3.1主程序示意圖:3.2詞法分析程序流程圖:開始開始變量初始化是否文件結束?返回拼數(shù)Syn=11返回拼字符串是否是關鍵字?Syn為對應關鍵字的單詞種別碼Syn=10給不同的符號相同的Syn值報錯是否數(shù)字字母是否、運算符,界符等其他四、詞法分析程序的C++語言程序源代碼:#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("輸入源程序(以#結束):"); 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);}}五、結果分析:輸入beginx:=9:ifx>9thenx:=2*x+1/3;end#后如圖所示:六、總結:詞法分析的基本任務是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據掃描到單詞符號的第一個字符的種類,拼出相應的單詞符號。通過本試驗的完成,更加加深了對詞法分析原理的理解。語法分析實驗目的編制一個遞歸下降分析程序,實現(xiàn)對詞法分析程序所提供的單詞序列的語法檢查和結構分析。實驗要求利用C語言編制遞歸下降分析程序,并對簡單語言進行語法分析。2.1待分析的簡單語言的語法用擴充的BNF表示如下:⑴<程序>::=begin<語句串>end⑵<語句串>::=<語句>{;<語句>}⑶<語句>::=<賦值語句>⑷<賦值語句>::=ID:=<表達式>⑸<表達式>::=<項>{+<項>|-<項>}⑹<項>::=<因子>{*<因子>|/<因子>⑺<因子>::=ID|NUM|(<表達式>)2.2實驗要求說明輸入單詞串,以“#”結束,如果是文法正確的句子,則輸出成功信息,打印“success”,否則輸出“error”。例如:輸入begina:=9;x:=2*3;b:=a+xend#輸出success!輸入x:=a+b*cend#輸出error2.3語法分析程序的酸法思想(1)主程序示意圖如圖2-1所示。置初值置初值調用scaner讀下一個單詞符號調用scaner讀下一個單詞符號調用lrparser調用lrparser結束結束圖2-1語法分析主程序示意圖(2)遞歸下降分析程序示意圖如圖2-2所示。(3)語句串分析過程示意圖如圖2-3所示。是否begin?是否begin?調用statement函數(shù) 否調用statement函數(shù) 是是否;?調用scaner是否;?調用scaner否調用語句串分析程序調用語句串分析程序 是調用scaner調用scaner是否end?否是否end? 調用statement函數(shù)調用statement函數(shù) 是調用scaner調用scaner出錯處理出錯處理syn=0&&kk=0? 否syn=0&&kk=0? 圖2-3語句串分析示意圖是打印分析成功出錯處理 打印分析成功出錯處理 圖2-2遞歸下降分析程序示意圖(4)statement語句分析程序流程如圖2-4、2-5、2-6、2-7所示。調用term函數(shù)是否標識符?調用term函數(shù)是否標識符? 否調用expression函數(shù)調用scaner是否:=?調用scaner調用expression函數(shù)調用scaner是否:=?調用scaner是否+,-? 否是否+,-? 否 是調用scaner調用scaner調用term函數(shù)調用term函數(shù)出錯處理出錯處理出錯處理出錯處理圖2-4statement語句分析函數(shù)示意圖圖2-5expression表達式分析函數(shù)示意圖調用scaner調用factor函數(shù)出錯處理是否*,/?調用factor函數(shù)調用scaner調用factor函數(shù)出錯處理是否*,/?調用factor函數(shù)是否標識符? 是是否標識符? 否 否是否整常數(shù)? 是是否整常數(shù)? 是 否是否(? 否是否(? 是調用scaner調用scaner是否)?調用expression函數(shù)圖2-6term分析函數(shù)示意圖是否)?調用expression函數(shù) 否出錯處理調用scaner調用scaner 是出錯處理調用scaner調用scaner 圖2-7factor分析過程示意圖語法分析程序的C語言程序源代碼:#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"};//關鍵字intsyn=0;intmyIsAlpha(charch){ if(islower(ch)==2||isupper(ch)==1) { return1; } else { return0; }}voidscaner(char*input,intinputLength,int*index){ chars[256]="";//保存當前的字符 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;//添加到當前字符串中 nowPosition++; ch=GetChar(input,index,inputLength); } if((ch<'0'||ch>'9')&&(myIsAlpha(ch)==0))//進行回退操作,并輸出結果 { s[nowPosition]='\0';//添加結束標志 j=reserve(s); if(j==0) { syn=10; } else { syn=j; } (*index)--; return; } else//超過范圍 { s[nowPosition++]=ch; s[nowPosition]='\0';//添加結束標志 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;//添加到當前字符串中 nowPosition++; ch=GetChar(input,index,inputLength); } if(ch<'0'||ch>'9')//進行回退操作 { (*index)--; syn=11; return; } else//超過范圍時 { 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("(非法符號)"); } } }}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("輸出賦值號錯誤!\n"); getchar(); exit(0); } } else { printf("輸出語句錯誤!%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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國休閑零食電商行業(yè)市場全景調研及投資規(guī)劃建議報告
- 大學生自我介紹范文集合七篇
- 銀行客服工作總結(15篇)
- 建筑實習報告模板合集七篇
- 乒乓球比賽作文300字匯編十篇
- 消防安全在我心中演講稿5篇
- 后備干部培訓心得體會800字
- 辭職報告范文匯編15篇
- 大學自我介紹(15篇)
- 員工工作計劃范文集錦八篇
- 2024秋期國家開放大學本科《納稅籌劃》一平臺在線形考(形考任務一至五)試題及答案
- 房租收條格式(3篇)
- 期末試卷(試題)2024-2025學年培智生活語文二年級上冊
- 《技術規(guī)程》范本
- DBJ50T-城鎮(zhèn)排水系統(tǒng)評價標準
- 紅色簡約中國英雄人物李大釗課件
- 小學師德考評細則
- 軟件定義網絡(SDN)實戰(zhàn)教程課件
- 2024版《大學生職業(yè)生涯規(guī)劃與就業(yè)指導》 課程教案
- 專題10閱讀理解、拓展探究-2022-2023學年八年級數(shù)學上冊期末選填解答壓軸題必刷專題訓練(華師大版)(原卷版+解析)
- 西師大版五年級上冊小數(shù)混合運算題100道及答案
評論
0/150
提交評論