欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

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

    • 资源ID:11716678       资源大小:45.86KB        全文页数:71页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    合肥工业大学编译原理实验报告(完整代码版) 计算机与信息学院 编译原理 试验报告 专业班级 信息平安 131 班 学生姓名及学号 马骏 2022211869课 程 教 学 班 号任课教师李宏芒 实 验 指 导 教 师李宏芒实 验 地 点试验楼机房 2022 2022 学年第 二 学期 验 试验 1词法分析设计 一、试验目得 通过本试验得编程实践,使学生了解词法分析得任务,驾驭词法分析程序设 计得原理与构造方法,使学生对编译得基本概念、原理与方法有完整得与清晰得 理解,并能正确地、娴熟地运用 二、 试验要求 1、编程时留意编程风格:空行得运用、注释得运用、缩进得运用等。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); ( 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)从源程序文件中读入字符。(2)统计行数与列数用于错误单词得定位。(3)删除空格类字符,包括回车、制表符空格。(4)按拼法单词,并用(内码,属性)二元式表示。(属性值——token 得机内 表示)(5)假如发觉错误则报告出错 7(6)依据须要就是否填写标识符表供以后各阶段运用。四、试验步骤 1、依据流程图编写出各个模块得源程序代码上机调试。2、 编制好源程序后,设计若干用例对系统进行全面得上机测试,并通过所设计 得词法分析程序;直至能够得到完全满足得结果。3、书写试验报告 ;试验报告正文得内容:功能描述:该程序具有什么功能?程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数 之间得调用关系图。具体得算法描述(程序总体执行流程图) 。给出软件得测试方法与测试结果。试验总结 (设计得特点、不足、收获与体会)。五、试验 截图先创建 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; string idmax="do","end","for","if","printf","scanf","then","while"/ 关键字表 string 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,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,"<<idx<<")"<<字 关 键 字 ("<<rowy<<","<<rowx<<")"<<endl; break; if(x=max)/ 不就是关键字再识别标识符 for(x=0;x<max;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)/ 识别常数/ 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<<")"<<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<<","<<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)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,sn); 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)|(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<<sn<<i="<<i<<endl; cout<<sn<<" if(sign=0)/ 数字后有字母得状况 cout<<" ErrorError("<<rowy<<","<<rowx<<")"<<endl;else / 字母开头得字符串 /cout<<" true"<<endl;wordlook(sn0,sn); rowx+; else if(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<<","<<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>=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)/ 如 假如前面就是数字或字母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<<")"<<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); 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;/ 去掉字符串得全部空格 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;return 0; 七、 试验总结通过本次试验使我不仅对词法分析器有了更深得了解,而且提高了编程实力,希望在以后得学习中可以解决词法分析更多得问题。验 试验 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)分析法得文法。 程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数 之间得调用关系图。 具体得算法描述(程序执行流程图) 。 给出软件得测试方法与测试结果。 试验总结 (设计得特点、不足、收获与体会)。五、试验 截图 六、 核心代码 #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 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,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=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; ; 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: "<<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<<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 validation 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); */ / MessageBox(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;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",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+" 初始化"+hh;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);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=pp+"sucessed! over!"+hh;break; unendfunumber=checkunendfu(fu); endfunumber=checkendfu(enterfu);/ cout<<unendfunumber<<endl;/ cout<<endfunumber<<endl; if(smarttableunendfunumberendfunumber=99) pp=pp+"error!"break; readyin=makemathsmarttableunendfunumberendfunumber; 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

    注意事项

    本文(合肥工业大学编译原理实验报告(完整代码版).docx)为本站会员(h****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开