《TEST语言语法分析词法分析实验报告》由会员分享,可在线阅读,更多相关《TEST语言语法分析词法分析实验报告(30页珍藏版)》请在金锄头文库上搜索。
1、编译原理实验报告实验名称: 分析调试语义分析程序 TEST抽象机模拟器完整程序 保证能用! 一、实验目的通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。二、实验设计程序流程图语法分析程序代码:Main.cpp#include#includeextern bool TESTparse(char *pFileName);extern int TESTScan(FILE *fin,FILE *fout);FILE *fin,*fout; /用于指定输入输出文件的指针int main()char szFin
2、Name300;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(fi
3、n);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_Sta
4、t();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
5、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 fa
6、lse;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)
7、;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
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 )/
9、 文件中仅有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;ret
10、urn 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();/