




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、-. z.編譯原理實驗報告實驗名稱:分析調試語義分析程序TEST抽象機模擬器完整程序保證能用!一、實驗目的通過分析調試TEST語言的語義分析和中間代碼生成程序,加深對語法制導翻譯思想的理解,掌握將語法分析所識別的語法*疇變換為中間代碼的語義翻譯方法。二、實驗設計程序流程圖語法分析程序代碼:Main.cpp#include#includee*tern bool TESTparse(char *pFileName);e*tern int TESTScan(FILE *fin,FILE *fout);FILE *fin,*fout; /用于指定輸入輸出文件的指針int main()char szFi
2、nName300;char szFoutName300;printf(請輸入源程序文件名包括路徑:);scanf(%s,szFinName);printf(請輸入詞法分析輸出文件名包括路徑:);scanf(%s,szFoutName);if( (fin = fopen(szFinName,r) = NULL)printf(n翻開詞法分析輸入文件出錯!n);return 0;if( (fout = fopen(szFoutName,w) = NULL)printf(n創(chuàng)立詞法分析輸出文件出錯!n);return 0;int es = TESTScan(fin,fout);fclose(fin);
3、fclose(fout);if(es 0)printf(詞法分析有錯,編譯停頓!共有%d個錯誤!n,es);else if(es = 0)printf(詞法分析成功!n);int es=0;es=TESTparse(szFoutName); /調語法分析if(es= true) printf(語法分析成功!n);else printf(語法分析錯誤!n);elseprintf(詞法分析出現未知錯誤!n);Parse.cpp#include#include#include#include#include/ functionbool TESTparse();bool pound_Stat();bo
4、ol program();bool statement();bool e*pression_stat();bool e*pression();bool bool_e*pr();bool additive_e*pr();bool term();bool factor();bool if_stat();bool while_stat();bool for_stat();bool write_stat();bool read_stat();bool declaration_stat();bool declaration_list();bool statement_list();bool pound_
5、stat();char token20,token140;/token保存單詞符號,token1保存單詞值FILE *fp;/用于指向輸入文件的指針int EsLine=0;typedef structint es;int line;EsInf;std:vectorStackEs;/語法分析程序void ProcessError(int es)EsInftemp;temp.es=es;temp.line=EsLine;StackEs.push_back(temp);bool ReadFile(char *tok, char *tok1)if(feof(fp)return false;fscan
6、f(fp,%st%sn,tok,tok1);printf(%st%sn,tok,tok1);EsLine+;return true;bool TESTparse(char *pFileName)bool es=true;if(fp=fopen(pFileName,r)=NULL)printf(n翻開%s錯誤!n,pFileName);return false;elseprogram();if(!feof(fp)ProcessError(9);fclose(fp);printf(=語法分析結果!=n);if(StackEs.size() = 0)printf(語法分析成功!n);return t
7、rue;elseint i;for(i = 0; i StackEs.size(); i+)printf(在第%d行,StackEsi.line);switch(StackEsi.es)case 1:printf(缺少!n);break;case 2:printf(缺少!n);break;case 3:printf(缺少標識符!n);break;case 4:printf(缺少分號!n);break;case 5:printf(缺少(!n);break;case 6:printf(缺少)!n);break;case 7:printf(缺少操作數!n);break;case 8:printf(文
8、件為空!n);break;case 9:printf(文件尾有多余字符!n);break;case 10:printf(n翻開%s錯誤!n,pFileName);break;return false;/程序:=/program:=bool program()bool es = true;if( ReadFile(token,token1) = false )ProcessError(8);/ 文件完畢return false;if(strcmp(token,)/判斷是否為ProcessError(1);if( ReadFile(token,token1) = false )/ 文件中僅有Pro
9、cessError(2);es=declaration_list();if(es = false)return false;es=statement_list();if(es = false)return false;if(strcmp(token,)/判斷是否為ProcessError(2);return true;/:=|/:=/|/改成:=bool declaration_list()bool es = true;while (strcmp(token,int)=0)es=declaration_stat();if(es = false)return false;return es;/:
10、=int;/:=int ID;bool declaration_stat()bool es = true;if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢if(strcmp(token,ID)ProcessError(3); /不是標識符if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢if(strcmp(token,;)ProcessError(4);if( ReadFile(token,to
11、ken1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢return(es);/:=|/:=|/改成:=bool statement_list()bool es=true;if(feof(fp)return false;while(strcmp(token,)es=statement();if(es = false)return(es);return(es);/:=|/ |/:=|/ |bool statement()bool es=true;if(strcmp(token,if)=0 )es=if_stat();/else if(strcm
12、p(token,while)=0 )es=while_stat();/else if(strcmp(token,for)=0 )es=for_stat();/else if(strcmp(token,read)=0 )es=read_stat();/else if(strcmp(token,write)=0 )es=write_stat();/else if(strcmp(token,)=0 )es=pound_stat();/else if(strcmp(token,ID)=0 | strcmp(token,NUM)=0 | strcmp(token,()=0 )es=e*pression_
13、stat();/return(es);/:=if()else/:=if()elsebool if_stat()bool es=true;/ifif( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢if(strcmp(token,()ProcessError(5);/少左括號if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es = e*pression();if(es = false)return(e
14、s);if(strcmp(token,)ProcessError(6);/少右括號if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=statement();if(es = false)return(es);if(strcmp(token,else)=0)/else局部處理if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=statement();if(es = false)return(
15、es);return(es);/:=while()/:=whilebool while_stat()bool es = true;if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢if(strcmp(token,()ProcessError(5);/少左括號if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=e*pression();if(es = false)return(es);if(st
16、rcmp(token,)ProcessError(6);/少右括號if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es = statement();if(es = false)return es;return(es);/:=for(;;)/:=for(;)bool for_stat()bool es=true;if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢if(strcmp(token,()
17、 ProcessError(5); /少左括號if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=e*pression();if(es = false) return (es);if(strcmp(token,;) ProcessError(4); /少分號if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=e*pression();if(es = false) return (es);i
18、f(strcmp(token,;) ProcessError(4); /少分號if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=e*pression();if(es = false) return (es);if(strcmp(token,) ProcessError(6); /少右括號if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=statement();if(es = false
19、) return (es);return es;/:=write;/:=writebool write_stat()bool es = true;if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=e*pression();if(es = false) return (es);if(strcmp(token,;) ProcessError(4); /少分號if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;
20、/ 文件完畢return es;/:=read/:=read Id;bool read_stat()bool es=true;if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢if(strcmp(token,ID)ProcessError(3); /少標識符 if(strcmp(token,;)ProcessError(4); /少分號if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢return
21、 es;/:/:=bool pound_stat() /復合語句函數bool es=true;if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=statement_list();if(es = false)return es;/ - new-if(strcmp(token1,) != 0)ProcessError(2);elseif( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢/ - new
22、 -return es;/:=;|;/:=;|;bool e*pression_stat()bool es=true;if(strcmp(token,;)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢return es;es=e*pression();if(es = false) return es;if(strcmp(token,;)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件
23、完畢return es;elseProcessError(4); /少分號return es;/:=|/:=ID=|bool e*pression()bool es=true;int fileadd;char token220,token340;if(strcmp(token,ID)=0)fileadd=ftell(fp); /記住當前文件位置if( ReadFile(token2,token3) = false )ProcessError(2);/ 缺少return false;/ 文件完畢if(strcmp(token2,=)=0) /=if( ReadFile(token,token1)
24、 = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=bool_e*pr();if(es = false) return es;elsefseek(fp,fileadd,0); /假設非=,則文件指針回到=前的標識符EsLine-;es=bool_e*pr();if(es = false) return es;else es=bool_e*pr();if(es = false) return es;return es;/:=(|=|=|=|!=)/:= (|=|=|=|!=)bool bool_e*pr()bool es=true;es=add
25、itive_e*pr();if(es = false) return es;if(strcmp(token,)=0|strcmp(token,=)=0|strcmp(token,)=0|strcmp(token,=)=0|strcmp(token,!=)=0|strcmp(token,=)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=additive_e*pr();if(es = false) return es;return es;/:=(+|-)/:=(+|-)bool ad
26、ditive_e*pr()bool es=true;es=term();if(es = false) return es;while(strcmp(token,+)=0|strcmp(token,-)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=term();if(es= false) return es;return es;/:=(*|/)/:=(*|/)bool term()bool es=true;es=factor();if(es = false) return es;w
27、hile(strcmp(token,*)=0|strcmp(token,/)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢es=factor();if(es = false) return es;return es;/:=()|/:=()|ID|NUMbool factor()bool es=true;if(strcmp(token,()=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文
28、件完畢es=e*pression();if(es=false) return es;if(strcmp(token,) ProcessError(6); /少右括號if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢elseif(strcmp(token,ID)=0|strcmp(token,NUM)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件完畢return es;elseProcessE
29、rror(7); /缺少操作數return es;Scan.cpp#include#include#include/ 保存字#defineKEYWORDNUM8char*pKeywordKEYWORDNUM=if, else, for, while, do, int, read, write;/ 單分界符charszSingleWord50=+-();,:;/ 雙分界符charszDoubleWord10=!;/ 其他符char*szDivide=/;char*szStar=*;char*szEqual=;#define STATUSNUM16/狀態(tài)個數#define DATANUM10/ 數
30、據流個數/ 數據流類型typedef unsigned int DATA;#define OTHER0/ wrong input#define LETTER1/ 字母#define DIGIT2/ 數字#define SINGLEWORD3/ 單分界符#define DOUBLEWORD4/ 雙分界符#define DIVIDE5/ /#define EQUAL6/ =#define STAR7/ *#define SPACE8/ 空白#define FILEOVER9/ 狀態(tài)類型typedef unsigned int STATUS;#define NOSTATUS0/ wrong inpu
31、t#define START1#define CASE_ID2#define END_ID3#define CASE_NUM4#define END_NUM5#define CASE_SINGLE6#define END_SINGLE7#define CASE_DOUBLE8#define CASE_DOUBLE29#define END_DOUBLE10#define CASE_DIVIDE11#define CASE_NOTE12#define END_NOTE13#define CASE_ERROR14#define END_ERROR15/ 狀態(tài)轉換表/:到達 終結狀態(tài) 的數據不保存在
32、輸出串中intreflectSTATUSNUMDATANUM=/OTHERLETTERDIGITSINGLEWORDDOUBLEWORDDIVIDEEQUALSTARSPACEFILEOVER/*NOSTATUS*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*START*/CASE_ERROR,CASE_ID,CASE_NUM,CASE_SINGLE,CASE_DOUBLE,CASE_DIVIDE,CASE_DOUBLE,CASE_SINGLE,START
33、,START,/*CADE_ID*/END_ID,CASE_ID,CASE_ID,END_ID,END_ID,END_ID,END_ID,END_ID,END_ID,END_ID,/*END_ID*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*CASE_NUM*/END_NUM,END_NUM,CASE_NUM,END_NUM,END_NUM,END_NUM,END_NUM,END_NUM,END_NUM,END_NUM,/*END_NUM*/NOSTAT
34、US,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*CASE_SINGLE*/ END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,/*END_SINGLE*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOST
35、ATUS,NOSTATUS,/*CASE_DOUBLE*/END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,CASE_DOUBLE2,END_SINGLE,END_SINGLE,END_SINGLE,/*CASE_DOUBLE2*/END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,/*END_DOUBLE*/NOSTATUS,NOSTATUS,N
36、OSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*CASE_DIVIDE*/END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,CASE_NOTE,END_SINGLE,END_SINGLE,/*CASE_NOTE*/END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,/*
37、END_NOTE*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*CASE_ERROR*/END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,/*END_ERROR*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS;/ 假設在pString中找到 word 則返回 true,否則,返回 falsebool SearchChar(char word,const char *pString)int n=strlen(pString);for(i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 脫硫塔防腐施工方案
- 磨耗層施工方案
- 空心砌塊施工方案
- 魚峰區(qū)基坑施工方案
- 混凝土橋面系施工方案
- 電影創(chuàng)作技巧講座
- 美甲大學生創(chuàng)業(yè)計劃書
- 管理評審實施計劃
- 課題開題報告:黃炎培職業(yè)教育教學觀研究與實踐
- 課題開題報告:紅色文化教育評價與跟蹤研究
- 《職業(yè)道德與法治》開學第一課(導言)(課件)-【中職專用】中職思想政治《職業(yè)道德與法治》高效課堂課件+教案(高教版2023·基礎模塊)
- (正式版)SHT 3227-2024 石油化工裝置固定水噴霧和水(泡沫)噴淋滅火系統技術標準
- (正式版)JBT 10437-2024 電線電纜用可交聯聚乙烯絕緣料
- 法律知識圖譜構建及應用
- 八卦的基本介紹及其科學內涵
- 誦讀經典傳承文明課件
- 高中數學選擇性必修3 教材習題答案
- 智能語音技術與應用-基于Python實現(高職)全套教學課件
- (建筑制圖)課程綜合自測題3(試卷和答案)
- 公司商業(yè)模式策劃案關鍵合作伙伴
- 北師大版二年級下冊數學第一單元 除法教案
評論
0/150
提交評論