天津科技大学编译原理实验报告_第1页
天津科技大学编译原理实验报告_第2页
天津科技大学编译原理实验报告_第3页
天津科技大学编译原理实验报告_第4页
免费预览已结束,剩余14页可下载查看

付费下载

下载本文档

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

文档简介

1、.编译原理实验指导书专业:学号:姓名:2009年 5月页脚.前言“编译原理 ”是一门研究设计和构造编译程序原理和方法的课程,是计算机各专业的一门重要专业基础课。 编译原理这门课程蕴含着计算机学科中解决问题的思路、形式化问题和解决问题的方法, 对应用软件和系统软件的设计与开发有一定的启发和指导作用。编译程序构造的原理和技术在软件工程、 逆向工程、 软件再工程、 语言转换及其他领域中都有着广泛的应用。通过本课程的实验教学,使学生加深对编译系统的结构、工作流程及编译程序各组成部分设计原理的理解, 使他们能够掌握和应用常用的编译技术和方法, 为今后从事应用软件和系统软件的开发打下一定的理论和实践基础。

2、编译原理实验指导书围绕着实验教学目标,详细阐述了各实验的原理和步骤。希望同学们能够充分利用实验条件,认真完成实验,从实验中得到应有的锻炼和培养。页脚.实验要求为了顺利完成编译原理课程实验,学生应做到:( 1) 熟练掌握一种高级程序设计语言。( 2) 实验前,认真学习教材以及实验指导书的相关容,提前做好实验准备。( 3) 每次实验先分析后编程,在实验报告中应写明自己的编程思路和设计流程。( 4) 实验结束一周后提交实验报告。实验报告容应包括:实验目的、实验容、设计思路和流程框图,源程序(含注释)清单、测试结果以及实验总结。( 5) 遵守机房纪律,服从辅导教师指挥,爱护实验设备。实验的验收将分为两

3、个部分。第一部分是上机操作,随机抽查程序运行和即时提问;第二部分是提交书面的实验报告。此外杜绝抄袭现象,一经发现雷同,双方成绩均以 0分计算。页脚.目录实验一词法分析程序设计 1实验二递归下降语法分析程序设计5页脚.实验 1 词法分析程序设计【开发语言及实现平台或实验环境】C/C+/C#Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET 2005-2008【实验目的 】( 1 )理解词法分析在编译程序中的作用( 2 )加深对有穷自动机模型的理解( 3 )掌握词法分析程序的实现方法和技术【实验容 】对一个简单语言的子集编制一个一遍扫

4、描的词法分析程序。【实验要求 】( 1 )待分析的简单语言的词法1) 关键字begin if then while do end2) 运算符和界符:=+-*/<<=>>=<>=;()#3) 其他单词是标识符 (ID)和整形常数 (NUM) ,通过以下正规式定义:ID=letter(letter|digit)*NUM=digitdigit*4) 空格由空白、制表符和换行符组成。空格一般用来分隔ID、 NUM 、运算符、界符和关键字,词法分析阶段通常被忽略。(2 )各种单词符号对应的种别编码单词符号种别码单词符号种别码begin1:17if2:=18then3&

5、lt;20while4<>21do5<=22end6>23letter(letter|digit)*10>=24digitdigit*11=25+13;26-14(27*15)28/16#0(3 )词法分析程序的功能页脚.输入:所给文法的源程序字符串输出:二元组(syn,token 或 sum )构成的序列。syn 为单词种别码;token 为存放的单词自身字符串;sum 为整形常数。例如:对源程序begin x:=9;if x>0 then x:=2*x+1/3;end#经词法分析后输出如下序列:( 1 ,begin )(10,x) (18,:=) (11

6、,9) (26,;) (2,if)【实验步骤 】(1 )根据图1.1 构建主程序框架置初值调用扫描子程序输出单词二元组否输出串结束?是结束图 1.1 词法分析主程序示意图代码提示:main()p=0;printf( “n please input string:n ”);do输入源程序字符串,送到缓冲区progp+ 中while(ch!= #);p=0;doscanner();/调用扫描子程序switch(syn)case 11:输出(数的二元组);break;case 1:输出(关键字 begin 的二元组);break;.页脚.case 1:输出(错误) ;break; while(syn

7、!=0);(2 )关键字表置初值关键字作为特殊标识符处理,把它们预先安排在一表格中(关键字表) ,当扫描程序识别标识符时,查关键字表。如能查到匹配的单词,则为关键字,否则为一般标识符。(3 )编写扫描子程序代码提示:scanner().读下一个字符送入 ch;while(ch= = )读下一个字符 ;if(ch 是字母或数字 )while(ch 是字母或数字 )ch=>token;读下一个字符 ;token 与关键字表进行比较,确定syn 的值;elseif(ch 是数字 ).syn=11;elseswith(ch)/ 其他字符情况case<:case>:.Default:s

8、yn=-1;(4 )调试程序,验证输出结果。页脚.【思考题 】( 1 )在编程过程中遇到了哪些问题,你是如何解决的。( 2 )源程序若存在注释,如何实现词法分析,在现有程序基础上进行扩充。【参考文献 】1.伦骏、徐兰芳等,编译原理(第2 版),电子工业出版社,246, 2005.72. 王雷、志成等,编译原理课程设计,机械工业出版社, 2005.3实验 2 递归下降语法分析程序设计【开发语言及实现平台或实验环境】C/C+/C#Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET 2005-2008【实验目的 】( 1)理解语法分析在

9、编译程序中的作用,以及它与词法分析程序的关系( 2)加深对递归下降语法分析原理的理解( 3)掌握递归下降语法分析的实现方法【实验容 】编制一个递归下降分析程序,实现对词法分析程序提供的单词序列的语法检查和结构分析。【实验要求 】( 1 )待分析的简单语言的词法同实验1( 2 )待分析的简单语言的语法用扩充的BNF 表示如下:1) <程序 >: =begin< 语句串 >end2) <语句串 >:=< 语句 >;< 语句 >3) <语句 >:=< 赋值语句 >4) < 赋值语句 >:=ID:=<

10、 表达式 >页脚.5) < 表达式 > : =< 项 >+< 项>|-< 项 >6) < 项 >:=< 因子 >*< 因子 >|/< 因子 >7) < 因子 >:=ID|NUM|(<表达式 >)(3 )语法分析程序的功能输入单词串以 ”# ”结束,如果是文确的句子,输出成功信息;否则输出错误信息。例如:输入begin a:=9; x:=2 * 3; b:=a + x end #输出success输入x:=a + b * c end #输出error【实验步骤 】(1 )

11、根据图2.1 递归下降分析程序示意图构建主程序框架置初值调用 scanner 读下一个单词符号调用 lrparser结束图 2.1 递归下降分析程序示意图(2 )编写各语法单位分析函数1)编写语句串及语句分析函数代码提示:yucu()/ 语句串分析函数调用 statement();/ 语句分析函数while(syn=26)读入下一个单词符号;调用 statement();return;statement ()if(syn=10)读入下一个单词符号;if(syn=18)页脚.读入下一个单词符号;调用 expression 函数; / 表达式分析函数else输出赋值号错误; kk=1/ 出错标记

12、else输出语句号错误; kk=1;return;2)编写表达式分析过程int expression()term();while(syn=13)|(syn=14)scanner();term();return 0;3)编写项分析过程int term()factor();while(syn=15)|(syn=16)scanner();factor();return 0;4)编写因子分析过程int factor()if(syn=10)|(syn=11)scanner();elseif(syn=27)scanner();expression();if(syn=28)页脚.syn=scanner();

13、elsecout<<" 输出错误 "<<endl;kk=1;elsecout<<" 输出表达错误 "<<endl;kk=1;return 0;(3 )调试程序,验证输出结果【源程序】#include <stdio.h>#include <string.h>#include <iostream>using namespace std;char prog80, token8;char ch;int syn, p, m, n, sum, kk;char *rwtab6 = &q

14、uot;begin" , "if" , "then" , "while" , "do" , "end" ;int scanner();/ 调用 scanner函数int lrparscr();/ 调用 lrparscr 函数int yucu();/ 调用 yucu函数int statement();/ 调用 statement 函数int expression();/ 调用 expression函数int term();/ 调用 term 函数int factor();/ 调用 fac

15、tor 函数void main()p = 0;cout <<"nPlease input string:"<< endl;docin.get(ch);页脚.progp+ = ch;/ 输入源程序字符串,送到缓冲区progp+ 中 while (ch != '#' ); p = 0;kk = 0; scanner(); lrparscr(); getchar(); getchar();int lrparscr()if (syn = 1)scanner();/ 读下一个单词符号yucu();if (syn = 6)/syn=6对应单词符号

16、 endscanner();/ 读下一个单词符号if (syn = 0) && (kk = 0)printf( "success!n" );elseif (kk != 1)cout << "出现缺 end 错误! " << endl;kk = 1;elsecout <<"出现缺 begin 错误! " << endl;kk = 1;return 0;int yucu()/ 语句串分析函数statement();while (syn = 26)scanner();/ 读下一

17、个单词符号statement();/ 调用 statement 函数页脚.return 0;int statement()if (syn = 10)scanner();/ 读下一个单词符号if (syn = 18)scanner();/ 读下一个单词符号expression();elsecout <<"出现赋值号错误!" << endl;kk = 1;elsecout <<"出现语句错误! " << endl;kk = 1;return 0;int expression()term();while (syn

18、 = 13) | (syn = 14)scanner();/ 读下一个单词符号term();return 0;int term()factor();while (syn = 15) | (syn = 16)页脚.scanner();/ 读下一个单词符号factor();return 0;int factor()if (syn = 10) | (syn = 11)/ 是否是标识符或整型常数scanner();/ 读下一个单词符号elseif (syn = 27)/是否是(scanner();/ 读下一个单词符号expression();if (syn = 28)/是否是)syn = scanne

19、r();/ 读下一个单词符号elsecout <<"出现) 错误! " << endl;kk = 1;elsecout <<"出现表达式错误!" << endl;kk = 1;return 0;int scanner()for (n = 0; n<8; n+) tokenn =NULL;ch = progp+;/ 读下一个单词符号并赋给chwhile (ch = ' ')/ 如果是空格 ,读下一字符ch = progp;p+;if (ch >= 'a'&&

20、amp;ch <='z') | (ch >= 'A'&&ch <='Z' )/ 如果是字母字符m = 0;页脚.while (ch >= 'a' &&ch <='z') | (ch >= 'A'&&ch <='Z' ) / 如果是字母字符tokenm+ = ch;/ 当前字符送入 tokench = progp+;/ 读下一个单词符号并赋给chtokenm+ ='0' ;/ 单词

21、结束p-;/ 回退一个字符syn = 10;/ 标识符for (n = 0; n<6; n+)/ 与关键字表进行比较,确定syn的值if (strcmp(token, rwtabn)=0)syn = n + 1;/ 给出 syn值break ;else if (ch >= '0' &&ch <='9' )/ 如果是数字字符sum = 0;while (ch >= '0' &&ch <='9' )/ 如果是数字字符sum = sum * 10 + ch -'0&#

22、39; ;/ch 送入 sum,并更新数字ch = progp+;/ 读下一个单词符号并赋给chp-;/ 回退一个字符syn = 11;/ 数字字符if (sum>32767)syn = -1;/ 出现错误else switch (ch)/ 其他字符时case'<' :m = 0; tokenm+ = ch;ch = progp+;/ 读下一个单词符号并赋给chif (ch = '>' )syn = 21;/ 不等于tokenm+ = ch;else if (ch = '=' )syn = 22;/ 小于等于tokenm+ =

23、ch;页脚.elsesyn = 23;/ 大于p-;/ 回退一个字符break;case'>' :m = 0; tokenm+ = ch;ch = progp+;/ 读下一个单词符号并赋给chif (ch = '=' )syn = 24;/ 大于等于tokenm+ = ch;elsesyn = 20;/ 小于p-;/ 回退一个字符break;case':':m = 0; tokenm+ = ch;ch = progp+;/ 读下一个单词符号并赋给chif (ch = '=' )syn = 18;/ 等于tokenm+ = ch;elsesyn = 17;/ 冒号:p-;break;case'+' :syn

温馨提示

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

评论

0/150

提交评论