ImageVerifierCode 换一换
格式:DOCX , 页数:45 ,大小:154.51KB ,
资源ID:26728543      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26728543.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(合肥工业大学编译原理实验报告代码版.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

合肥工业大学编译原理实验报告代码版.docx

1、合肥工业大学编译原理实验报告代码版计算机与信息学院 编译原理 实验报告专 业 班 级 信息安全13-1班 学生及学号 马骏 2013211869 课程教学班号 任 课 教 师 宏芒 实验指导教师 宏芒 实验地点 实验楼机房 2015 2016 学年第 二 学期实验1 词法分析设计一、实验目的 通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用二、实验要求 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 2、将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。

2、3、根据测试数据进行测试。测试实例应包括以下三个部分: 全部合法的输入。 各种组合的非法输入。 由记号组成的句子。 4、词法分析程序设计要求输出形式: 例:输入VC+语言的实例程序: If i=0 then n+; a= 3b %); 输出形式为: 单词 二元序列 类 型 位置(行,列) (单词种别,单词属性) for (1,for ) 关键字 (1,1) i ( 6,i ) 标识符 (1,2) = ( 4,= ) 关系运算符 (1,3) 12 0 ( 5,0 ) 常数 (1,4) then ( 1,then) 关键字 (1,5) n (6,n ) 标识符 (1,6) + Error Erro

3、r (1,7) ; ( 2, ; ) 分界符 (1,8) a (6,a ) 标识符 (2,1) = (4,= ) 关系运算符 (2,2) 3b Error Error (2,4) % Error Error (2,4) ) ( 2, ) ) 分界符 (2,5) ; ( 2, ; ) 分界符 (2,6) 三、实验容用 VC+/VB/JAVA 语言实现对 C 语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示 ;同时进行标识符登记符号表的管理。 以下是实现词法分析设计的主要工

4、作: (1)从源程序文件中读入字符。 (2)统计行数和列数用于错误单词的定位。 (3)删除空格类字符,包括回车、制表符空格。 (4)按拼写单词,并用(码,属性)二元式表示。(属性值token的机表示) (5)如果发现错误则报告出错 7 (6)根据需要是否填写标识符表供以后各阶段使用。 四、实验步骤1、根据流程图编写出各个模块的源程序代码上机调试。 2、 编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的词法分析程序;直至能够得到完全满意的结果。 3、书写实验报告 ;实验报告正文的容: 功能描述:该程序具有什么功能? 程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;

5、函数之间的调用关系图。 详细的算法描述(程序总体执行流程图) 。 给出软件的测试方法和测试结果。 实验总结 (设计的特点、不足、收获与体会)。 五、实验截图先创建salaryfile.txt文件输入If i=0 then n+; a= 3b %);六、核心代码 #include#include#include#include using namespace std;const char* salaryfile=salaryfile.txt;const int max=40;string idmax=do,end,for,if,printf,scanf,then,while;/关键字表strin

6、g smax=,;,(,),+,-,*,/,=,;/分界符表 算数运算符表 关系运算符表string kmax;/ 标识符string cimax;/ 常数int fjfpoint=5;/分界符表尾int mathpoint=9;/算数运算符表尾int cipointer=0;/常数表尾int idpointer=0;/关键字表尾int kpointer=0;/标识符表尾int fjf;/0 不是分界符 1是int rowy=1;/识别输入行位置int rowx=1;/识别输入列位置int outkey=0;/打印控制 0为数字后有字母 其他可以void searcht(int i,strin

7、g m)/根据已识别的首字母识别字符串/ coutenter searcht!endl; int x; if(i=0)/首字符是字母识别关键字 / cout a word!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; k

8、kpointer=m; kpointer+; if(i=1)/识别常数 / cout a number!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)/识别 分界符 算数运算符 关系运算符 / cout a signal!endl; for(x=0;xmax;x+) if(sx=m) break; / x-; if(x5&x10) if(outkey=1) cout(3,sx) 算数运

9、算符 (rowy,rowx)9&xmax-1) if(outkey=1) cout(4,sx) 关系运算符 (rowy,rowx)endl; outkey=0; fjf=0; if(x=max) if(outkey=1) coutError Error (rowy,rowx)=48&t64&t96&t123) searcht(0,sn); else searcht(2,sn); ;void split(string s)/分割字符串/ coutsendl; string nowmax; string sn; int nowpointer=0; int i=0; int x; int sign=

10、2;/非法数字标志 int diannumber=0;/数中点的个数 for(x=0;x64&sx96&sx=48&sx0&sx=46&sign=1)/判断数字后跟字母还是字母后有数字 if(i=0) if(sx=48&sx=48&sx0) / coutsn i=iendl; coutsn ; if(sign=0)/数字后有字母的情况 cout Error Error (rowy,rowx)endl; else /字母开头的字符串 / cout true0&(sx-164&sx-196&sx-1=48&sx-10) / coutsn i=iendl; coutsn ; if(sign=0) c

11、out Error Error (rowy,rowx)endl; else / cout true64&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(l

12、l=;) rowy+; rowx=1; */ ;int main() int x; string instring;/读入一行 string sn;/* getline(cin,sn);/ string带空格输入 coutsn=48&t64&t96&tnoskipws; if(!inputfile) coutno fileppword)/按照空格分割字符串 split(ppword); /* int begin = 0;/去掉字符串的所有空格 begin = pp.find( ,begin); /查找空格在str中第一次出现的位置 while(begin != -1) /表示字符串中存在空格

13、pp.replace(begin, 1, ); / 用空串替换str中从begin开始的1个字符 begin = pp.find( ,begin); /查找空格在替换后的str中第一次出现的位置 */ coutgood ppTG (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)

14、分析表,对输入符号串自上而下的分析过程。 四、实验步骤 1、根据流程图编写出各个模块的源程序代码上机调试。 2、 编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的 LL(1)分析程序;直至能够得到完全满意的结果。 3、书写实验报告 ;实验报告正文的容: 写出 LL(1)分析法的思想及写出符合 LL(1)分析法的文法。 程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图。 详细的算法描述(程序执行流程图) 。 给出软件的测试方法和测试结果。 实验总结 (设计的特点、不足、收获与体会)。 五、实验截图六、核心代码 #include#includeu

15、sing namespace std;string pp;/输出字符串string hh=rn;/换行const int max=50;int endfumax;/终止符序号表int endfupointer=8;char endfurealmax=+,-,*,/,(,i,),#;int unendfumax;int unendfupointer=5;char unendfurealmax=E,G,T,S,F;string makemathmax=E-TG,G-+TG,G-TG,G-$,T-FS,S-*FS,S-/FS,S-$,F-(E),F-i;/0 E-TG,1 G-+TG,2 G-TG,

16、3 G-$,4 T-FS,5 S-*FS,6 S-/FS,7 S-$,8 F-(E),9 F-i/$代表空串string behaviormax=初始化,POP;int smarttablemaxmax;/分析表int checkendfu(char fu)/查终结符序号 int x; for(x=0;xendfupointer;x+) if(endfurealx=fu) break; if(xendfupointer) return x; else return -1;int checkunendfu(char fu)/查非终结符序号 int x; for(x=0;xunendfupoint

17、er;x+) if(unendfurealx=fu) break; if(xunendfupointer) return x; else return-1;string checkmakemath(int x)/查产生式表 return makemathx;int checksmarttable(int x,int y)/查分析表 return smarttablexy;class smartboxpublic: smartbox() box0=#; box1=E; boxpointer=1; void push(char fu) boxpointer+; boxboxpointer=fu;

18、char pop() char a=boxboxpointer; if(a!=#) / coutpop: boxpointer aendl;/ stringstream oss;/* pp=pp+pop: ; char buffermax; sprintf(buffer,%d,boxpointer); string s=buffer; pp=pp+ ; pp=pp+s; pp=pp+hh;*/ boxpointer-; return a; void check() if(checkendfu(boxboxpointer)!=-1) char a;/ coutboxboxpointercheckendfu(boxboxpointer) ; /char buffermax; /sprintf(buffer/ pp=pp+boxboxpointer; / pp=pp+checkendfu(boxboxpointer);/ pp=pp+ ; a=pop(); / coutout aendl; char boxmax; int boxpointer;int main() / TODO: Add extra validation here / pp=pp+步骤 分析栈 剩余输入串 所用产生式 动作+hh;/* string s1=sdsfs rnsdfsds; string s3=aaaaa

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

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