编译原理实验之词法分析器的设计实现(含可视化界面)——part1:基本功能实现

目录

一、介绍

二、效果展示

三、设计要求

四、基本功能实现的思路

        1、数据结构


一、介绍

        这个是编译原理课程学习期间的其中一个实验内容,当时实验的时候没来得及做界面(主要因为当时还不会做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 = [[]]  # 输入源程序的单词缓存

去年编译原理课程实验,后来一直没时间写完……有需要的可私信哦

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值