合肥工业大学编译原理实验报告(完整代码版).pdf

上传人:b****3 文档编号:3214110 上传时间:2022-11-20 格式:PDF 页数:31 大小:387.92KB
下载 相关 举报
合肥工业大学编译原理实验报告(完整代码版).pdf_第1页
第1页 / 共31页
合肥工业大学编译原理实验报告(完整代码版).pdf_第2页
第2页 / 共31页
合肥工业大学编译原理实验报告(完整代码版).pdf_第3页
第3页 / 共31页
合肥工业大学编译原理实验报告(完整代码版).pdf_第4页
第4页 / 共31页
合肥工业大学编译原理实验报告(完整代码版).pdf_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

合肥工业大学编译原理实验报告(完整代码版).pdf

《合肥工业大学编译原理实验报告(完整代码版).pdf》由会员分享,可在线阅读,更多相关《合肥工业大学编译原理实验报告(完整代码版).pdf(31页珍藏版)》请在冰豆网上搜索。

合肥工业大学编译原理实验报告(完整代码版).pdf

计算机与信息学院编译原理实验报告专业班级信息安全13-1班学生姓名及学号马骏2013211869课程教学班号任课教师李宏芒实验指导教师李宏芒实验地点实验楼机房20152016学年第二学期实验实验1词法分析设计词法分析设计一、一、实验目的实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用二、实验要求实验要求1、编程时注意编程风格:

空行的使用、注释的使用、缩进的使用等。

2、将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。

3、根据测试数据进行测试。

测试实例应包括以下三个部分:

全部合法的输入。

各种组合的非法输入。

由记号组成的句子。

4、词法分析程序设计要求输出形式:

例:

输入VC+语言的实例程序:

Ifi=0thenn+;a=3b%);输出形式为:

单词二元序列类型位置(行,列)(单词种别,单词属性)for(1,for)关键字(1,1)i(6,i)标识符(1,2)=(4,=)关系运算符(1,3)120(5,0)常数(1,4)then(1,then)关键字(1,5)n(6,n)标识符(1,6)+ErrorError(1,7);(2,;)分界符(1,8)a(6,a)标识符(2,1)=(4,=)关系运算符(2,2)3bErrorError(2,4)%ErrorError(2,4))(2,)分界符(2,5);(2,;)分界符(2,6)三、三、实验内容实验内容用VC+/VB/JAVA语言实现对C语言子集的源程序进行词法分析。

通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。

以下是实现词法分析设计的主要工作:

(1)从源程序文件中读入字符。

(2)统计行数和列数用于错误单词的定位。

(3)删除空格类字符,包括回车、制表符空格。

(4)按拼写单词,并用(内码,属性)二元式表示。

(属性值token的机内表示)(5)如果发现错误则报告出错7(6)根据需要是否填写标识符表供以后各阶段使用。

四、实验步骤四、实验步骤1、根据流程图编写出各个模块的源程序代码上机调试。

2、编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的词法分析程序;直至能够得到完全满意的结果。

3、书写实验报告;实验报告正文的内容:

功能描述:

该程序具有什么功能?

程序结构描述:

函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图。

详细的算法描述(程序总体执行流程图)。

给出软件的测试方法和测试结果。

实验总结(设计的特点、不足、收获与体会)。

五、实验五、实验截图截图先创建salaryfile.txt文件输入Ifi=0thenn+;a=3b%);六、六、核心代码核心代码#include#include#include#includeusingnamespacestd;constchar*salaryfile=salaryfile.txt;constintmax=40;stringidmax=do,end,for,if,printf,scanf,then,while;/关键关键字表字表stringsmax=,;,(,),+,-,*,/,=,;/分界符表分界符表算数运算符表算数运算符表关系运算符表关系运算符表stringkmax;/标识符标识符stringcimax;/常数常数intfjfpoint=5;/分界符表尾分界符表尾intmathpoint=9;/算数运算符表尾算数运算符表尾intcipointer=0;/常数表尾常数表尾intidpointer=0;/关键字表尾关键字表尾intkpointer=0;/标识符表尾标识符表尾intfjf;/0不是分界符不是分界符1是是introwy=1;/识别输入行位置识别输入行位置introwx=1;/识别输入列位置识别输入列位置intoutkey=0;/打印控制打印控制0为数字后有字母为数字后有字母其他可以其他可以voidsearcht(inti,stringm)/根据已识别的首字母识别字符串根据已识别的首字母识别字符串/coutentersearcht!

endl;intx;if(i=0)/首字符是字母识别关键字首字符是字母识别关键字/coutaword!

endl;for(x=0;xmax;x+)if(idx=m)cout(1,idx)关键字关键字(rowy,rowx)endl;break;if(x=max)/不是关键字再识别标识符不是关键字再识别标识符for(x=0;xmax;x+)if(kx=m)cout(6,m)标识符标识符(rowy,rowx)endl;break;if(x=max)/标识符表没有时插入标识符标识符表没有时插入标识符cout(6,m)标识符标识符(rowy,rowx)endl;kkpointer=m;kpointer+;if(i=1)/识别常数识别常数/coutanumber!

endl;for(x=0;xmax;x+)if(cix=m)cout(5,x)endl;break;if(x=max)cout(5,m)常数常数(rowy,rowx)endl;cicipointer=m;cipointer+;if(i=2)/识别识别分界符分界符算数运算符算数运算符关系运算符关系运算符/coutasignal!

endl;for(x=0;xmax;x+)if(sx=m)break;/x-;if(x5&x10)if(outkey=1)cout(3,sx)算数运算符算数运算符(rowy,rowx)9&xmax-1)if(outkey=1)cout(4,sx)关系运算符关系运算符(rowy,rowx)endl;outkey=0;fjf=0;if(x=max)if(outkey=1)coutErrorError(rowy,rowx)=48&t64&t96&t123)searcht(0,sn);elsesearcht(2,sn);voidsplit(strings)/分割字符串分割字符串/coutsendl;stringnowmax;stringsn;intnowpointer=0;inti=0;intx;intsign=2;/非法数字标志非法数字标志intdiannumber=0;/数中点的个数数中点的个数for(x=0;x64&sx96&sx=48&sx0&sx=46&sign=1)/判断数字后跟字母还是字母后有数字判断数字后跟字母还是字母后有数字if(i=0)if(sx=48&sx=48&sx0)/coutsni=iendl;coutsn;if(sign=0)/数字后有字母的情况数字后有字母的情况coutErrorError(rowy,rowx)endl;else/字母开头的字符串字母开头的字符串/couttrue0&(sx-164&sx-196&sx-1=48&sx-10)/coutsni=iendl;coutsn;if(sign=0)coutErrorError(rowy,rowx)endl;else/couttrue64&sx+196&sx+1=48&sx+1=57)/如果后面是数字或字母如果后面是数字或字母sn=s.substr(x-i+1,i);/coutsn运算符运算符i=iendl;coutsn64&sx-196&sx-1=48&sx-10)sn=s.substr(x-i,i);/coutsn运算符运算符i=iendl;coutsn;outkey=1;wordlook(sn0,sn);rowx+;i=0;coutsx(2,sx)分界符分界符(rowy,rowx)endl;rowx+;/*if(ll=;)rowy+;rowx=1;*/;intmain()intx;stringinstring;/读入一行读入一行stringsn;/*getline(cin,sn);/string带空格输入带空格输入coutsn=48&t64&t96&tnoskipws;if(!

inputfile)coutnofileppword)/按照空格分割字符串按照空格分割字符串split(ppword);/*intbegin=0;/去掉字符串的所有空格去掉字符串的所有空格begin=pp.find(,begin);/查找空格在查找空格在str中第一次出现的位置中第一次出现的位置while(begin!

=-1)/表示字符串中存在空格表示字符串中存在空格pp.replace(begin,1,);/用空串替用空串替换换str中中从从begin开始开始的的1个字符个字符begin=pp.find(,begin);/查找空格在替换后查找空格在替换后的的str中第一次出现的中第一次出现的位置位置*/coutgoodppTG

(2)G-+TG|TG(3)G-(4)T-FS(5)S-*FS|/FS(6)S-(7)F-(E)(8)F-i三、三、实验内容实验内容根据某一文法编制调试LL

(1)分析程序,以便对任意输入的符号串进行分析。

构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。

分析法的功能是利用LL

(1)控制程序根据显示栈栈顶内容、向前看符号以及LL

(1)分析表,对输入符号串自上而下的分析过程。

四、实验步骤四、实验步骤1、根据流程图编写出各个模块的源程序代码上机调试。

2、编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的LL

(1)分析程序;直至能够得到完全满意的结果。

3、书写实验报告;实验报告正文的内容:

写出LL

(1)分析法的思想及写出符合LL

(1)分析法的文法。

程序结构描述:

函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图。

详细的算法描述(程序执行流程图)。

给出软件的测试方法和测试结果。

实验总结(设计的特点、不足、收获与体会)。

五、实验五、实验截图截图六、六、核心代码核心代码#include#includeusingnamespacestd;stringpp;/输出字符串输出字符串stringhh=rn;/换行换行constintmax=50;intendfumax;/终止符序号表终止符序号表intendfupointer=8;charendfurealmax=+,-,*,/,(,i,),#;intunendfumax;intunendfupointer=5;charunendfurealmax=E,G,T,S,F;stringmakemathmax=E-TG,G-+TG,G-TG,G-$,T-FS,S-*FS,S-/FS,S-$,F-(E),F-i;/0E-TG,1G-+TG,2G-TG,3G-$,4T-FS,5S-*FS,6S-/FS,7S-$,8F-(E),9F-i/$代表空串代表空串stringbehaviormax=初始化初始化,POP;intsmarttablemaxmax;/分析表分析表intcheckendfu(charfu)/查终结符序号查终结符序号intx;for(x=0;xendfupointer;x+)if(endfurealx=fu)break;if(xendfupointer)returnx;elsereturn-1;intcheckunendfu(charfu)/查非终结符序号查非终结符序号intx;for(x=0;xunendfupointer;x+)if(unendfurealx=fu)break;if(xunendfupointer)returnx;elsereturn-1;stringcheckmakemath(intx)/查产生式表查产生式表r

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 药学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1