ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:97.69KB ,
资源ID:17097046      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-17097046.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《编译原理》实验指导及报告书新资料.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

《编译原理》实验指导及报告书新资料.docx

1、编译原理实验指导及报告书新资料编译原理实验指导及报告书 / 学年 第 学期姓 名:_学 号:_班 级:_指导教师:_计算机科学与工程学院2016编译原理 实验初步一、实验目的1、熟练掌握使用CODEBLOCK进行C程序编程,提高阅读程序与调试程序的能力。2、掌握堆栈与队列的应用。3、掌握C语言中对字符串处理的常见函数与方法。4、熟悉编程规范,养成对重要的程序段进行必要的注释说明。二、实验内容与步骤1、下面的程序是对一个简单的算术表达式进行计算求值,并输出表达式的值与该表达式的后缀形式。该程序在求值与转换后缀形式时使用了2个堆栈和1个队列。请认真阅读程序和调试,并将程序补充完整。#include

2、#include#include#define ERROR 0#define OK 1#define STACK_INT_SIZE 10 /*存储空间初始分配量*/#define Queue_Size 20typedef int ElemType; /*定义元素的类型*/typedef struct char QdataQueue_Size; int front,rear;SeqQueue;typedef struct ElemType *base; ElemType *top; int stacksize; /*当前已分配的存储空间*/SqStack;SqStack OPTR, OPND;S

3、eqQueue SeQ;char PreTab77=, , , , ,x, ,front=0; Q-rear=0;int EnterQueue(SeqQueue *Q,char c) /*入队*/ if (Q-rear=Queue_Size) printf(n队列满,无法入队!n);return ERROR; Q-QdataQ-rear=c; Q-rear+; return OK;int OutQueue(SeqQueue *Q,char *e) /*出队*/ if(Q-front=Q-rear) printf(n队列空,无法出队!n);return ERROR; *e=Q-QdataQ-fr

4、ont+; return OK;int InitStack(SqStack *S) S-base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType); if(!S-base) return ERROR; S-top=S-base; S-stacksize=STACK_INT_SIZE; return OK;/*InitStack*/int Push(SqStack *S,ElemType e) if (S-top-S-base)STACK_INT_SIZE) return 0; *S-top=e; S-top+; return OK;int

5、Pop(SqStack *S) int e; if (S-top=S-base ) return 0; S-top-; e=*S-top; return *S-top;/判定c是否运算符,若是运算符则返回该运算符在运算符集中的位置,这样就能扫描优先/关系表,确定相邻运算符之间的优先级int IsOps(char c) int i=0; char *p; p=OpretorS; while( i=7) / 判定是否是运算符,若IsOps的值=7,则c是操作数 digit=c-0; / 将字符转换成相应的数值 Push(&OPND,digit); / 操作数入栈 EnterQueue(&SeQ,c

6、); / 操作数入队 c=*+ScanChar ; else c1=*(OPTR.top-1); switch ( Precede (c1,c) / 调用哪个函数 case : TheOp=Pop (&OPTR ); / 参与计算的运算符出栈 EnterQueue(&SeQ,TheOp); / 参与运算的运算符入队 b=Pop(&OPND); a=Pop(&OPND); Push(&OPND, Operate (a,TheOp,b); break; default: printf(n算术表达式错误!n) ; return ERROR ; printf(n算术表达式:%s -后缀表达式为:,Ex

7、press); while(SeQ.rear- SeQ.front!=0 ) / 将队列输出即为表达式的后缀形式 OutQueue(&SeQ,&c);printf(%c,c); printf(n其结果为:%d,Pop (& OPND ); / 输出表达式的值 return 0;2、修改上面的程序:要求通过键盘输入表达式,运行程序并纪录运行过程和结果,至少处理3个不同的表达式。第一次运行:第二次运行:第三次运行:三、实验小结与体会四、实验评分和标准1、(程序功能)程序调通并能实现基本的功能 50分2、(实验态度)事先准备充分,上机调试认真,程序功能完整 20分3、(实验报告)实验分析和总结报告认

8、真 30分五、教师评语补充试验(1)一、试验要求:修改试验初步中的源程序,使其能实现2位以上的整数的四则运算。二、说明与提示1、主要是增加实现拼数的功能。为实现拼数,可应用堆栈NumStack来存储当前的数字,若当前的字符不是数字,则弹出NumStack栈中的所有数字进行拼数。如1、2、3依次入栈,则弹出栈进行拼数:3121011010123。2、参考代码:if (IsOps(c)=7) / 判定是否是运算符,若IsOps的值=7,则c是操作数 digit=c-0; / 将字符转换成相应的数值 Push(&NumStack,digit); /数字入栈EnterQueue(&SeQ,n); /数

9、字入队 c=*+ ;else if (NumStack非空) 弹出NumStack中所有数字,进行拼数得到整数n; Push(&OPND,n); / 操作数n入栈 c1=*(OPTR.top-1);三、调试与运行过程要求至少3个以上的测试数据(必须含有错误表达式的测试数据)补充试验(2)一、试验要求: 编写一程序,实现对一个C语言源程序进行相关统计:1、 源程序共有多少行(包含注释行)lines。2、 编译预处理命令有几条。(行首为“”字符为编译预处理命令)commands。3、 忽略注释行。(行首为“/”,或包含在“/*”与“*/”之间的字符串)rems。4、 共有多少条语句;统计赋值语句、

10、for语句、while语句(包括do while语句)的个数。分别对应全局变量statements、asings;fors;whiles 二、说明与提示注意:必须确保读取的源程序语法是正确的。1、为了提高读文件的效率,可设置1K字节的缓冲区:char buffer1024,每次从文件读取1K个字符(一般较小的源文件就读1次)进行处理,直至文件结束。注意:打开文件的方式应该是“只读”方式。如: int fd,size; char buffer1024; fd=open(“e:/temp/my.c”,O_RDONLY); / 必须先准备好文件e:/temp/my.csize=read(fd,buf

11、fer,sizeof(buffer); / size为从文件中实际读取的字节数当然也可以用其它相关的文件操作函数,如fopen,更详细的例子请参阅C程序手册。2、Tab字符的ASCII值为0x09;换行回车的ASCII值为 0x0D、0x0A;空格ASCII值为 0x20。 这些字符作为单词的分隔符。3、以“;”结束的为语句,包括说明定义语句。 统计“;”个数不一定等于语句的个数,例如:for(i=0;in;i+) 同样“=”个数不一定等于赋值语句的个数,例如:if(i= =n)for(i=0;iMH”,“H-LSo” 预测分析表用二维数组M存储,每行表示某个非终结符,每列表示某个终结符,M数

12、组中的值仅存储产生式在数组Rules的序号即可。为确定非终结符与终结符在数组M的序号,可定义分别包含非终结符与终结符的字符集,如:Char *VN=“SHKLM”;Char *VT=“aodefb” /特别注意不能忘记 ,它作为分析的结束标志 分析过程使用堆栈Stack,注意堆栈的初始化,当进行推导时,产生式右部入栈的顺序为产生式的逆序。 注意 产生式的推导实质为直接将栈顶的非终结符出栈。 程序代码清单:运行结果:(至少2个不同测试数据,必须包含能得出正确和错误信息的数据)三、实验小结与体会要求:从实验准备、操作、运行结果和遇到问题、参考书查阅、解决办法等方面小结。四、评分标准1、进行LL(1

13、)文法判定,构造出LL(1)分析表 10分2、(程序功能)程序调通并能实现基本的功能 50分3、(实验态度)事先准备充分,上机调试认真,程序功能完整 20分4、(实验报告)实验分析和总结报告认真 20分 五、教师评语实验四 TINY语言的词法分析实现一、实验目的通过对样本语言TINY语言词法分析程序的设计和实现,使学生能进一步理解和掌握词法分析的原理和实现方法。二、预习与准备1、TINY语言语法定义的完整BNF 描述如下:2、TINY语言的单词和单词类别如下:保留字特殊符号其他IfThenElseEndRepeatUntilReadwrite+-*/=();:=数(一个或更多的数字) 标识符(

14、一个或更多的字母)从表中可知,TINY的单词为3个典型类型:保留字,特殊符号和“其他”单词。其他单词为“数”和“标识符”,数由一个或更多的数字组成,标识符由一个或更多的字母构成。除了单词之外,TINY语言还遵循如下的词法惯例:注释应放在花括号 内,且不可嵌套;代码应是自由格式;空白格由空格、制表符和换行符组成;最长子串原则后须接识别单词。 TINY语言的详细介绍请同学自己查阅相关资料。三、实验内容为样本语言TINY编写一个扫描器(词法分析程序)。1、画出TINY语言的确定性有穷自动机(DFA)。2、根据DFA,用C语言编写一个程序,程序的功能为:(1) 读入TINY语言编写的源程序;(2) 对

15、源程序进行分析,识别出一个一个的单词;(3) 打印出所有单词及单词类型。源程序清单:3、调试并运行: TINY语言编写的源程序清单: 运行及结果四、提示(建议采用状态转换表实现)1、它的DFA经修改后如下:2、TINY语言的状态转换表输入字符123456789状态编号空白格数字字符:=单个特殊字符其它字符接受状态START0023154555noINCOMMENT1111111115noINNUM2525555555noINID3553555555noINASSIGN4555555555noDONE5yes注1:词法分析只考虑单词的构造,不考虑语法。注2:该状态表采用3个数组存放。注3:相关数组如下:T数组Advence数组Accept数组五、实验小结与体会要求:从实验准备、操作、运行结果和遇到问题、参考书查阅、解决办法等方面小结。六、评分标准1、(实验准备)给出正确的确定性有穷自动机(DFA)。 10分2、(程序功能)程序调通并能实现基本功能。 50分3、(实验态度)事先准备充分,上机调试认真,程序功能完善。 20分4、(实验报告)实验分析和总结报告认真。 20分七、教师评语

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2