接下来的几篇文章应该都是与编译原理相关的~感谢大家阅读!代码用的是MFC,框架简单上手快,还是大二数据结构课设的时候助教教的,很实用。笔者水平有限,大家觉得没什么用那就权当开心一下了。O(∩_∩)O哈哈~
PS:代码真的很简单,因为当时老师要求手写这个过程所以就放上来了。有什么不对的地方还请批评指正,谢谢~
一、实验目标
1、了解形式语言与自动机理论在计算机中的应用。
2、了解计算机对语言的处理方式,并能掌握自下而上语法分析的原理。
3、在上述基础上,编写基于算符优先文法的语法分析器。这里我实现了对通用算符优先文法的识别(即大写字母+终结符形式)。
二、总体设计
1. 功能设计及原理说明
1.1 实验原理
(1).编译程序
(2)语法分析的用处和要点
语法分析基于词法分析,并对识别出来的单词的形式进行分析。正确的语法分析保证程序能往下执行。算符优先文法的语法分析的要点在于构造非终结符的FirstVT和LastVT以及优先关系表,然后根据优先关系表对产生式进行规约。
1.2 功能模块
(1)预处理模块
该部分主要是从文本文件中读入文法,完成对多余空格和回车的处理,并初始化各表。
(2)求First和follow集合
该部分主要是完成对文法的每个产生式求First和Follow集合,其中我对这部分数据结构进行设计,用简单的递归函数即可实现求解。
(3)求优先关系表
该部分算法来自课本《编译原理 第三版》(陈火旺著),没有做大的改动。以下内容来自老师的PPT,写的很详细,直接摘过来了,感谢老师!
(4)算符优先文法的规约
该部分算法来自课本《编译原理 第三版》(陈火旺著)没有做大的改动。
2. 类的设计
#pragma once
三、测试/调试过程
1. 调试环境
Visual Studio 2103professional 的集成开发环境,图形界面主要是利用MFC来完成。
2. 调试过程
由于在MFC里把所有的操作函数和操作对象都定义成了CLAN类,所以只需分别调试每个类函数即可。最后调用Main_Function()函数处理整个流程即可。
3. 使用流程
注:由于编译后的动态链接库太大,我就删除了,只留了代码、可执行文件和测试程序。
(1)双击打开运行程序出现如下界面。
(2)点击选择文法按钮,选择预处理的文件。(注:此处为.txt类型,可在测试文法文件夹下选取,也可随意添加)。可返回是否算符优先文法。
特别注意:文件中需要识别的输入文法必须以;结束,否则不能正常处理
(3)点击求表格一栏,如果预处理返回该算法是算符优先文法的话可以求出FirstVT/LastVT以及优先关系表。
(4)输入以‘#’结尾的表达式判断是否算符优先文法。
不满足的情况。
四、结论
1、本次语法分析完成了对算符优先文法的判断处理,以及对符号串是否算符优先文法的规约过程。
2、程序的输入为文本文件,可以处理输入多个空格和回车的文法,要求输入文件最后添加;作为文本结束标志
3、输入规约字符串时要求加上#作为结束标志。
3、经测试后本程序在上述条件下正确。
总结:该语法分析器能完成算符优先文法的识别,对于矩阵并没有完全利用所有单元,而是从标号1开始,0作为辅助判断标志位,使得存储结构更合理。
五、参考资料
完成本次实验主要用到的参考资料目录如下所示:
[1]陈火旺﹒《编译原理》(第三版)﹒国防工业出版社
[2]谭浩强.《C++程序设计》(第二版).北京:清华大学出版社,2014-4
[3]严蔚敏,吴伟民.《数据结构》(C语言版).北京:清华大学出版社,2015-5
[4]侯俊杰.《深入浅出MFC》(第二版).武汉.华中科技大学出版社.2002-9
[5]姚领田.《精通MFC程序设计》.北京.人民邮电出版社.2005
You can get all my code on my github.
KristinKong/CompileTheory-SyntaxAnalysisgithub.com