




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理实验报告实验名称: 分析调试语义分析程序 TEST抽象机模拟器完整程序 保证能用! 一、实验目的通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。二、实验设计程序流程图语法分析程序代码:Main.cpp#includestdio.h#includectype.hextern 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#includestdio.h#includestring.h#includectype.h#includeconio.h#includevector/ 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:vectorEsInfStackEs;/语法分析程序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:=declaration_;liststatement_listbool 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;/声明序列:=声明序列声明语句|声明语句/declaration:=/declaration_listdeclaration_stat|/改成declaration_list:=declaration_statbool declaration_list()bool es = true;while (strcmp(token,int)=0)es=declaration_stat();if(es = false)return false;return es;/声明语句:=int变量;/declaration_stat:=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);/语句序列:=语句序列语句|/statement_list:=statement_liststatement|/改成statement_list:=statementbool statement_list()bool es=true;if(feof(fp)return false;while(strcmp(token,)es=statement();if(es = false)return(es);return(es);/语句:=if语句|while语句|for语句|read语句/ |write语句|复合语句|表达式语句/statement:=if_sttat|while_stat|for_stat/ |compound_stat|expression_statbool statement()bool es=true;if(strcmp(token,if)=0 )es=if_stat();/if语句else if(strcmp(token,while)=0 )es=while_stat();/while语句else if(strcmp(token,for)=0 )es=for_stat();/for语句else if(strcmp(token,read)=0 )es=read_stat();/read语句else if(strcmp(token,write)=0 )es=write_stat();/write语句else if(strcmp(token,)=0 )es=compound_stat();/复合语句else if(strcmp(token,ID)=0 | strcmp(token,NUM)=0 | strcmp(token,()=0 )es=expression_stat();/表达式语句return(es);/if语句:=if(表达式)语句else语句/if_stat:=if(expressiion)statementelsestatementbool if_stat()bool es=true;/ifif( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束if(strcmp(token,()ProcessError(5);/少左括号if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es = expression();if(es = false)return(es);if(strcmp(token,)ProcessError(6);/少右括号if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=statement();if(es = false)return(es);if(strcmp(token,else)=0)/else部分处理if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=statement();if(es = false)return(es);return(es);/while语句:=while(表达式)语句/while_stat:=whileesprstatementbool while_stat()bool es = true;if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束if(strcmp(token,()ProcessError(5);/少左括号if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=expression();if(es = false)return(es);if(strcmp(token,)ProcessError(6);/少右括号if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es = statement();if(es = false)return es;return(es);/for语句:=for(表达式;表达式;表达式)语句/for_stat:=for(expression;expression;expression)statementbool for_stat()bool es=true;if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束if(strcmp(token,() ProcessError(5); /少左括号if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=expression();if(es = false) return (es);if(strcmp(token,;) ProcessError(4); /少分号if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=expression();if(es = false) return (es);if(strcmp(token,;) ProcessError(4); /少分号if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=expression();if(es = false) return (es);if(strcmp(token,) ProcessError(6); /少右括号if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=statement();if(es = false) return (es);return es;/write_语句:=write表达式;/write_stat:=writeexpressionbool write_stat()bool es = true;if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=expression();if(es = false) return (es);if(strcmp(token,;) ProcessError(4); /少分号if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束return es;/read_语句:=read变量/read_stat:=read Id;bool read_stat()bool es=true;if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束if(strcmp(token,ID)ProcessError(3); /少标识符 if(strcmp(token,;)ProcessError(4); /少分号if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束return es;/复合语句:语句序列/compound_stat:=statement_listbool compound_stat() /复合语句函数bool es=true;if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=statement_list();if(es = false)return es;/ - new-if(strcmp(token1,) != 0)ProcessError(2);elseif( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束/ - new -return es;/表达式语句:=表达式;|;/expression_stat:=expression;|;bool expression_stat()bool es=true;if(strcmp(token,;)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束return es;es=expression();if(es = false) return es;if(strcmp(token,;)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束return es;elseProcessError(4); /少分号return es;/表达式:=标识符=布尔表达式|布尔表达式/expression:=ID=bool_expr|bool_exprbool expression()bool es=true;int fileadd;char token220,token340;if(strcmp(token,ID)=0)fileadd=ftell(fp); /记住当前文件位置if( ReadFile(token2,token3) = false )ProcessError(2);/ 缺少return false;/ 文件结束if(strcmp(token2,=)=0) /=if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=bool_expr();if(es = false) return es;elsefseek(fp,fileadd,0); /若非=,则文件指针回到=前的标识符EsLine-;es=bool_expr();if(es = false) return es;else es=bool_expr();if(es = false) return es;return es;/布尔表达式:=算术表达式(|=|=|=|!=)算数表达式/bool_expr:=additive_expr (|=|=|=|!=)additive_exprbool bool_expr()bool es=true;es=additive_expr();if(es = false) return es;if(strcmp(token,)=0|strcmp(token,=)=0|strcmp(token,)=0|strcmp(token,=)=0|strcmp(token,!=)=0|strcmp(token,=)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=additive_expr();if(es = false) return es;return es;/算数表达式:=项(+|-)项/additive_expr:=term(+|-)termbool additive_expr()bool es=true;es=term();if(es = false) return es;while(strcmp(token,+)=0|strcmp(token,-)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=term();if(es= false) return es;return es;/项:=因子(*|/)因子/term:=factor(*|/)factorbool term()bool es=true;es=factor();if(es = false) return es;while(strcmp(token,*)=0|strcmp(token,/)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=factor();if(es = false) return es;return es;/因子:=(表达式)|标识符|无符号整数/factor:=(expression)|ID|NUMbool factor()bool es=true;if(strcmp(token,()=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束es=expression();if(es=false) return es;if(strcmp(token,) ProcessError(6); /少右括号if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束elseif(strcmp(token,ID)=0|strcmp(token,NUM)=0)if( ReadFile(token,token1) = false )ProcessError(2);/ 缺少return false;/ 文件结束return es;elseProcessError(7); /缺少操作数return es;Scan.cpp#includectype.h#includecstring#includestdio.h/ 保留字#defineKEYWORDNUM8char*pKeywordKEYWORDNUM=if, else, for, while, do, int, read, write;/ 单分界符charszSingleWord50=+-();,:;/ 双分界符charszDoubleWord10=!;/ 其他符char*szDivide=/;char*szStar=*;char*szEqual=;#define STATUSNUM16/状态个数#define DATANUM10/ 数据流个数/ 数据流类型typedef unsigned int DATA;#define OTHER0/ wrong input#define LETTER1/ 字母#define DIGIT2/ 数字#define SINGLEWORD3/ 单分界符#define DOUBLEWORD4/ 双分界符#define DIVIDE5/ /#define EQUAL6/ =#define STAR7/ *#define SPACE8/ 空白#define FILEOVER9/ 状态类型typedef unsigned int STATUS;#define NOSTATUS0/ wrong input#define START1#define CASE_ID2#define END_ID3#define CASE_NUM4#define END_NUM5#define CASE_SINGLE6#define END_SINGLE7#define CASE_DOUBLE8#define CASE_DOUBLE29#define END_DOUBLE10#define CASE_DIVIDE11#define CASE_NOTE12#define END_NOTE13#define CASE_ERROR14#define END_ERROR15/ 状态转换表/:到达 终结状态 的数据不保存在输出串中intreflectSTATUSNUMDATANUM=/OTHERLETTERDIGITSINGLEWORDDOUBLEWORDDIVIDEEQUALSTARSPACEFILEOVER/*NOSTATUS*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*START*/CASE_ERROR,CASE_ID,CASE_NUM,CASE_SINGLE,CASE_DOUBLE,CASE_DIVIDE,CASE_DOUBLE,CASE_SINGLE,START,START,/*CADE_ID*/END_ID,CASE_ID,CASE_ID,END_ID,END_ID,END_ID,END_ID,END_ID,END_ID,END_ID,/*END_ID*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*CASE_NUM*/END_NUM,END_NUM,CASE_NUM,END_NUM,END_NUM,END_NUM,END_NUM,END_NUM,END_NUM,END_NUM,/*END_NUM*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*CASE_SINGLE*/ END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,/*END_SINGLE*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*CASE_DOUBLE*/END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,CASE_DOUBLE2,END_SINGLE,END_SINGLE,END_SINGLE,/*CASE_DOUBLE2*/END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,END_DOUBLE,/*END_DOUBLE*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*CASE_DIVIDE*/END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,CASE_NOTE,END_SINGLE,END_SINGLE,/*CASE_NOTE*/END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,END_NOTE,/*END_NOTE*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*CASE_ERROR*/END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,END_ERROR,/*END_ERROR*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS;/ 若在pString中找到 word 则返回 true,否则,返回 falsebool SearchChar(char word,const char *pString)int n=strlen(pString);for(int i = 0; i n; i+)if( word = pStringi)return true;return false;/ 得到word的数据流类型DATA GetDataByword(char word)if(word = EOF)return FILEOVER;if(isalpha(word)return LETTER;if(isdigit(word)return DIGIT;if(SearchChar(word,szSingleWord)return SINGLEWORD;if(SearchChar(word,szDoubleWord)return DOUBLEWORD;if(SearchChar(word,szDivide)return DIVIDE;if(SearchChar(word,szEqual)return EQUAL;if(SearchChar(word,szStar)return STAR;if(isspace(word)return SPACE;return OTHER;/ 得到从status状态输入word后到达的状态STATUS GetNextStatus(STATUS status, DATA word)return reflectstatusword;/ 返回值表示错误个数。当返回值为-1时,表示出现未知错误int TESTScan(FILE *fin,FILE *fout)if(f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创新思维体系构建与实战应用
- 化疗药物恶心呕吐护理
- 消防资格证培训大纲
- 淘宝售后规则培训
- 2025年智能可穿戴设备柔性传感技术在养老护理中的创新解决方案
- 墙体检测培训课件
- 二级医院卒中中心建设汇报
- 文化中心装修设计与后期物业运营管理协议
- 离婚协议书贷款购房房产分割与共同购房合同示范文本
- 离婚诉讼子女抚养权及财产分割合同范本编写指南
- 2025年银发经济老年教育产业现状与未来发展趋势白皮书
- 国开2025年秋季《形势与政策》专题测验1-5答案
- 2025-2030中国金红石开发利用市场发展潜力与产销规模规划报告
- 2025年智慧数据中心绿色运维解决方案深度解析
- 成本控制与成本分析方法指导手册
- 环境灾害预警系统-洞察及研究
- 无人机基地技术支持与服务方案
- 水果代销合同(标准版)
- 肠结核合并肠穿孔护理查房
- 矛盾纠纷调解课件
- 2025年公安系统公务员公开遴选笔试全真模拟题
评论
0/150
提交评论