




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
編譯原理實驗報告實驗名稱: 語法分析 實驗類型: 設計性實驗 指導教師: 蔣勇 專業(yè)班級: 軟件1001班 姓名:李岳東 學號:20101557實驗地點:東6A-319實驗成績:____________________________日期:2012年月日一、實驗目的編譯技術是理論與實踐并重的課程,而其實驗課要綜合運用一、二年級所學的多門課程的內容,用來完成一個小型編譯程序。從而鞏固和加強對詞法分析、語法分析、語義分析、代碼生成和報錯處理等理論的認識和理解;培養(yǎng)學生對完整系統(tǒng)的獨立分析和設計的能力,進一步培養(yǎng)學生的獨立編程能力。二、實驗設計三、實驗過程1)給定文法:(文法舉例) EE+T|T TT*F|F F(E)|i2)構造FIRST()集和FOLLOW()集表3-1FIRST()集和FOLLOW()集FIRSTFOLLOWE(,i#,+,)T(,i#,+,),*F(,i#,+,),* 四、實驗結果 表4-1分析成功 表4-2分析失敗 表4-3載入文件出錯 流程圖如下所示:五、附錄:關鍵代碼#include<iostream>#include<stdio.h>#include<ctype.h>#include<conio.h>#include<string.h>usingnamespacestd;intTESTparse();intprogram();intcompound_Stat();intstatement();intexpression_Stat();intexpression_r();intbool_expr();intadditive_expr();intterm();intfactor();intif_stat();intwhile_stat();intfor_stat();intwrite_stat();intread_stat();intdeclaration_stat();intdeclaration_list();intstatement_list();intcompound_stat();chartoken[20],token1[40];//token保存單詞符號,token1保存單詞值charScanout[300];//保存詞法分析輸出文件名FILE*fp;//用于指向輸入輸出文件的指針//語法分析程序intTESTparse(){intes=0;if((fp=fopen(Scanout,"r"))==NULL){printf("\n打開%s錯誤!\n",Scanout);es=10;}if(es==0)es=program();printf("=====語法分析結果!======\n");switch(es){case0:printf("語法分析成功!\n");break;case10:printf("打開文件%s失敗!\n",Scanout);break;case1:printf("缺少{!\n");break;case2:printf("缺少}!\n");break;case3:printf("缺少標識符!\n");break;case4:printf("少分號!\n");break;case5:printf("缺少(!\n");break;case6:printf("缺少)!\n");break;case7:printf("缺少操作數(shù)!\n");break;}fclose(fp);return(es);}//<程序>::={<聲明序列><語句序列>}//program::={<declaration_list><statement_list>}intprogram(){intes=0;fscanf(fp,"%s%s\n",token,token1);printf("%s%s\n",token,token1);if(strcmp(token,"{"))//判斷是否'{'{es=1;return(es);}fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=declaration_list();if(es>0)return(es);es=statement_list();if(es>0)return(es);if(strcmp(token,"}"))//判斷是否'}'{es=2;return(es);}return(es);}//<聲明序列>::=<聲明序列><聲明語句>|<聲明語句>//<declaration_list>::=//<declaration_list><declaration_stat>|<declaration_stat>//該成<declaration_list>::={<declaration_stat>}intdeclaration_list(){intes=0;while(strcmp(token,"int")==0){es=declaration_stat();if(es>0)return(es);}return(es);}//<聲明語句>::=int<變量>;//<declaration_stat>::=intID;intdeclaration_stat(){intes=0;fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);if(strcmp(token,"ID"))return(es=3);//不是標識符fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);if(strcmp(token,";"))return(es=4);fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);return(es);}//<語句序列>::=<語句序列><語句>|<語句>//<statement_list>::=<statement_list><statement>|<statement>//改成<statement_list>::={<statement>}intstatement_list(){intes=0;while(strcmp(token,"}")){es=statement();if(es>0)return(es);}return(es);}//<語句>::=<if語句>|<while語句>|<for語句>|<read語句>//|<write語句>|<復合語句>|<表達式語句>//<statement>::=<if_stat>|<while_stat>|<for_stat>//|<compound_stat>|<expression_stat>intstatement(){intes=0;if(es==0&&strcmp(token,"if")==0)es=if_stat();//<IF語句>if(es==0&&strcmp(token,"while")==0)es=while_stat();//<while語句>if(es==0&&strcmp(token,"for")==0)es=for_stat();//<for語句>//可在此處添加do語句調用if(es==0&&strcmp(token,"read")==0)es=read_stat();//<read語句>if(es==0&&strcmp(token,"write")==0)es=write_stat();//<write語句>if(es==0&&strcmp(token,"{")==0)es=compound_stat();//<復合語句>if(es==0&&(strcmp(token,"ID")==0||strcmp(token,"NUM")==0||strcmp(token,"(")==0))es=expression_Stat();//<表達式語句>return(es);}//<IF語句>::=if(<表達式>)<語句>[else<語句>]//<IF_stat>::=if(<expr>)<statement>[else<statement>]intif_stat(){intes=0;//iffscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);if(strcmp(token,"("))return(es=5);//少左括號fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=expression_r();if(es>0)return(es);if(strcmp(token,")"))return(es=6);//少右括號fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=statement();if(es>0)return(es);if(strcmp(token,"else")==0)//else部分處理{fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=statement();if(es>0)return(es);}return(es);}//<while語句>::=while(<表達式>)<語句>//<while_stat>::=while(<expr>)<statement>intwhile_stat(){intes=0;fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);if(strcmp(token,"("))return(es=5);//少左括號fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=expression_r();if(es>0)return(es);if(strcmp(token,")"))return(es=6);//少右括號fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=statement();return(es);}//<for語句>::=for(<表達式>;<表達式>;<表達式>)<語句>//<for_stat>::=for(<expr>,<expr>,<expr>)<statement>intfor_stat(){intes=0;fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);if(strcmp(token,"("))return(es=5);//少左括號fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=expression_r();if(es>0)return(es);if(strcmp(token,";"))return(es=4);//少分號fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=expression_r();if(es>0)return(es);if(strcmp(token,";"))return(es=4);//少分號fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=expression_r();if(es>0)return(es);if(strcmp(token,")"))return(es=6);//少右括號fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=statement();return(es);}//<write_語句>::=write<表達式>;//<write_stat>::=write<expression>;intwrite_stat(){intes=0;fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=expression_r();if(es>0)return(es);if(strcmp(token,";"))return(es=4);//少分號fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);return(es);}//<read_語句>::=read<變量>;//<read_stat>::=readID;intread_stat(){intes=0;fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);if(strcmp(token,"ID"))return(es=3);//少標識符fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);if(strcmp(token,";"))return(es=4);//少分號fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);return(es);}//<復合語句>::={<語句序列>}//<compound_stat>::={<statement_list>}intcompound_stat(){//復合語句函數(shù)intes=0;fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=statement_list();return(es);}//<表達式語句>::=<<表達式>;|;//<expression_stat>::=<expression>;|;intexpression_stat(){intes=0;if(strcmp(token,";")==0){fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);return(es);}es=expression_r();if(es>0)return(es);if(es==0&&strcmp(token,";")==0){fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);return(es);}else{es=4;return(es);//少分號}}//<表達式>::=<標識符>=<布爾表達式>|<布爾表達式>//<expr>::=ID=<bool_expr>|<bool_expr>intexpression_r(){intes=0,fileadd;chartoken2[20],token3[40];printf("aaaaaaaaaaa%s\n",token);if(strcmp(token,"ID")==0){fileadd=ftell(fp);//記住當前文件位置fscanf(fp,"%s%s\n",&token2,&token3);printf("%s%s\n",token2,token3);if(es>0)return(es);if(strcmp(token2,"=")==0)//'='{fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=bool_expr();}else{fseek(fp,fileadd,0);//若非'='則文件指針回到'='前的標識符printf("%s%s\n",token,token1);es=bool_expr();if(es>0)return(es);}}elsees=bool_expr();return(es);}//<布爾表達式>::=<算術表達式>|<算術表達式>(>|<|>=|<=|==|!=)<算術表達式>//<bool_expr>::=<additive_expr>//|<additive_expr>(>|<|>=|<=|==|!=)<additive_expr>intbool_expr(){intes=0;es=additive_expr();if(es>0)return(es);if(strcmp(token,">")==0||strcmp(token,">=")==0||strcmp(token,"<")==0||strcmp(token,"<=")==0||strcmp(token,"==")==0||strcmp(token,"!=")==0){fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=additive_expr();if(es>0)return(es);}return(es);}//<算術表達式>::=<項>{(+|-)<項>}//<additive_expr>::=<term>{(+|-)<term>}intadditive_expr(){intes=0;es=term();if(es>0)return(es);while(strcmp(token,"+")==0||strcmp(token,"-")==0){fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=term();if(es>0)return(es);}return(es);}//<項>::=<因子>{(*|/)<因子>}//<term>::=<factor>{(*|/)<factor>}intterm(){intes=0;es=factor();if(es>0)return(es);while(strcmp(token,"*")==0||strcmp(token,"/")==0){fscanf(fp,"%s%s\n",&token,&token1);printf("%s%s\n",token,token1);es=factor();if(es>0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度醫(yī)療健康股權分配與產(chǎn)業(yè)布局協(xié)議
- 二零二五年度酒店員工勞動合同與員工培訓及職業(yè)素養(yǎng)提升合同
- 2025年度金融控股集團間戰(zhàn)略資金借款合同
- 二零二五年度高空作業(yè)安全協(xié)議責任書(高空設備檢修安全協(xié)議)
- 二零二五年度鮮魚養(yǎng)殖與品牌營銷合作合同
- 二零二五年度電子商務平臺技術支持合同范本
- 二零二五年度汽車租賃代駕保險保障合同
- 2025年度餐廳門面租賃與地方旅游發(fā)展合作合同
- 安徽省2025年度非全日制用工勞動合同書解除與終止協(xié)議
- 數(shù)據(jù)安全保障與服務合作合同
- 拗九節(jié)班會方案
- 2022年八大員的勞務員考試題及答案
- DLT5210.4-2018熱工施工質量驗收表格
- 醫(yī)院實習護士轉科表
- 2023年最新的郭氏宗祠的對聯(lián)大全
- 《中國古代文學史》宋代文學完整教學課件
- 新部編人教版四年級下冊道德與法治全冊教案(教學設計)
- 物業(yè)服務企業(yè)市場拓展戰(zhàn)略規(guī)劃課件
- 2018年青海大學碩士論文格式模板
- 四年級道德與法治從中國制造到中國創(chuàng)造
- 兒童跌倒評估量表(Humpty-Dumpty)
評論
0/150
提交評論