版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
編譯原理實驗報告26/26課程實驗報告課程名稱:編譯原理(語法分析)專業(yè)班級:信息安全1001班學號:U201014608姓名:指導教師:駱婷報告日期:2010/11/8計算機科學與技術(shù)學院1、實驗目的設(shè)計并編制一個語法分析程序,加深對語法分析程序中遞歸下降分析方法的理解;鞏固對代碼生成及報錯處理等理論的認識;培養(yǎng)對完整系統(tǒng)獨立分析和設(shè)計的能力;培養(yǎng)學生獨立編程的能力;
2、實驗要求利用C語言編制遞歸下降分析程序,并對簡單語言進行語法分析。2.1待分析的簡單語法的語法用擴充的BNF表示如下:<程序>::=begin<語句串>end<語句串>::=<語句>{:語句}<語句>::=<賦值語句><賦值語句>::=ID:=<表達式><表達死>::=<項>{+<項>|-<項>}<項>::=<因子>{*<因子>|/<因子>}<因子>::=ID|NUM|(<表達式>)2.2語法分析程序的功能輸入單詞串,以”#”結(jié)束,如果是文法正確的句子,則輸出成功信息,打印“success”,否則輸出”error”例如:輸入:begina:=9;b:=0end#輸出:success輸入:begina=9end#輸出:error3、詞法分析程序的算法思想算法的基本任務是從字符串中表示的源程序中識別出具有獨立意義的單詞符號,并通過其基本文法,正確規(guī)約到開始符號。全局變量的設(shè)置在此程序中,需要設(shè)置兩個個全局變量:關(guān)鍵字表retab[6]、當前識別的種別號syn。其中retab中元素為“begin”“if”“then”“while”“do”“end”,在程序會掃描出標識符時,首先查關(guān)鍵字表。如果能找到匹配的單詞,則該單詞為關(guān)鍵字,否則為一般標識符。syn用于每一步掃描中scanner的返回值。在整個語法分析程序中均需要使用該全局變量。主程序main算法流程圖開始開始讀取讀取字符串到inputStringinti=0;輸入字符串長度inputLength SScanner()syn==-1syn==-1 Nlrparser()結(jié)束lrparser()結(jié)束掃描子程序scanner()的算法流程圖調(diào)用調(diào)用ch=ch=當前第一個字符字母當前字符串數(shù)字運算符/界符當前字符串syn=種別號當前數(shù)字syn=相應的種別號是否關(guān)鍵字syn=種別號當前數(shù)字syn=相應的種別號是否關(guān)鍵字 其他符號錯誤 N錯誤syn=11syn=11Y返回返回lrparser()的算法流程圖調(diào)用調(diào)用syn=1 Nsyn=1 Yscanner()scanner()yucuyucu()synsyn==6 N Yscanner()scanner()synsyn==0 N Y出錯處理成功,打印“出錯處理成功,打印“success”語句串分析程序yucu()的算法流程圖調(diào)用調(diào)用statement()statement()syn==26(;)syn==26(;)scanner()scanner()出錯處理 Y出錯處理statement語句分析算法流程圖調(diào)用
調(diào)用synsyn==26(;)scanner()scanner()synsyn==18(:=) 否 scanner() 是scanner()出錯處理expression()出錯處理expression()expression表達式分析算法流程圖調(diào)用調(diào)用term()term()是否是否+或- N Yscanner()scanner()出錯處理term出錯處理termterm分析函數(shù)算法流程圖調(diào)用調(diào)用factor()factor()是否*或是否*或/ 出錯處理Scanner()出錯處理Scanner()factor分析函數(shù)算法流程圖調(diào)用調(diào)用是否標識符 Y是否標識符 N是否整常數(shù)是否整常數(shù) Y N 是否(是否( Y scanner();expression()scanner();expression()出錯處理出錯處理是否)是否)scanner();返回 scanner();返回Y4、實驗結(jié)果輸入begina:=9;x:=2*3end#結(jié)果如下輸入begina=9end#結(jié)果如下5、實驗感想及總結(jié)本次實驗和第一實驗一樣,框架已經(jīng)給出,算法已經(jīng)用類C語言寫出,我們需要做的是將第一個實驗和第二個實驗很好的結(jié)合起來。由于第一次實驗中不是按照書中的框架寫出的代碼,因此在第二次實驗時傳遞參數(shù)時出現(xiàn)了問題,最后不得不利用全局變量syn解決。通過兩次編譯原理的實驗,更加理解了詞法語法分析的過程,促進了對課程的進一步學習。6、源代碼#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]="";//保存當前的字符 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))//進行回退操作,并輸出結(jié)果 { s[nowPosition]='\0';//添加結(jié)束標志 j=reserve(s); if(j==0) { syn=10; } else { syn=j; } (*index)--; return; } else//超過范圍 { s[nowPosition++]=ch; s[nowPosition]='\0';//添加結(jié)束標志 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); while(syn==-1) { scaner(input,inputLength,index); }factor(input,inputLength,index); } return;}voidfactor(char*input,intinputLength,int*index){ if(syn==10||syn==11) { scane
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年資源回收與再利用合同
- 2024年藝人品牌管理合同3篇
- 2025版水泥企業(yè)社會責任履行合同3篇
- 二零二五年度二手房委托代辦買賣合同3篇
- 2024年離婚協(xié)議:家庭財產(chǎn)分割合同范本
- 2024消防工程維修服務合同
- 2024年版網(wǎng)絡(luò)游戲運營權(quán)轉(zhuǎn)讓合同
- 2025年度航空航天零部件定制加工合同范本3篇
- 關(guān)于感恩節(jié)活動策劃方案范例(3篇)
- 2025年度濟南寫字樓租賃合同-租金支付與物業(yè)管理細節(jié)2篇
- 2024年礦產(chǎn)資源開發(fā)咨詢服務合同
- 上海市2024-2025學年高一語文下學期期末試題含解析
- 建筑物拆除的拆除工廠考核試卷
- 廣東省深圳市2023-2024學年高二上學期期末測試英語試卷(含答案)
- 乘風化麟 蛇我其誰 2025XX集團年終總結(jié)暨頒獎盛典
- 人教版一年級數(shù)學2024版上冊期末測評(提優(yōu)卷一)(含答案)
- 醫(yī)療護理員理論知識考核試題題庫及答案
- 湖北省荊州市八縣市區(qū)2023-2024學年高二上學期1月期末聯(lián)考數(shù)學試題 附答案
- 保密知識培訓
- 2024年人教版八年級歷史下冊期末考試卷(附答案)
- Python語言基礎(chǔ)與應用學習通超星期末考試答案章節(jié)答案2024年
評論
0/150
提交評論