TEST语言语法分析

.编译原理实验报告分析调试语义分析程序实验名称: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...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

文秘专家
机构认证
内容提供者

1

确认删除?