编译原理课程设计 - 算符优先分析法研究 - 附源程序(3)

2025-06-24

图5-3 测试用例2运行截图

5.3 测试用例3

测试目的:读入一个文法,判断该文法不是算符优先文法。

读入一个非算符优先文法进行分析,给出文件路径:D:\\\\courses\\\\C_source_file\\\\成品\\\\非算符优先文法1.txt。运行结果如下:

10

图5-4 测试用例3运行截图

5.4 测试用例4

测试目的:输入一个非算符文法,判断该文法不是算符文法。

图5-5 测试用例4运行截图

读入一个非算符文法,给出路径:D:\\\\courses\\\\C_source_file\\\\成品\\\\非算符文法.txt。运行结果如下:

11

课程设计报告

6 结论和展望

结论

本次实验我们基本完成了实验题目的要求。求出了一个文法中每一个非终结符的FIRSTVT集和LASTVT集,画出算符优先关系表,并判定出给定的文法是否是算符优先文法。当给定一个符号串时,能够判定是否是文法中的句子,并能够将分析过程打印出来。通过算符优先分析方法,可以对任意一个文法进行自底向上的分析。同时,算符优先分析法也存在不足之处,由于忽略文法中的非终结符,会将本不属于文法的句子正确规约,从而引起错误。

展望

本次实验完成了题目的要求,准确把握了将文法通过读文件形式、手动输入分析字符串的题目要求,并在满足要求的基础上进行了创新,添加了对算符文法的判断功能。实验中,小组成员的分工与合作充分体现了软件工程的思想。需求分析理解准确,小组成员任务明确,统一函数头、参数,各自完成分内工作,整合工作快速、高效。

同时,实验中还存在很多不足。调试程序中的错误占用了大部分时间,以至于没有考虑使用界面展示结果。虽然使用C++开发工具,但实质上还是在使用C编代码。在今后的实践中还需注意。

学习编译技术课程的体会和对本门课程的评价

在上编译课的时候,小组成员都觉得自己对算符优先文法已经掌握了,但等真正用程序去实现时,才发现有很多细节我当时没有注意到。也正以为没有注意到这些细节,导致成员们编程时会出现各种错误,大部分都是在循环时下标或者循环次数的控制上出错。在进行到一定阶段后发现犯的低级错误越来越少了,对算符优先文法也愈发的吃透了,编程水平也有了进一步的提高。

编译原理如果要深入研究,那会是一门非常深奥的学问,对于现阶段只有60多学时的本科生来说,只能涉及到它一些最基本的原理,和最宏观的方法,要想微观的去研究,还需要在以后的时间里去钻研。在这次实验中,小组成员也只是用高级语言模拟了编译的一个小方法,在完成实验的过程中,小组成员对编译原理有了进一步的了解,更提高了动手编程能力,是一次经验和知识的积累。

7 参考文献

[1] 张素琴.编译原理(第2版)[M]. 北京:清华大学出版社,2005.6,102-121.

12

课程设计报告

[2] 陈维兴.C++面向对象程序设计教程[M]. 北京:清华大学出版社,2004.8,258-272.

8 源代码

#include #include #include #define row 50 #define col 50 #define SIZE 50

//两个重要结构体的定义

//FIRSTVT表或LASTVT表中一个表项(A,a)结构体的初始化 typedef struct { char nonterm; //非终结符 char term; //终结符 }StackElement;

//存放(A,a)的栈的初始化 typedef struct { StackElement *top; StackElement *bottom; int stacksize; }stack;

//初始化(A,a)栈 void InitStack(stack &S) {

S.bottom = new StackElement[SIZE]; if(!S.bottom) cout<<\存储空间分配失败!\ S.top = S.bottom; S.stacksize = SIZE; }

//判断(A,a)栈是否为空 bool ifEmpty(stack S) { if(S.top==S.bottom) return true; //如果栈为空,则返回true else return false; //否则不为空,返回false }

13

课程设计报告

//插入栈顶(A,a)元素

void Insert(stack &S,StackElement e) { if(S.top-S.bottom>=S.stacksize) cout<<\栈已满,无法插入!\ else { S.top->nonterm=e.nonterm; S.top->term=e.term; S.top++; } }

//弹出栈顶(A,a)元素 StackElement Pop(stack &S) { StackElement e; e.nonterm = '\\0'; e.term = '\\0'; if(S.top==S.bottom) { cout<<\栈为空,无法进行删除操作!\ return e; } else { S.top--;

e.nonterm=S.top->nonterm; e.term=S.top->term; return e; } }

//终结符与非终结符的判断函数(布尔类型) bool TerminalJud(char c) { if(c>='A'&&c<='Z') return false; //非终结符返回false else return true; //终结符返回true }

//判断非终结符在first表中是否已存在

bool ItemJud(char first[][col],int frist_len,char C)

14


编译原理课程设计 - 算符优先分析法研究 - 附源程序(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:大班语言活动《相反词聚会》

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219