目录
一、介绍
这个是编译原理课程学习期间的其中一个实验内容,当时实验的时候没来得及做界面(主要因为当时还不会做GUI,也没时间学习)。最近心血来潮,想学习一下PyQt5,就拿当时的实验练练手。
当时使用C++实现的功能,由于C++的Qt个人感觉比较麻烦,不如PyQt简洁(个人看法),就将程序用python改写,然后使用PyQt5将程序进行可视化展示。
二、效果展示
首先先来看一下我实现的词法分析器的整体效果。
初始状态:
可以看出,词法分析器主要由三部分组成,左边是一个源程序展示以及编辑区域,右边是词法分析结果展示区,上方是选取源程序文件的部分。
进行词法分析之后 :
词法分析的结果以表格的形式展示,看起来比较规整。
当然还有一些异常处理的情况,在此就不再展示了。
三、设计要求
这个实验所要实现功能的具体要求(这样大家可以按需进行参考):
用 C++/VB/JAVA/Python 语言实现对 C++ 语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示 ;同时进行标识符登记符号表的管理。以下是实现词法分析设计的主要工作:
- 从源程序文件中读入要进行此法分析的程序段;
- 统计行数和列数用于错误单词的定位;
- 删除空格类字符,包括回车、制表符空格;
- 按拼写单词(关键字、标识符、常数、算术运算符、赋值运算符、关系运算符、分界符号),并用(内码,属性)二元式表示;
- 如果发现错误则报告出错;
- 根据需要是否填写标识符表以及常数表供以后各阶段使用;
四、基本功能实现的思路
总体思想是使用python面向对象的编程思想,将词法分析用到的一些数据以及函数功能封装成一个词法分析器类(Lexical),在此基础上进行词法分析器的设计。下面是词法分析器类数据的存储结构以及核心算法的描述。
1、数据结构
实际上python对于数据的存储形式的选择相比于C++自由很多,但还是简单介绍一下。
① 首先是源程序段的存放:将读取到的程序段全部存放在一个字符串(名为__buffer)中,以便后续处理;
② 然后是词法过程中使用到的一些必要的参数:我分别选取了部分常用的关键字、分界符、算术运算符、关系运算符、赋值运算符,并将这些分门别类地存放在不同的列表中(列表处理这些问题已经足够了);
③ 接着是将源程序处理之后得到的单词的存放:词法分析的任务就是对源程序段进行扫描分解,得到一个个的单词缓存。我将扫描处理之后的单词缓存按照其位于源程序的行、列位置存放在一个二维列表(名为__instring_lst)中。
下面是程序中的数据结构的初始化:
self.__keyword_lst = ["if", "else", "while", "signed", 'throw', "union", "this",
"int", "char", "double", "unsigned", "const", "goto", "virtual",
"for", "float", "break", "auto", "class", "operator", "case",
"do", "long", "typedef", "static", "friend", "template", "default",
"new", "void", "register", "extern", "return", "enum", "inline",
"try", "short", "continue", "sizeof", "switch", "private", "protected",
"asm", "while", "catch", "delete", "public", "volatile", "struct",
"include", "main"]
self.__delimiter_lst = [',', ';', '(', ')', '[', ']', '{', '}', '\'', '"'] # 分界符列表
self.__arith_oper_lst = ['+', '-', '*', '/', '%']
self.__relation_oper_lst = ["<", "<=", "==", ">", ">=", "<>"]
self.__assign_oper_lst = ["=", "+=", "-=", "*=", "/=", "%="]
self.__buffer = "" # 存放待处理的程序段
self.__instring_lst = [[]] # 输入源程序的单词缓存
去年编译原理课程实验,后来一直没时间写完……有需要的可私信哦