版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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
11、(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();/else
12、 if(strcmp(token,while)=0 )es=while_stat();/else if(strcmp(token,for)=0 )es=for_stat();/else if(strcmp(token,read)=0 )es=read_stat();/else if(strcmp(token,write)=0 )es=write_stat();/else if(strcmp(token,)=0 )es=compound_stat();/else if(strcmp(token,id)=0 | strcmp(token,num)=0 | strcmp(token,()=0 )es
13、=expression_stat();/return(es);/:=if()else/:=if()elsebool 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 = fa
14、lse)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 = f
15、alse)return(es);return(es);/:=while()/:=whilebool 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)retu
16、rn(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(;)bool for_stat()bool es=true;if( readfile(token,token1) = false )processerror(2);/ 缺少return false;/ 文件结束if(str
17、cmp(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) r
18、eturn (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();i
19、f(es = false) return (es);return es;/:=write;/:=writebool 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);/ 缺少r
20、eturn false;/ 文件结束return es;/:=read/:=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;
21、/ 文件结束return es;/:/:=bool 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 fals
22、e;/ 文件结束/ - new -return es;/:=;|;/:=;|;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);/ 缺少re
23、turn false;/ 文件结束return es;elseprocesserror(4); /少分号return es;/:=|/:=id=|bool 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( readfil
24、e(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 bool_expr()bool
25、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;/:=(+|-)/
26、:=(+|-)bool 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;/:=(*|/)/:=(*|/)bool term()bool es=true;es=factor();if(es = fals
27、e) 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;/:=()|/:=()|id|numbool factor()bool es=true;if(strcmp(token,()=0)if( readfile(token,token1) = false )processerror(2);/ 缺少re
28、turn 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 e
29、s;elseprocesserror(7); /缺少操作数return es;scan.cpp#include#include#include/ 保留字#definekeywordnum8char*pkeywordkeywordnum=if, else, for, while, do, int, read, write;/ 单分界符charszsingleword50=+-();,:;/ 双分界符charszdoubleword10=!;/ 其他符char*szdivide=/;char*szstar=*;char*szequal=;#define statusnum16/状态个数#defin
30、e 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 nostatu
31、s0/ 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/ 状态转换表/:到
32、达 终结状态 的数据不保存在输出串中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,cas
33、e_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,/*e
34、nd_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
35、,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*/nosta
36、tus,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_no
37、te,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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 风险管理师岗前测试验证考核试卷含答案
- 化纤后处理工操作安全考核试卷含答案
- 橡胶制品生产工岗前岗中技能考核试卷含答案
- 琴弦制作工班组评比评优考核试卷含答案
- 露天采矿挖掘机司机安全综合评优考核试卷含答案
- 金属网制作工操作知识强化考核试卷含答案
- 品牌传播策略绩效评定表
- 茶树栽培工环保及安全评优考核试卷含答案
- 医疗卫生行业医生服务质量KPI考核表
- 电解槽计算机监控工岗前创新方法考核试卷含答案
- 2026中国丘陵山区农机技术突破与市场推广策略报告
- CSCO多发性骨髓瘤诊疗指南2026
- 工业香精生产企业配方保密管控细则
- 实验室安全交接工作制度
- 生产经营单位安全生产事故应急救援预案
- GB/T 46164-2025金属和合金的腐蚀增材制造钛合金电化学临界局部腐蚀温度(E-CLCT)的测量
- 测绘地理信息安全保密管理制度
- 核反应堆核级机械设备检修工职业技能鉴定经典试题含答案
- 遗体火化师职业技能模拟试卷含答案
- 艾可慕(ICOM)IC-R5(R6)中文使用说明书
- 宫颈癌考试题及答案
评论
0/150
提交评论