《合肥工业大学编译原理实验报告(完整代码版).docx》由会员分享,可在线阅读,更多相关《合肥工业大学编译原理实验报告(完整代码版).docx(71页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、合肥工业大学编译原理实验报告(完整代码版) 计算机与信息学院 编译原理 试验报告 专业班级 信息平安 131 班 学生姓名及学号 马骏 2022211869课 程 教 学 班 号任课教师李宏芒 实 验 指 导 教 师李宏芒实 验 地 点试验楼机房 2022 2022 学年第 二 学期 验 试验 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) 120 ( 5,0 ) 常数(1,4)then( 1,then) 关键字(1,5)n (6,n ) 标识符(1,6)+Error Error (1,7);
3、 ( 2, ; ) 分界符 (1,8)a (6,a )标识符(2,1)= (4,<= ) 关系运算符 (2,2)3bError Error (2,4)%Error Error (2,4) ( 2, ) )分界符(2,5); ( 2, ; )分界符 (2,6)三、试验内容 用 VC+/VB/JAVA 语言实现对 C 语言子集得源程序进行词法分析。通过输 入源程序从左到右对字符串进行扫描与分解,依次输出各个单词得内部编码及单 词符号自身值;若遇到错误则显示Error,然后跳过错误部分接着显示 ;同时 进行标识符登记符号表得管理。以下就是实现词法分析设计得主要工作:(1)从源程序文件中读入字符
4、。(2)统计行数与列数用于错误单词得定位。(3)删除空格类字符,包括回车、制表符空格。(4)按拼法单词,并用(内码,属性)二元式表示。(属性值——token 得机内 表示)(5)假如发觉错误则报告出错 7(6)依据须要就是否填写标识符表供以后各阶段运用。四、试验步骤 1、依据流程图编写出各个模块得源程序代码上机调试。2、 编制好源程序后,设计若干用例对系统进行全面得上机测试,并通过所设计 得词法分析程序;直至能够得到完全满足得结果。3、书写试验报告 ;试验报告正文得内容:功能描述:该程序具有什么功能?程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数 之间
5、得调用关系图。具体得算法描述(程序总体执行流程图) 。给出软件得测试方法与测试结果。试验总结 (设计得特点、不足、收获与体会)。五、试验 截图先创建 salary 文件 输入 If i=0 then n+;a<= 3b %);六、 核心代码#include<iostream> #include<string> #include<fstream> #include <sstream> using namespace std; const char* salaryfile="salary" const int max=40;
6、 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;/ 关键字表尾 int kpointer=0;/ 标识符表尾 int fjf;/0 不就是分界符 1
8、 就是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(idx=m) cout<<"(1,&q
9、uot;<<idx<<")"<<字 关 键 字 ("<<rowy<<","<<rowx<<")"<<endl; break; if(x=max)/ 不就是关键字再识别标识符 for(x=0;x<max;x+) if(kx=m) cout<<"(6,"<<m<<") "<<符 标 识 符 ("<<rowy<<
10、;","<<rowx<<")"<<endl; break; if(x=max)/ 标识符表没有时插入标识符 cout<<"(6,"<<m<<") "<<符 标 识 符 ("<<rowy<<","<<rowx<<")"<<endl; kkpointer=m; kpointer+; if(i=1)/ 识别常数/ cout<
11、<"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<<")"<<endl;c
12、icipointer=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<<",
13、"<<rowx<<")"<<endl;outkey=0;fjf=0; if(x>9&&x<max1) if(outkey=1)cout<<"(4,"<<sx<<") 符 关 系 运 算 符 ("<<rowy<<","<<rowx<<")"<<endl;outkey=0; fjf=0; if(x=max) if(outkey=1)
14、cout<<"Error Error ("<<rowy<<","<<rowx<<")"<<endl;outkey=0;fjf=0; ; void wordlook(char t,string sn)/ 识别首字符, 分类识别字符串 if(t>=48&&t<=57) searcht(1,sn);else if(t>64&&t<91)|(t>96&&t<123) searcht(0,s
15、n); else searcht(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)|
16、(x>0&&sx=46&&sign=1)/ 推断数字后跟字母还就是字母后有数字 if(i=0)if(sx>=48&&sx<=57) sign=1;else sign=2;else if(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 、length1)sn=s 、substr(xi+1,i);if(i>0)/cout<&l
17、t;sn<<i="<<i<<endl; cout<<sn<<" if(sign=0)/ 数字后有字母得状况 cout<<" ErrorError("<<rowy<<","<<rowx<<")"<<endl;else / 字母开头得字符串 /cout<<" true"<<endl;wordlook(sn0,sn); rowx+; else if
18、(x>0&&(sx1>64&&sx1<91)|(sx1>96&&sx1<123)|(sx1>=48&&sx1<=57)/ 遇到分界符运算符 假如前面就是数字或字母sn=s 、substr(xi,i); if(i>0) /cout<<sn<<i="<<i<<endl;cout<<sn<<"if(sign=0)cout<<Error Error ("<<rowy&
19、lt;<","<<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<123)|(sx+1>=
20、48&&sx+1<=57)/ 假如后面就 是数字或字母 sn=s 、substr(xi+1,i);/ cout<<sn<<运算符 i="<<i<<endl;cout<<sn<<"outkey=1;wordlook(sn0,sn);rowx+; i=0; if(fjf=1) if(sx1>64&&sx1<91)|(sx1>96&&sx1<123)|(sx1>=48&&sx1<=57)/ 如 假如前面就
21、是数字或字母else if(i>0)sn=s 、substr(xi,i); / cout<<sn<<运算符 i="<<i<<endl;cout<<sn<<"outkey=1;wordlook(sn0,sn);rowx+; i=0;cout<<sx<<(2,"<<sx<<") 符 分 界 符 ("<<rowy<<","<<rowx<<")&quo
22、t;<<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);else if(t>64&&t<91)|(t>96&&t<123) searcht(0,sn);
23、 else searcht(2,sn); */ifstream input input(salaryfile); / inputfile>>noskipws;if(!inputfile) cout<<"no file"<<endl; string pp;while(!input) getline(input); istringstream istr(pp); string ppword; while(istr>>ppword)/ 根据空格分割字符串 split(ppword); /* int begin = 0;/ 去掉字符串
24、得全部空格 begin = pp 、find(",begin);/ 查找空格在 str 中第一次出现得位置 while(begin != 1)/ 表示字符串中存在空格 pp 、replace(begin, 1, "");/ 用空串替换 str 中从 begin 起先得 1 个字符 符 begin = pp 、find(",begin);/ 查找空格在替换后得 str 中第一次出现得位置 */ / cout<<"good"<<pp<<endl; / rowx+; rowy+;/ 换行 rowx=1;r
25、eturn 0; 七、 试验总结通过本次试验使我不仅对词法分析器有了更深得了解,而且提高了编程实力,希望在以后得学习中可以解决词法分析更多得问题。验 试验 2LL(1) 分析法一、 试验目得 通过完成预料分析法得语法分析程序,了解预料分析法与递归子程序法得区 别与联系。使学生了解语法分析得功能,驾驭语法分析程序设计得原理与构造方 法,训练学生驾驭开发应用程序得基本方法。有利于提高学生得专业素养,为培 养适应社会多方面须要得实力。二、 试验要求 1、编程时留意编程风格:空行得运用、注释得运用、缩进得运用等。2、假如遇到错误得表达式,应输出错误提示信息。3、对下列文法,用 LL(1)分析法对随意输
26、入得符号串进行分析:(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、依据流程图编写出各个模块得源程序代码上机调
27、试。2、 编制好源程序后,设计若干用例对系统进行全面得上机测试,并通过所设计 得 LL(1)分析程序;直至能够得到完全满足得结果。3、书写试验报告 ;试验报告正文得内容: 写出 LL(1)分析法得思想及写出符合 LL(1)分析法得文法。 程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数 之间得调用关系图。 具体得算法描述(程序执行流程图) 。 给出软件得测试方法与测试结果。 试验总结 (设计得特点、不足、收获与体会)。五、试验 截图 六、 核心代码 #include<iostream> #include<string> using namespace s
28、td; 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
29、>$","T>FS","S>*FS","S>/FS","S>$","F>(E)","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 smarttab
30、lemaxmax;/ 分析表 int checkendfu(char fu)/ 查终结符序号 int x;for(x=0;x<endfupointer;x+) if(endfurealx=fu)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 return1; ;
31、string checkmakemath(int x)/ 查产生式表 return makemathx; ; int checksmarttable(int x,int y)/ 查分析表 return smarttablexy; ; class smartbox public:smartbox box0=#; box1=E; boxpointer=1;void push(char fu) boxpointer+; boxboxpointer=fu;char popchar a=boxboxpointer; if(a!=#) /cout<<"pop: "<&
32、lt;boxpointer<<""<<a<<endl; /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; /cout<<
33、boxboxpointer<<checkendfu(boxboxpointer)<<" " /char buffermax; /sprintf(buffer /pp=pp+boxboxpointer;/ pp=pp+checkendfu(boxboxpointer); /pp=pp+" " a=pop;/ cout<<"out "<<a<<endl; char boxmax;int boxpointer; ; int main / TODO: Add extra valida
34、tion here / pp=pp+步骤分析栈 剩余输入串所用产生式 动作"+hh; /*string s1="sdsfsrnsdfsds"string s3="aaaaaaaaaaaaa"s3=s3+s1; CString s2(s3 、c_str); / CString s2=CString(s1);SetDlgItemText(IDC_EDIT2,s2);/ 用 SetDlgItemText( 文本框 ID, 字符串), 将文本框得内容设置为字符串得内容、SetDlgItemText(IDC_EDIT2,s2); */ / Message
35、Box(str); string str; cin>>str;int x,y;for(x=0;x<max;x+)/ 初始化分析表 99 为错误代号 for(y=0;y<max;y+)smarttablexy=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;
36、smarttable36=7;smarttable37=7;smarttable44=8;smarttable45=9;smartbox mark;char fu;char enterfu;int endfunumber;int unendfunumber;string readyin;string enter; / cin>>enter;/enter="i+i*i#"enter=str; /enter="(i)#"int count=0; / 步骤char buffer1max; sprintf(buffer1,"%d"
37、,count);string s1=buffer1;pp=pp+s1+" " / 分析栈for(int qq1=0;qq1<=mark 、boxpointer;qq1+) pp=pp+mark 、boxqq1;for(qq1=0;qq1<10mark 、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+" 初始化"+h
38、h;for(x=0;x<enter 、length;)/ 步骤 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<10mark 、boxpointer;qq+) pp=pp+"/ 剩余输入栈string jiequ=enter 、substr(x,enter 、lengthx
39、);pp=pp+jiequ;for(int t=0;t<x+10;t+) pp=pp+" enterfu=enterx; / cout<<"enterfu: "<<enterfu<<endl; mark 、check; fu=mark 、pop; /cout<<"fu: "<<fu<<endl; if(fu=#)/&&enterfu=#) /cout<<"sucessed! over!"<<endl;pp=p
40、p+"sucessed! over!"+hh;break; unendfunumber=checkunendfu(fu); endfunumber=checkendfu(enterfu);/ cout<<unendfunumber<<endl;/ cout<<endfunumber<<endl; if(smarttableunendfunumberendfunumber=99) pp=pp+"error!"break; readyin=makemathsmarttableunendfunumberendfu
41、number; pp=pp+readyin; for(int ddd=0;ddd<14readyin 、length;ddd+) pp=pp+" pp=pp+"POP,PUSH(" for(y=readyin 、length1;y>2;y) pp=pp+readyiny; pp=pp+")"+hh;/ cout<<"readyin:"<<readyin<<endl; int firsttime=0; for(y=readyin 、length1;y>2;y) / cout<<readyiny<<"if(readyiny!=$) mark 、push(readyin
限制150内