合肥工业大学编译原理实验报告完整代码版.docx
- 文档编号:14046132
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:45
- 大小:155.93KB
合肥工业大学编译原理实验报告完整代码版.docx
《合肥工业大学编译原理实验报告完整代码版.docx》由会员分享,可在线阅读,更多相关《合肥工业大学编译原理实验报告完整代码版.docx(45页珍藏版)》请在冰点文库上搜索。
合肥工业大学编译原理实验报告完整代码版
计算机与信息学院
编译原理实验报告
专业班级
信息安全13-1班
学生姓名及学号
马骏2013211869
课程教学班号
任课教师
李宏芒
实验指导教师
李宏芒
实验地点
实验楼机房
2015~2016学年第二学期
实验1词法分析设计
一、实验目的
通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设
计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的
理解,并能正确地、熟练地运用
二、实验要求
1、编程时注意编程风格:
空行的使用、注释的使用、缩进的使用等。
2、将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。
3、根据测试数据进行测试。
测试实例应包括以下三个部分:
全部合法的输入。
各种组合的非法输入。
由记号组成的句子。
4、词法分析程序设计要求输出形式:
例:
输入VC++语言的实例程序:
Ifi=0thenn++;
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)
++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%);
6、核心代码
#include
#include
#include
#include
usingnamespacestd;
constchar*salaryfile="salaryfile.txt";
constintmax=40;
stringid[max]={"do","end","for","if","printf","scanf","then","while"};//关键字表
strings[max]={",",";","(",")","[","]","+","-","*","/","<","<=","=",">",">=","<>"};//分界符表算数运算符表关系运算符表
stringk[max];//标识符
stringci[max];//常数
intfjfpoint=5;//分界符表尾
intmathpoint=9;//算数运算符表尾
intcipointer=0;//常数表尾
intidpointer=0;//关键字表尾
intkpointer=0;//标识符表尾
intfjf;//0不是分界符1是
introwy=1;//识别输入行位置
introwx=1;//识别输入列位置
intoutkey=0;//打印控制0为数字后有字母其他可以
voidsearcht(inti,stringm)//根据已识别的首字母识别字符串
{
//cout<<"entersearcht!
!
"< intx; if(i==0)//首字符是字母识别关键字 { //cout<<"aword! ! "< for(x=0;x { if(id[x]==m) { cout<<"(1,"< break; } } if(x==max)//不是关键字再识别标识符 { for(x=0;x { if(k[x]==m) { cout<<"(6,"< break; } } if(x==max)//标识符表没有时插入标识符 { cout<<"(6,"< k[kpointer]=m; kpointer++; } } } if(i==1)//识别常数 { //cout<<"anumber! ! "< for(x=0;x { if(ci[x]==m) { cout<<"(5,"< break; } } if(x==max) { cout<<"(5,"< ci[cipointer]=m; cipointer++; } } if(i==2)//识别分界符算数运算符关系运算符 { //cout<<"asignal! ! "< for(x=0;x { if(s[x]==m) break; } //x--; if(x<6) { fjf=1; } if(x>5&&x<10) { if(outkey==1) { cout<<"(3,"< outkey=0; } fjf=0; } if(x>9&&x { if(outkey==1) { cout<<"(4,"< outkey=0; } fjf=0; } if(x==max) { if(outkey==1) { cout<<"ErrorError("< outkey=0; } fjf=0; } } }; voidwordlook(chart,stringsn)//识别首字符,分类识别字符串 { if(t>=48&&t<=57) searcht(1,sn); else { if((t>64&&t<91)||(t>96&&t<123)) searcht(0,sn); elsesearcht(2,sn); } }; voidsplit(strings)//分割字符串 { //cout< stringnow[max]; stringsn; intnowpointer=0; inti=0; intx; intsign=2;//非法数字标志 intdiannumber=0;//数中点的个数 for(x=0;x { if((s[x]>64&&s[x]<91)||(s[x]>96&&s[x]<123)||(s[x]>=48&&s[x]<=57)||(x>0&&s[x]==46&&sign==1))//判断数字后跟字母还是字母后有数字 { if(i==0) { if(s[x]>=48&&s[x]<=57) sign=1; elsesign=2; } else { if(sign==1) { if(s[x]>=48&&s[x]<=57||s[x]==46) { if(s[x]==46) { if(diannumber==0) diannumber++; elsesign=0; } } elsesign=0; } } i++; if(x==(s.length()-1)) { sn=s.substr(x-i+1,i); if(i>0) { //cout< cout< if(sign==0)//数字后有字母的情况 cout<<"ErrorError("< else//字母开头的字符串 { //cout<<"true"< wordlook(sn[0],sn); rowx++; } } } } else { if(x>0&&(s[x-1]>64&&s[x-1]<91)||(s[x-1]>96&&s[x-1]<123)||(s[x-1]>=48&&s[x-1]<=57))//遇到分界符运算符如果前面是数字或字母 { sn=s.substr(x-i,i); if(i>0) { //cout< cout< if(sign==0) cout<<"ErrorError("< else { //cout<<"true"< wordlook(sn[0],sn); rowx++; } } i=0; } stringll=s.substr(x,1);//判断是运算符还是分界符 wordlook(s[x],ll); if(fjf==0)//是运算符 { i++; if((s[x+1]>64&&s[x+1]<91)||(s[x+1]>96&&s[x+1]<123)||(s[x+1]>=48&&s[x+1]<=57))//如果后面是数字或字母 { sn=s.substr(x-i+1,i); //cout< cout< outkey=1; wordlook(sn[0],sn); rowx++; i=0; } } if(fjf==1) { if((s[x-1]>64&&s[x-1]<91)||(s[x-1]>96&&s[x-1]<123)||(s[x-1]>=48&&s[x-1]<=57))//如果前面是数字或字母 { } elseif(i>0) { sn=s.substr(x-i,i); //cout< cout< outkey=1; wordlook(sn[0],sn); rowx++; i=0; } cout< rowx++; /*if(ll==";") { rowy++; rowx=1; } */ } } } }; intmain() { intx; stringinstring;//读入一行 stringsn; /* getline(cin,sn);//string带空格输入 cout< chart=sn[0]; if(t>=48&&t<=57) searcht(1,sn); else { if((t>64&&t<91)||(t>96&&t<123)) searcht(0,sn); elsesearcht(2,sn); } */ ifstreaminputfile;//infilestream inputfile.open(salaryfile); //inputfile>>noskipws; if(! inputfile) { cout<<"nofile"< } stringpp; while(! inputfile.eof()) { getline(inputfile,pp); istringstreamistr(pp); stringppword; while(istr>>ppword)//按照空格分割字符串 { split(ppword); } /* intbegin=0;//去掉字符串的所有空格 begin=pp.find("",begin);//查找空格在str中第一次出现的位置 while(begin! =-1)//表示字符串中存在空格 { pp.replace(begin,1,"");//用空串替换str中从begin开始的1个字符 begin=pp.find("",begin);//查找空格在替换后的str中第一次出现的位置 } */ //cout<<"good"< //rowx++; rowy++;//换行 rowx=1; } return0; } 七、实验总结 通过本次试验使我不仅对词法分析器有了更深的了解,而且提高了编程能力,希望在以后的学习中可以解决词法分析更多的问题。 实验2LL (1)分析法 一、实验目的 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区 别和联系。 使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方 法,训练学生掌握开发应用程序的基本方法。 有利于提高学生的专业素质,为培 养适应社会多方面需要的能力。 二、实验要求 1、编程时注意编程风格: 空行的使用、注释的使用、缩进的使用等。 2、如果遇到错误的表达式,应输出错误提示信息。 3、对下列文法,用LL (1)分析法对任意输入的符号串进行分析: (1)E->TG (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)分析法的文法。 程序结构描述: 函数调用格式、参数含义、返回值描述、函数功能;函数 之间的调用关系图。 详细的算法描述(程序执行流程图)。 给出软件的测试方法和测试结果。 实验总结(设计的特点、不足、收获与体会)。 五、实验截图 6、核心代码 #include #include usingnamespacestd; stringpp;//输出字符串 stringhh="\r\n";//换行 constintmax=50; intendfu[max];//终止符序号表 intendfupointer=8; charendfureal[max]={'+','-','*','/','(','i',')','#'}; intunendfu[max]; intunendfupointer=5; charunendfureal[max]={'E','G','T','S','F'}; stringmakemath[max]={"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 //$代表空串 stringbehavior[max]={"初始化","POP"}; intsmarttable[max][max];//分析表 intcheckendfu(charfu)//查终结符序号 { intx; for(x=0;x { if(endfureal[x]==fu) { break; } } if(x returnx; elsereturn-1; }; intcheckunendfu(charfu)//查非终结符序号 { intx; for(x=0;x { if(unendfureal[x]==fu) break; } if(x returnx; elsereturn-1; }; stringcheckmakemath(intx)//查产生式表 { returnmakemath[x]; }; intchecksmarttable(intx,inty)//查分析表 { returnsmarttable[x][y]; }; classsmartbox { public: smartbox() { box[0]='#'; box[1]='E'; boxpointer=1; } voidpush(charfu) { boxpointer++; box[boxpointer]=fu; } charpop() { chara=box[boxpointer]; if(a! ='#') { //cout<<"pop: "< //stringstreamoss; /* pp=pp+"pop: "; charbuffer[max]; sprintf(buffer,"%d",boxpointer); strings=buffer; pp=pp+""; pp=pp+s; pp=pp+hh; */ boxpointer--; returna; } } voidcheck() { if(checkendfu(box[boxpointer])! =-1) { chara; //cout< //charbuffer[max]; //sprintf(buffer //pp=pp+box[boxpointer]; //pp=pp+checkendfu(box[boxpointer]); //pp=pp+""; a=pop();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 合肥 工业大学 编译 原理 实验 报告 完整 代码