




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、电 子 科 技 大 学实 验 报 告学生姓名: 学 号: 指导教师:实验地点: 实验时间:一、实验室名称:计算机学院软件工程实验室二、实验项目名称:词法分析器的设计与实现三、实验学时:4学时四、实验原理 1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序。2. 词法分析的功能是从左到右逐个地扫描源程序字符串,按照词法规则识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关信息。3. 状态转换图是有限有向图,是设计词法分析器的有效工具。5、 实验目的 通过设计词法分析器的实验,使同学们了解和掌握词法分析程
2、序设计的原理及相应的程序设计方法,同时提高编程能力。6、 实验内容 实现求n!的极小语言的词法分析程序,返回二元式作为输出。七、实验器材(设备、元器件)1. 操作系统:Windows XP2. 开发工具:VC6.03. 普通PC即可8、 实验步骤 (1)启动VC6.0,创建空白工程项目。选择菜单中的“文件”->“新建”->“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“Visual C+ 项目”,在右边框中,选择“空项目(.Net)”,在对话框下边,选择工程文件存放目录及输入名称,如Example1,单击“确定”。(2)建立相应的单词符号与种别对照表;(3)根据状态转换图
3、编写相应的处理函数;(4)完成词法分析器;(5)编译与调试以上程序;(6)生成相应的*.dyd文件,作为后面语法分析的输入文件。9、 实验数据及结果分析 可以对源程序进行词法分析,如果有错给出出错信息和所在行数,如果无错则生成二元式文件。10、 实验结论 本实验程序较好地完成了词法分析程序的设计与实现,能够对所给文法的程序进行词法分析,在没有词法错误的时候生成相应的二元式文件。该实验程序可一次性给出源程序中的词法错误。十一、总结及心得体会 通过该实验,对词法分析程序的设计,以及运用C语言进行编程有了更深刻的理解,同时加深了自己对词法分析程序的原理的理解与掌握,提高了自己的动手能力。十二、对本实
4、验过程及方法、手段的改进建议程序设计合理,代码可进一步优化。 报告评分:指导教师签字:本实验参考源代码如下:#include <string>#include <iostream>#include <stdio.h>using namespace std;char ch,cache;bool retracted,ended;int num,cur_line;string token;void clear_output()freopen("example.dyd","w",stdout);fclose(stdout);f
5、reopen("LexAnalyze.err","w",stdout);fclose(stdout);struct pair_valstring s;int val;void getnbc()if (retracted)ch=cache;retracted=false;else ch=getchar();while (ch=' '|ch='n')if (ch='n')printf("%16s 24n","EOLN");cur_line+;ch=getchar();vo
6、id concat()token+=ch;bool letter()if (ch>='A'&&ch<='Z') return true;if (ch>='a'&&ch<='z') return true;return false;bool digit()if (ch>='0'&&ch<='9') return true;return false;void retract()retracted=true;cache=c
7、h;int reserve()if (token="begin") return 1; if (token="end") return 2; if (token="integer") return 3;if (token="if") return 4;if (token="then") return 5;if (token="else") return 6;if (token="function") return 7;if (token="rea
8、d") return 8;if (token="write") return 9;return 0;void return_val(pair_val v)freopen("example.dyd","a+",stdout);while (v.s.length()<16) v.s=' '+v.s;cout<<v.s<<' 'printf("%2dn",v.val);if (!(retracted&&cache!='
9、9;&&cache!='n')getnbc();if (ch=EOF)printf("%16s 25n","EOF");ended=true;retract();fclose(stdout);void error(int type)freopen("LexAnalyze.err","a+",stdout);printf("*LINE%d: ",cur_line);if (type=0) printf("illegal operatorn");e
10、lse printf("unknown charactern");fclose(stdout);void LexAnalyze()pair_val ret;token=""getnbc();switch(ch) case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j&
11、#39;: case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case &
12、#39;A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q':
13、case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z':while (letter()|digit()concat();ch=getchar();retract();num=reserve();if (num!=0)ret.s=token;ret.val=num;return_val(ret);elseret.s=token;ret
14、.val=10;return_val(ret);break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':while (digit()concat();ch=getchar();retract();ret.s=token;ret.val=11;return_val(ret);break;case '
15、;=':ret.s="="ret.val=12;return_val(ret);case '<':ch=getchar();if (ch='>')ret.s="<>"ret.val=13;return_val(ret);else if (ch='=')ret.s="<="ret.val=14;return_val(ret);elseretract();ret.s="<"ret.val=15;return_val(ret);b
16、reak;case '>':ch=getchar();if (ch='=')ret.s=">="ret.val=16;return_val(ret);elseretract();ret.s=">"ret.val=17;return_val(ret);break;case '-':ret.s="-"ret.val=18;return_val(ret);break;case '*':ret.s="*"ret.val=19;return_v
17、al(ret);break;case ':':ch=getchar();if (ch='=')ret.s=":="ret.val=20;return_val(ret);else error(0);break;case '(':ret.s="("ret.val=21;return_val(ret);break;case ')':ret.s=")"ret.val=22;return_val(ret);break;case '':ret.s="&quo
18、t;ret.val=23;return_val(ret);break;default:error(1);int main()freopen("example.pas","r",stdin);clear_output();retracted=ended=false;cur_line=1;while (!ended)LexAnalyze(); return 0;电 子 科 技 大 学实 验 报 告学生姓名: 学 号: 指导教师:实验地点: 实验时间:一、实验室名称:计算机学院软件工程实验室二、实验项目名称:递归下降分析器的设计与实现三、实验学时:12学时四、
19、实验原理1.语法分析是对源程序经过词法分析后转换成的单词流按方法规则进行判断,对能构成正确句子的单词流,给出相应的语法树;对不能构成正确句子的单词流判断其语法错误并做出相应处理。2.语法分析方法有自上而下和自下而上的分析方法。在不含左递归的文法G中,如果对每一个非终结符的所有候选式的第一个终结符都是两两不相交的(即无公共左因子),则可能构造出一个不带回溯的自上而下的分析程序,这个分析程序由一组递归过程组成,每个过程对应文法的一个非终结符。这样的分析程序称为递归下降分析程序。7、 实验目的 通过设计递归下降分析器的设计与实现实验,使同学们掌握自上而下的递归分析法的语法分析原理和程序设计方法。8、
20、 实验内容根据给定的方法,编写相应的递归下降的语法分析程序,实现对词法分析后的单词序列的语法检查和程序结构的分析,生成相应的变量名表和过程名表,并将编译中语法检查出来的错误写入相应的文件。语法错分类: (1)缺少符号错; (2)符号匹配错 (3)符号无定义或重复定义。七、实验器材(设备、元器件)1.操作系统:Windows XP2.开发工具:VC6.03.普通PC即可10、 实验步骤 (1)启动VC6.0,创建空白工程项目。选择菜单中的“文件”->“新建”->“项目”,在弹出的对话框中,左边的“项目类型”框中,选择“Visual C+ 项目”,在右边框中,选择“空项目(.Net)”
21、,在对话框下边,选择工程文件存放目录及输入名称,如Example1,单击“确定”。(2)消除文法中的左递归;(3)实现对方法进行递归向下的分析过程;(4)利用词法分析器生成的二元式文件*.dyd进行语法分析;(5)编译与调试以上程序;11、 实验数据及结果分析 可以对源程序进行语法分析,图中给出了出错行数及出错类型。11、 实验结论 本实验程序较好地完成了递归下降分析器的设计与实现,能够对所给文法的程序进行语法分析,生成变量名表和过程名表,如果源程序有语法错误则给出出错类型及所在行数。十一、总结及心得体会 通过该实验,对递归下降分析程序的设计,以及运用C语言进行编程有了更深刻的理解,同时加深了
22、自己对语法分析程序的原理的理解与掌握,提高了自己的动手能力。十二、对本实验过程及方法、手段的改进建议程序设计合理,代码可进一步优化。 报告评分:指导教师签字:本实验参考源代码如下:#include <vector>#include <string>#include <iostream>#include <stdio.h>using namespace std;struct variable string vname,vproc,vtype; int vkind,vlev,vadr; var;struct procedure string pnam
23、e,ptype; int plev,fadr,ladr; proc;vector <variable> v_table;vector <procedure> p_table;string sym;int val,cur_line,cur_level;bool ended=false;void clean_output() freopen("example.dys","w",stdout); fclose(stdout); freopen("example.var","w",stdout);
24、fclose(stdout); freopen("","w",stdout); fclose(stdout); freopen("SynAnalyze.err","w",stdout); fclose(stdout);void advance() freopen("example.dys","a+",stdout); cin>>sym>>val; printf("%16s %2dn",sym.c_str(),v
25、al); if (sym="EOF") ended=true; while(sym="EOLN") cur_line+; cin>>sym>>val; printf("%16s %2dn",sym.c_str(),val); void error(int type) freopen("SynAnalyze.err","a+",stdout); switch(type) case 0: printf("LINE %d: variable "%s"
26、; previously declared.n",cur_line,sym.c_str();break; case 1: printf("LINE %d: missing declaration here.n",cur_line);break; case 2: printf("LINE %d: missing executive statement here.n",cur_line);break; case 3: printf("LINE %d: expected "end" here.n",cur_li
27、ne);break; case 4: printf("LINE %d: expected "begin" here.n",cur_line);break; case 5: printf("LINE %d: missing '' here.n",cur_line);break; case 6: printf("LINE %d: brackets doesn't matched.n",cur_line);break; case 7: printf("LINE %d: illegal v
28、ariable here.n",cur_line);break; case 8: printf("LINE %d: missing '(' here.n",cur_line);break; case 9: printf("LINE %d: illegal declaration here.n",cur_line);break; case 10: printf("LINE %d: illegal executive statement here.n",cur_line);break; case 11: prin
29、tf("LINE %d: variable "%s" undeclared.n",cur_line,sym.c_str();break; case 12: printf("LINE %d: missing "else" here.n",cur_line);break; case 13: printf("LINE %d: missing "then" here.n",cur_line);break; case 14: printf("LINE %d: illegal
30、operator here.n",cur_line);break; default: printf("LINE %d: unknown errorn",cur_line); advance(); fclose(stdout);void init() clean_output(); val,cur_line=1; cur_level=0; v_table.clear(); p_table.clear(); proc.pname="" proc.ptype="" proc.plev=0; proc.fadr=0; proc.la
31、dr=-1; p_table.push_back(proc); return;void v_add(int vkind) for (int i=p_tablecur_level.fadr;i<=p_tablecur_level.ladr;i+) if (v_tablei.vname=sym && v_tablei.vlev=cur_level && v_tablei.vkind=vkind) error(0); return; var.vname=sym; var.vproc=p_tablecur_level.pname; var.vtype="
32、integer" var.vkind=vkind; var.vlev=cur_level; var.vadr=v_table.size(); v_table.push_back(var); p_tablecur_level.ladr+;bool v_check() for (int i=p_tablecur_level.fadr;i<=p_tablecur_level.ladr;i+) if (v_tablei.vname=sym && v_tablei.vlev=cur_level) return true; return false;void A();voi
33、d B();void C();void D();void E();void F();void G();void H();void I();void J();void A() if (sym="begin") advance(); if (sym="integer") advance(); B(); else error(1); if (sym="") while (sym="") advance(); if (sym="integer") advance(); B(); else break;
34、else error(2); C(); while (sym="") advance(); C(); if (sym="end") advance(); return; else error(3); else error(4);void B() if (val=10) v_add(0);/加入变量 advance(); else if (sym="function") advance(); if (val=10) advance(); proc.pname=sym; cur_level+; proc.ptype="integ
35、er" proc.plev=cur_level; proc.fadr=v_table.size(); proc.ladr=v_table.size()-1; p_table.push_back(proc); if (sym="(") advance(); if (val=10) v_add(1);/加入形参 advance(); if (sym=")") advance(); if (sym="") advance(); A(); cur_level-; else error(5); else error(6); else error(7); els
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科技产品制造的流程平衡与优化
- 果园的合同范本
- 科技企业如何应对税务政策变化
- 科技助力社区中医健康教育的现代化路径
- 直播平台与互动策略提升营销效果的关键
- 企业社会责任对员工的影响计划
- 贴面粘接护理
- 农村合同范本
- 陶瓷公司加工合同范本
- 收购草莓合同范本
- 三方公司合作协议书范本
- 护理责任组长续聘竞聘
- 2024-2025学年第二学期教学教研工作安排表
- 2025年贵州云上产业服务有限公司招聘笔试参考题库含答案解析
- 2025年南京信息职业技术学院高职单招职业适应性测试近5年常考版参考题库含答案解析
- 2025-2030年中国天然气行业发展分析及发展趋势预测报告
- 《雷达信号处理基础》课件
- 2025届贵州省兴义市三年级数学第一学期期末达标检测试题含解析
- 人教版地理七年级下册7.1.2 亚洲的自然环境(课件39张)
- 外研版(三起)小学英语三年级下册Unit 1 Animal friends Get ready start up 课件
- 2025年交通运输部广州打捞局招聘事业编制人员13人历年管理单位笔试遴选500模拟题附带答案详解
评论
0/150
提交评论