.编译原理实验报告分析调试语义分析程序实验名称:TEST抽象机模拟器完整程序!!!保证能用!!一、实验目的语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的TEST通过分析调试理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。二、实验设计程序流程图..Statement_list()es=0开始token=}YTooken=ifToken=ifYes=1NNToken=whileYNToken=forYNYToken=readYNNNToken=writeYNToken={YYYNToken=ID|NUM|(YNNtoken=}Y语法分析读入一个es=0符号{Yes=0NIf_stat()while_stat()for_stat()declaration_list()read_stat()es=0NStatement_list()write_stat()es=0N}Y返回Compound_state()es=2expression_stat()Return(es)..开Es=词法分输出词Es>分析失输出词分析成语法分输出语Es=分析成输出语分析错结程序代码Main.cpp#include<stdio.h>#include<ctype.h>externboolTESTparse(char*pFileName);..externintTESTScan(FILE*fin,FILE*fout);用于指定输入输出文件的指针FILE*fin,*fout;//intmain(){charszFinName[300];charszFoutName[300];:);请输入源程序文件名(包括路径)牰湩晴尨scanf(%s,szFinName););牰湩晴尨请输入词法分析输出文件名(包括路径):scanf(%s,szFoutName);if((fin=fopen(szFinName,))==NULL){\n);printf(\打开词法分析输入文件出错!return0;}if((fout=fopen(szFoutName,w))==NULL){\n);创建词法分析输出文件出错!printf(\return0;}intes=TESTScan(fin,fout);fclose(fin);fclose(fout);if(es>0)\n,es);%d词法分析有错,编译停止!共有牰湩晴尨个错误!elseif(es==0){\n);牰湩晴尨词法分析成功!0;intes=..调语法分析=TESTparse(szFoutName);//es\n);语法分析成功!晩攨??牴敵??牰湩晴尨\n);汥敳瀠楲瑮?语法分析错误!}else!\n);词法分析出现未知错误牰湩晴尨}Parse.cpp#include<stdio.h>#include<string.h>#include<ctype.h>#include<conio.h>#include<vector>//functionboolTESTparse();boolcompound_Stat();boolprogram();boolstatement();boolexpression_stat();boolexpression();boolbool_expr();booladditive_expr();boolterm();boolfactor();..boolif_stat();boolwhile_stat();boolfor_stat();boolwrite_stat();boolread_stat();booldeclaration_stat();booldeclaration_list();boolstatement_list();boolcompound_stat();//token保存单词符号,token1保存单词chartoken[20],token1[40];值用于指向输入文件的指针//FILE*fp;0;intEsLine=typedefstruct{intes;intline;}EsInf;StackEs;std::vector<EsInf>//语法分析程序voidProcessError(intes){temp;EsInfes;=temp.esEsLine;temp.line=StackEs.push_back(temp);}boolReadFile(char*tok,char*tok1){if(feof(fp))returnfalse;..fscanf(fp,%s\t%s\n,tok,tok1);printf(%s\t%s\n,tok,tok1);EsLine++;returntrue;}boolTESTparse(char*pFileName){true;booles=if((fp=fopen(pFileName,))==NULL){!\n,pFileName);错误打开%sprintf(\returnfalse;}elseprogram();if(!feof(fp))ProcessError(9);fclose(fp);=====\n);printf(=====语法分析结果!if(StackEs.size()==0){\n);语法分析成功!牰湩晴尨returntrue;}else{inti;for(i=0;i<StackEs.size();i++){,StackEs[i].line);牰湩晴尨行在第%dswitch(StackEs[i].es)..{\n);break;!{慣敳ㄠ瀺楲瑮?缺少\n);break;!慣敳㈠瀺楲瑮?缺少}\n);break;缺少标识符!慣敳?瀺楲瑮?\n);break;缺少分号!慣敳?瀺楲瑮?\n);break;!慣敳?瀺楲瑮?缺少(\n);break;!缺少)慣敳?瀺楲瑮?\n);break;缺少操作数!慣敳?瀺楲瑮?\n);break;文件为空!慣敳?瀺楲瑮?\n);break;文件尾有多余字符!慣敳?瀺楲瑮?!\n,pFileName);break;%s错误case10:printf(\打开}}returnfalse;}}>}><语句序列//《程序》::={<声明序列//program::={<declaration_;list><statement_list>}boolprogram(){booles=true;if(ReadFile(token,token1)==false){//ProcessError(8);文件结束returnfalse;}判断是否为‘if(strcmp(token,{))//{'ProcessError(1);if(ReadFile(token,token1)==false)文件中仅有{//Proces...