合肥工业大学编译原理实验报告完整代码版Word版_第1页
合肥工业大学编译原理实验报告完整代码版Word版_第2页
合肥工业大学编译原理实验报告完整代码版Word版_第3页
合肥工业大学编译原理实验报告完整代码版Word版_第4页
合肥工业大学编译原理实验报告完整代码版Word版_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、传播优秀word版文档 ,希望对您有帮助,可双击去除!计算机与信息学院 编译原理 实验报告专 业 班 级 信息安全13-1班 学生姓名及学号 马骏 2013211869 课程教学班号 任 课 教 师 李宏芒 实验指导教师 李宏芒 实验地点 实验楼机房 2015 2016 学年第 二 学期实验1 词法分析设计一、 实验目的 通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用二、 实验要求 1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 2、将标识符填写的相应符号表须提

2、供给编译程序的以后各阶段使用。 3、根据测试数据进行测试。测试实例应包括以下三个部分: u 全部合法的输入。 u 各种组合的非法输入。 u 由记号组成的句子。 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 )

3、标识符 (1,6) + error error (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、书写实验报告 ;实验报告正文的内容: u 功能描述:该程序具有什么

5、功能? u 程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图。 u 详细的算法描述(程序总体执行流程图) 。 u 给出软件的测试方法和测试结果。 u 实验总结 (设计的特点、不足、收获与体会)。 五、实验截图先创建salaryfile.txt文件输入if i=0 then n+; a<= 3b %);6、 核心代码 #include<iostream>#include<string>#include<fstream>#include <sstream>using namespace std;const cha

6、r* salaryfile="salaryfile.txt"const int max=40;string idmax="do","end","for","if","printf","scanf","then","while"/关键字表string smax=",","","(",")","",""

7、,"+","-","*","/","<","<=","=",">",">=","<>"/分界符表 算数运算符表 关系运算符表string kmax;/ 标识符string cimax;/ 常数int fjfpoint=5;/分界符表尾int mathpoint=9;/算数运算符表尾int cipointer=0;/常数表尾int idpointer=0;/关键字

8、表尾int kpointer=0;/标识符表尾int fjf;/0 不是分界符 1是int rowy=1;/识别输入行位置int rowx=1;/识别输入列位置int outkey=0;/打印控制 0为数字后有字母 其他可以void searcht(int i,string m)/根据已识别的首字母识别字符串/cout<<"enter searcht!"<<endl;int x;if(i=0)/首字符是字母识别关键字/cout<<" a word!"<<endl;for(x=0;x<max;x+)if

9、(idx=m)cout<<"(1,"<<idx<<")"<<" 关键字 ("<<rowy<<","<<rowx<<")"<<endl;break;if(x=max)/不是关键字再识别标识符for(x=0;x<max;x+) if(kx=m) cout<<"(6,"<<m<<") "<<"

10、标识符 ("<<rowy<<","<<rowx<<")"<<endl;break; if(x=max)/标识符表没有时插入标识符cout<<"(6,"<<m<<") "<<"标识符 ("<<rowy<<","<<rowx<<")"<<endl;kkpointer=m;kpointe

11、r+;if(i=1)/识别常数/cout<<" a number!"<<endl;for(x=0;x<max;x+)if(cix=m)cout<<"(5,"<<x<<")"<<endl;break;if(x=max) cout<<"(5,"<<m<<") 常数 ("<<rowy<<","<<rowx<<")

12、"<<endl;cicipointer=m;cipointer+;if(i=2)/识别 分界符 算数运算符 关系运算符/cout<<" a signal!"<<endl;for(x=0;x<max;x+)if(sx=m)break;/x-;if(x<6)fjf=1;if(x>5&&x<10)if(outkey=1) cout<<"(3,"<<sx<<") 算数运算符 ("<<rowy<<&q

13、uot;,"<<rowx<<")"<<endl; outkey=0;fjf=0;if(x>9&&x<max-1)if(outkey=1) cout<<"(4,"<<sx<<") 关系运算符 ("<<rowy<<","<<rowx<<")"<<endl; outkey=0;fjf=0;if(x=max)if(outkey=1)co

14、ut<<"error error ("<<rowy<<","<<rowx<<")"<<endl;outkey=0;fjf=0; void wordlook(char t,string sn)/识别首字符,分类识别字符串if(t>=48&&t<=57)searcht(1,sn);elseif(t>64&&t<91)|(t>96&&t<123) searcht(0,sn);else s

15、earcht(2,sn);void split(string s)/分割字符串/cout<<s<<endl;string nowmax;string sn;int nowpointer=0;int i=0;int x;int sign=2;/非法数字标志int diannumber=0;/数中点的个数for(x=0;x<s.length();x+)if(sx>64&&sx<91)|(sx>96&&sx<123)|(sx>=48&&sx<=57)|(x>0&&s

16、x=46&&sign=1)/判断数字后跟字母还是字母后有数字if(i=0)if(sx>=48&&sx<=57)sign=1;else sign=2;elseif(sign=1)if(sx>=48&&sx<=57|sx=46)if(sx=46)if(diannumber=0)diannumber+;else sign=0;else sign=0;i+;if(x=(s.length()-1) sn=s.substr(x-i+1,i); if(i>0) / cout<<sn<<" i=&q

17、uot;<<i<<endl; cout<<sn<<" " if(sign=0)/数字后有字母的情况 cout<<" error error ("<<rowy<<","<<rowx<<")"<<endl; else /字母开头的字符串 / cout<<" true"<<endl; wordlook(sn0,sn); rowx+; elseif(x>0

18、&&(sx-1>64&&sx-1<91)|(sx-1>96&&sx-1<123)|(sx-1>=48&&sx-1<=57)/遇到分界符运算符 如果前面是数字或字母 sn=s.substr(x-i,i); if(i>0) / cout<<sn<<" i="<<i<<endl; cout<<sn<<" " if(sign=0) cout<<" error err

19、or ("<<rowy<<","<<rowx<<")"<<endl; else / cout<<" true"<<endl; wordlook(sn0,sn); rowx+; i=0;string ll=s.substr(x,1);/判断是运算符还是分界符wordlook(sx,ll);if(fjf=0)/是运算符i+;if(sx+1>64&&sx+1<91)|(sx+1>96&&sx+1&l

20、t;123)|(sx+1>=48&&sx+1<=57)/如果后面是数字或字母sn=s.substr(x-i+1,i); / cout<<sn<<"运算符 i="<<i<<endl;cout<<sn<<" "outkey=1; wordlook(sn0,sn); rowx+; i=0;if(fjf=1) if(sx-1>64&&sx-1<91)|(sx-1>96&&sx-1<123)|(sx-1>

21、=48&&sx-1<=57)/如果前面是数字或字母 else if(i>0) sn=s.substr(x-i,i); / cout<<sn<<"运算符 i="<<i<<endl;cout<<sn<<" "outkey=1; wordlook(sn0,sn); rowx+; i=0; cout<<sx<<" (2,"<<sx<<") 分界符 ("<<rowy&

22、lt;<","<<rowx<<")"<<endl; rowx+;/* if(ll="") rowy+; rowx=1; */;int main()int x;string instring;/读入一行string sn;/*getline(cin,sn);/ string带空格输入cout<<sn<<endl;char t=sn0;if(t>=48&&t<=57)searcht(1,sn);elseif(t>64&&t&

23、lt;91)|(t>96&&t<123) searcht(0,sn);else searcht(2,sn);*/ifstream inputfile;/in file streaminputfile.open(salaryfile);/inputfile>>noskipws;if(!inputfile)cout<<"no file"<<endl;string pp;while(!inputfile.eof() getline(inputfile,pp);istringstream istr(pp); strin

24、g ppword;while(istr>>ppword)/按照空格分割字符串split(ppword);/*int begin = 0;/去掉字符串的所有空格begin = pp.find(" ",begin); /查找空格在str中第一次出现的位置while(begin != -1) /表示字符串中存在空格 pp.replace(begin, 1, ""); / 用空串替换str中从begin开始的1个字符 begin = pp.find(" ",begin); /查找空格在替换后的str中第一次出现的位置 */cout

25、<<"good "<<pp<<endl;/rowx+; rowy+;/换行rowx=1;return 0;七、实验总结 通过本次试验使我不仅对词法分析器有了更深的了解,而且提高了编程能力,希望在以后的学习中可以解决词法分析更多的问题。实验2 ll(1)分析法 一、实验目的通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。二、实验要求1、编程时注意编程风格:空

26、行的使用、注释的使用、缩进的使用等。 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 u 三、实验内容根据某一文法编制调试 ll ( 1 )分析程序,以便对任意输入的符号串进行分析。 u 构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。 u 分析法的功能是利用 ll(1)控制程序根据显示栈栈顶内容、向前看符

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

28、心代码 #include<iostream>#include<string>using namespace std;string pp;/输出字符串string hh="rn"/换行const int max=50;int endfumax;/终止符序号表int endfupointer=8;char endfurealmax='+','-','*','/','(','i',')','#'int unendfumax;int

29、 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

30、)","f->i"/0 e->tg,1 g->+tg,2 g->-tg,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;x<endfupointer;x+)if(endfurealx=f

31、u)break;if(x<endfupointer)return x;else return -1;int checkunendfu(char fu)/查非终结符序号int x;for(x=0;x<unendfupointer;x+)if(unendfurealx=fu)break;if(x<unendfupointer)return x;else return-1;string checkmakemath(int x)/查产生式表return makemathx;int checksmarttable(int x,int y)/查分析表return smarttablexy

32、;class smartboxpublic:smartbox()box0='#'box1='e'boxpointer=1;void push(char fu)boxpointer+;boxboxpointer=fu;char pop()char a=boxboxpointer;if(a!='#')/cout<<"pop: "<<boxpointer<<" "<<a<<endl;/stringstream oss;/*pp=pp+"pop:

33、 "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;/cout<<boxboxpointer<<checkendfu(boxboxpointer)<<" "/char buffermax;/sprintf(buff

34、er/pp=pp+boxboxpointer;/pp=pp+checkendfu(boxboxpointer);/pp=pp+" "a=pop();/cout<<"out "<<a<<endl;char boxmax;int boxpointer;int main()/ todo: add extra validation here/pp=pp+"步骤 分析栈 剩余输入串 所用产生式 动作"+hh;/*string s1="sdsfs rnsdfsds"string s3=&qu

35、ot;aaaaaaaaaaaaa"s3=s3+s1;cstring s2(s3.c_str();/cstring s2=cstring(s1); setdlgitemtext(idc_edit2,s2);/用setdlgitemtext(文本框id,字符串),将文本框的内容设置为字符串的内容. setdlgitemtext(idc_edit2,s2);*/messagebox(str);string str;cin>>str;int x,y;for(x=0;x<max;x+) /初始化分析表 99为错误代号for(y=0;y<max;y+)smarttable

36、xy=99; smarttable04=0;smarttable05=0;smarttable10=1;smarttable11=2;smarttable16=3;smarttable17=3;smarttable24=4;smarttable25=4;smarttable30=7;smarttable31=7;smarttable32=5;smarttable33=5;smarttable36=7;smarttable37=7;smarttable44=8;smarttable45=9;smartbox mark;char fu;char enterfu;int endfunumber;in

37、t unendfunumber;string readyin;string enter;/cin>>enter; /enter="i+i*i#"enter=str;/enter="(i)#"int count=0;/步骤 char buffer1max; sprintf(buffer1,"%d",count); string s1=buffer1;pp=pp+s1+" " /分析栈for(int qq1=0;qq1<=mark.boxpointer;qq1+)pp=pp+mark.boxqq1;

38、for(qq1=0;qq1<10-mark.boxpointer;qq1+)pp=pp+" "/剩余输入栈string jiequ1=enter.substr(0,enter.length();pp=pp+jiequ1;for(int t1=0;t1<20;t1+)pp=pp+" " pp=pp+" 初始化"+hh;for(x=0;x<enter.length();) /步骤 count+;char buffermax; sprintf(buffer,"%d",count); string s=b

39、uffer;pp=pp+s+" " /分析栈for(int qq=0;qq<=mark.boxpointer;qq+)pp=pp+mark.boxqq; for(qq=0;qq<10-mark.boxpointer;qq+)pp=pp+" "/剩余输入栈string jiequ=enter.substr(x,enter.length()-x);pp=pp+jiequ;for(int t=0;t<x+10;t+)pp=pp+" "enterfu=enterx;/cout<<"enterfu: &q

40、uot;<<enterfu<<endl;mark.check();fu=mark.pop();/cout<<"fu: "<<fu<<endl;if(fu='#')/&&enterfu='#')/cout<<"sucessed! over!"<<endl;pp=pp+"sucessed! over!"+hh;break;unendfunumber=checkunendfu(fu);endfunumber=c

41、heckendfu(enterfu);/cout<<unendfunumber<<endl;/cout<<endfunumber<<endl;if(smarttableunendfunumberendfunumber=99)pp=pp+"error!"break;readyin=makemathsmarttableunendfunumberendfunumber;pp=pp+readyin;for(int ddd=0;ddd<14-readyin.length();ddd+)pp=pp+" " pp=

42、pp+"pop,push("for(y=readyin.length()-1;y>2;y-)pp=pp+readyiny;pp=pp+")"+hh;/cout<<"readyin: "<<readyin<<endl;int firsttime=0;for(y=readyin.length()-1;y>2;y-)/cout<<readyiny<<" "if(readyiny!='$') mark.push(readyiny); i

43、f(firsttime=0) if(checkendfu(readyiny)!=-1) / cout<<"now x: "<<x<<" " /步骤 count+;char buffermax; sprintf(buffer,"%d",count); string s=buffer;pp=pp+s+" " /分析栈for(int qq=0;qq<=mark.boxpointer;qq+)pp=pp+mark.boxqq; for(qq=0;qq<10-mark.boxp

44、ointer;qq+)pp=pp+" "/剩余输入栈string jiequ=enter.substr(x,enter.length()-x);pp=pp+jiequ;for(int t=0;t<x+10;t+)pp=pp+" " pp=pp+" getnext(i)"+hh; x+;/ cout<<"next x: "<<x<<" "<<endl;firsttime=1; mark.check();/cout<<endl;/pp

45、=pp+hh;cout<<pp;return 0;/cdialog:onok();七、实验总结 通过本次试验使我不仅对ll(1)分析法有了更深的了解,而且提高了编程能力,希望在以后的学习中可以解决自动构造follow集的问题。 实验3 lr(1)分析法 一、实验目的构造 lr(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解 lr(k)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。 二、实验要求1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。 2、如果遇到错误的表达式,应输出错误提示信息。 3、程序输入/输出实例: 输入一以#结

46、束的符号串(包括+*()i#):在此位置输入符号串 输出过程如下: 步骤 状态栈 符号栈 剩余输入串 动 作 1 0 # i+i*i# 移进 i+i*i 的 lr分析过程 步骤 状态栈 符号栈 输入串 动作说明 1 0 # i+i*i# action0,i=s5,状态5入栈 2 05 #i +i*i# r6: fi 归约,goto(0,f)=3 入栈 3 03 #f +i*i# r4: tf归约,goto(0,t)=3 入栈 4 02 #t +i*i# r2: et归约,goto(0,e)=1 入栈 5 01 #e +i*i# action1,+=s6,状态6入栈 6 016 #e+ i*i#

47、 action6,i=s5,状态5入栈 7 0165 #e+i *i# r6: fi 归约,goto(6,f)=3 入栈 8 0163 #e+f *i# r4: tf归约,goto(6,t)=9 入栈 9 0169 #e+t *i# action9,*=s7,状态7入栈 10 01697 #e+t* i# action7,i=s5,状态5入栈 11 016975 #e+t*i # r6:fi 归约,goto(7,f)=10 入栈 12 0169710 #e+t*f # r3: tt*f归约,goto(6,t)=9 入栈 13 0169 #e+t # r1:ee+t,goto(0,e)=1 入栈

48、 14 01 #e # acc:分析成功 三、实验内容对下列文法,用 lr(1)分析法对任意输入的符号串进行分析: (1)e-> e+t (2)e->t (3)t-> t*f (4)t->f (5)f-> (e) (6)f-> i 四、实验步骤1、根据流程图编写出各个模块的源程序代码上机调试。 2、编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的 lr(1)语法分析程序;直至能够得到完全满意的结果。 3、书写实验报告 ;实验报告正文的内容: u 描述 lr(1)语法分析程序的设计思想。 u 程序结构描述:函数调用格式、参数含义、返回值描述

49、、函数功能;函数之间的调用关系图。 u 详细的算法描述(程序执行流程图) 。 u 给出软件的测试方法和测试结果。 五、实验截图6、 核心代码#include<iostream>#include<string>using namespace std;int count=1;string pp;/输出字符串string hh="rn"/换行const int max=100;char endfurealmax='i','+','*','(',')','#',&

50、#39;e','t','f'int endfupointer=8;string creatwordmax="e->e+t","e->t","t->t*f","t->f","f->(e)","f->i"/(0)e-> e+t(1)e->t (2)t-> t*f (3)t->f (4)f-> (e) (5)f-> i /注意rj时j应对应数组下标int checkend

51、fu(char fu)/查终结符序号int x;for(x=0;x<=endfupointer;x+)if(endfurealx=fu)break;if(x<=endfupointer)return x;else return -1;class actiongo/原子动作public:actiongo() / cout<<"eroor! wrong action or goto creat"<<endl; actype=4; action(int i,int j) actype=i; number=j;/ cout<<i<

52、;<" "<<j<<endl; int actype;/0=s 1=r 2=acc 3=goto表 4=wrong int number;actiongo smarttablemaxmax;class stylebox/状态栈public:stylebox()box0=0;boxpointer=0;void push(int style)boxpointer+;boxboxpointer=style;int pop()int a=boxboxpointer;boxpointer-;/cout<<"pop now"<<endl;return a;int boxmax;int boxpointer;class readybox/已归约栈public:readybox()box0='#'boxpointer=0;void push(char fu)b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论