资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
编译原理实验报告实验名称: 分析调试语义分析程序 TEST抽象机模拟器完整程序 保证能用! 一、实验目的通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。二、实验设计程序流程图语法分析程序代码:Main.cpp#include#includeextern bool TESTparse(char *pFileName);extern int TESTScan(FILE *fin,FILE *fout);FILE *fin,*fout; /用于指定输入输出文件的指针int main()char szFinName300;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创建词法分析输出文件出错!n);return 0;int es = TESTScan(fin,fout);fclose(fin);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 compound_Stat();bool program();bool statement();bool expression_stat();bool expression();bool bool_expr();bool additive_expr();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 compound_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;fscanf(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 true;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(文件为空!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 )/ 文件中仅有ProcessError(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;/:=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,token1) = 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();/
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号