基于PLY的解释器——实现了常见的语法

2023-12-06 21:32

本文主要是介绍基于PLY的解释器——实现了常见的语法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇博客是接着上两篇博客讲解的,

https://blog.csdn.net/shixiongtao/article/details/104059437

https://blog.csdn.net/shixiongtao/article/details/104071621。

首先给出代码的链接:https://download.csdn.net/download/shixiongtao/12119227。

程序分为,Lexer.py,Parser.py,Ast.py,和主程序run.py组成。

文件结构如下:

├── LearnPLY
│   ├── Ast.py
│   ├── Lexer.py
│   ├── parser.out
│   ├── Parser.py
│   └── parsetab.py
├── run_lexer.py
├── run.py
└── test.ply

Ast.py中定义了抽象语法树,Lexer.py定义了词法结构,Parser.py定义了语法结构,parser.out和parsetab.py是自动生成的文件,run_lexer.py是单独测试Lexer.py的程序,run.py是主程序,test.ply是待解释的程序。

首先来看Lexer.py文件:


###   导入包   ###
import ply.lex as lex###   是否打印详细信息   ###
LexerDebug = False###   定义词法解析类   ###
class Lexer(object):def __init__(self):self.lexer = lex.lex(object=self)def input(self, text):self.lexer.input(text)def token(self):return self.lexer.token()###   定义保留字,字典,静态变量   ###reserved = {'print': 'PRINT','if': 'IF','else': 'ELSE','for': 'FOR','while': 'WHILE','break': 'BREAK','continue': 'CONTINUE','and': 'AND','or': 'OR','return': 'RETURN'}###   定义token,静态变量   ###tokens = [#变量名'NAME',#整数,浮点数,字符串'INT', 'FLOAT', 'STRING',#加,减,乘,除,模,赋值'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MOD', 'ASSIGN',#(,),[,],{,}'LPAREN', 'RPAREN', 'LSQBRACK', 'RSQBRACK', 'LBRACK', 'RBRACK', #大于,大于等于,小于,小于等于,等于,不等于,真,假,空'GT', 'GTE', 'LT', 'LTE', 'EQ', 'NEQ', 'TRUE', 'FALSE', 'NONE',#冒号,分号,逗号,注释'COLON', 'SEMICOLON', 'COMMA', 'COMMENT',]###   将保留字和token合并到一块查询,静态变量   ###tokens = tokens + list(reserved.values())###   声明正则表达式,顺序代表了优先级,静态变量   ####省略空格t_ignore = ' \t'              #特殊符号,需要转义#t_PLUS = '\+'def t_PLUS(self, t):'\+'if LexerDebug == True: print('t_PLUS')return t#t_MINUS = '-'def t_MINUS(self, t):'-'if LexerDebug == True: print('t_MINUS')return t#特殊符号,需要转义#t_TIMES = '\*'def t_TIMES(self, t):'\*'if LexerDebug == True: print('t_TIMES')return t#t_DIVIDE = '/'def t_DIVIDE(self, t):'/'if LexerDebug == True: print('t_DIVIDE')return t#t_MOD = '%'def t_MOD(self, t):'%'if LexerDebug == True: print('t_DIVIDE')return t#特殊符号,需要转义#t_LPAREN = '\('def t_LPAREN(self, t):'\('if LexerDebug == True: print('t_LPAREN')return t#特殊符号,需要转义#t_RPAREN = '\)'def t_RPAREN(self, t):'\)'if LexerDebug == True: print('t_RPAREN')return t

这篇关于基于PLY的解释器——实现了常见的语法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/463414

相关文章

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与