位置: 编程技术 - 正文

使用Python编写一个最基础的代码解释器的要点解析(如何用python编写一个程序)

编辑:rootadmin

推荐整理分享使用Python编写一个最基础的代码解释器的要点解析(如何用python编写一个程序),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python编写程序1-3+5-7+...+101,如何用python编写,编写一个python,用python编写一个函数,python编写程序1-3+5-7+...+101,编写一个python,用python语言编写,编写一个python,内容如对您有帮助,希望把文章链接给更多的朋友!

一直以来都对编译器和解析器有着很大的兴趣,也很清楚一个编译器的概念和整体的框架,但是对于细节部分却不是很了解。我们编写的程序源代码实际上就是一串字符序列,编译器或者解释器可以直接理解并执行这个字符序列,这看起来实在是太奇妙了。本文会用Python实现一个简单的解析器,用于解释一种小的列表操作语言(类似于python的list)。其实编译器、解释器并不神秘,只要对基本的理论理解之后,实现起来也比较简单(当然,一个产品级的编译器或解释器还是很复杂的)。这种列表语言支持的操作:

对应输出:

编译器和解释器在处理输入字符流时,基本上和人理解句子的方式是一致的。比如:

如果初学英语,首先需要知道各个单词的意思,然后分析各个单词的词性,符合主-谓-宾的结构,这样才能理解这句话的意思。这句话就是一个字符序列,按照词法划分就得到了一个词法单元流,实际上这就是词法分析,完成从字符流到词法单元流的转化。分析词性,确定主谓宾结构,是按照英语的语法识别出这个结构,这就是语法分析,根据输入的词法单元流识别出语法解析树。最后,再结合单词的意思和语法结构最后得出这句话的意思,这就是语义分析。编译器和解释器处理过程类似,但是要略微复杂一些,这里只关注解释器:

使用Python编写一个最基础的代码解释器的要点解析(如何用python编写一个程序)

我们只是实现一个很简单的小语言,所以不涉及到语法树的生成,以及后续复杂的语义分析。下面我就来看看词法分析和语法分析。词法分析和语法分析分别由词法解析器和语法解析器完成。这两种解析器具有类似的结构和功能,它们都是以一个输入序列为输入,然后识别出特定的结构。词法解析器从源代码字符流中解析出一个一个的token(词法单元),而语法解析器识别出子结构和词法单元,然后进行一些处理。可以通过LL(1)递归下降解析器实现这两种解析器,这类解析器完成的步骤是:预测子句的类型,调用解析函数匹配该子结构、匹配词法单元,然后按照需要插入代码,执行自定义操作。这里对LL(1)做简要介绍,语句的结构通常用树型结构表示,称为解析树,LL(1)做语法解析就依赖于解析树。比如:x = x +2;

在这棵树中,像x、=和2这样的叶节点,称为终结节点,其他的叫做非终结节点。LL(1)解析时,不需要创建具体的树型数据结构,可以为每个非终结节点编写解析函数,在遇到相应节点时进行调用,这样就可以通过解析函数的调用序列中(相当于树的遍历)获得解析树的信息。在LL(1)解析时,是按照从根节点到叶节点的顺序执行的,所以这是一个“下降”的过程,而解析函数又可以调用自身,所以是“递归”的,因此LL(1)又叫做递归下降解析器。LL(1)中两个L都是left-to-right的意思,第一个L表示解析器按从左到右的顺序解析输入内容,第二个L表示在下降过程中,也是按照从左到右的顺序遍历子节点,而1表示根据1个向前看单元做预测。下面看一下列表小语言的实现,首先是语言的文法,文法用于描述一个语言,算是解析器的设计说明书。

这是用DSL描述的文法,其中大部分概念和正则表达式类似。"a|b"表示a或者b,所有以单引号括起的字符串是关键字,比如:print,=等。大写的单词是词法单元。可以看到这个小语言的文法还是很简单的。有很多解析器生成器可以自动根据文法生成对应的解析器,比如:ANTRL,flex,yacc等,这里采用手写解析器主要是为了理解解析器的原理。下面看一下这个小语言的解释器是如何实现的。首先是词法解析器,完成字符流到token流的转换。采用LL(1)实现,所以使用1个向前看字符预测匹配的token。对于像INT、ID这样由多个字符组成的词法规则,解析器有一个与之对应的方法。由于语法解析器并不关心空白字符,所以词法解析器在遇到空白字符时直接忽略掉。每个token都有两个属性类型和值,比如整型、标识符类型等,对于整型类型它的值就是该整数。语法解析器需要根据token的类型进行预测,所以词法解析必须返回类型信息。语法解析器以iterator的方式获取token,所以词法解析器实现了next_token方法,以元组方式(type, value)返回下一个token,在没有token的情况时返回EOF。

运行这个程序,可以得到源代码:

对应的token序列:

接下来看一下语法解析器的实现。语法解析器的的输入是token流,根据一个向前看词法单元预测匹配的规则。对于每个遇到的非终结符调用对应的解析函数,而终结符(token)则match掉,如果不匹配则表示有语法错误。由于都是使用的LL(1),所以和词法解析器类似, 这里不再赘述。

运行代码便会得到之前介绍中的输出内容。这个解释器极其简陋,只实现了基本的表达式操作,所以不需要构建语法树。如果要为列表语言添加控制结构,就必须实现语法树,在语法树的基础上去解释执行。

举例讲解Python编程中对线程锁的使用 锁python的内置数据结构比如列表和字典等是线程安全的,但是简单数据类型比如整数和浮点数则不是线程安全的,要这些简单数据类型的通过操作,就

在Python中通过threading模块定义和调用线程的方法 定义线程最简单的方法:使用target指定线程要执行的目标函数,再使用start()启动。语法:classthreading.Thread(group=None,target=None,name=None,args=(),kwargs={})group恒

Python中的变量和作用域详解 作用域介绍python中的作用域分4种情况:L:local,局部作用域,即函数中定义的变量;E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函

标签: 如何用python编写一个程序

本文链接地址:https://www.jiuchutong.com/biancheng/386204.html 转载请保留说明!

上一篇:Python中使用bidict模块双向字典结构的奇技淫巧(python bilt)

下一篇:举例讲解Python编程中对线程锁的使用(运用python编写程序)

  • 积分抵现是什么意思
  • 暂估冲回账务处理
  • 税票百分之十三怎么算
  • 企业所得税完税凭证在哪里打印
  • 负债表内容
  • 营改增之后对企业的影响
  • 差旅费报销单属于什么凭证?
  • 承租人融资租赁设备长期应付款包括租赁资产担保余值
  • 定货合同有法律效力吗?
  • 工程个人所得税扣除标准是多少
  • 什么公司不需要融资
  • 公司给员工的商业保险
  • 企业所得税报表模板
  • 销售给个人的货款要走公户吗
  • 给行政事业单位扣缴义务人的一封信
  • 我的初级备考日记--你都没坚持,还谈什么未来
  • 房地产所得税税负率计算公式
  • 公司账务审计费用取费标准
  • 出售股权收入会计分录
  • 电脑上不了网怎么安装网卡驱动
  • 后裔王者荣耀台词大全
  • 金税盘减免税款可以抵扣销项税吗
  • 视频监控维护
  • 在境外缴纳的增值税税率
  • 一般纳税人和小规模纳税人的区别
  • win10开发工具在哪
  • php实现上传图片到数据库
  • linux的命令行指的是什么
  • macos big sur 怎么样
  • 俄勒冈州邮编
  • wordpress更改字体
  • 二级资本债记哪个科目
  • ctfmon.exe文件在哪
  • 基建会计和建筑会计的区别
  • 赤狐,荷兰 (© Wim Weenink/Minden Pictures)
  • 企业的留存收益可以抵税吗
  • 计提消费税的会计科目
  • vue.js前端
  • 大数据相关框架
  • packet命令
  • 小型微利企业税收
  • 人力资源增加什么资金积累
  • 装修店面装修费的会计分录
  • 股权转让会计分录摘要怎么写
  • 开具红字增值税专用发票信息表在哪
  • 固定资产的弃置费用
  • 残保金的滞纳金怎么算
  • 票据承兑和贴现是指
  • 收到现金存款
  • 搬迁补偿款的会计分录
  • 一般纳税人商贸公司增值税税负率
  • 核定征收的企业需要汇算清缴吗
  • 评估价值高于账面价值怎么账务处理
  • 利息支出应计入什么科目
  • 预付账款可以开发票吗
  • 溢价交易和折价交易
  • 固定资产计提折旧的会计科目
  • 开公司合理避税的方法
  • 支付宝扣手续费是怎么回事
  • 房地产企业会计处理实务
  • centos 安装
  • win8热点设置
  • 如何避免系统性风险
  • win10系统无法更改
  • centos6 grub
  • suse linux教程
  • 使用 WinSCP 管理 Linux VPS/服务器上的文件 图文教程
  • Win10预览版更新弹窗如何关闭
  • unity做app开发
  • 基于个人同意处理个人信息的个人什么撤回其同意
  • android遇到的难题,怎么解决的
  • 学习计划
  • javascript的
  • 引用javascript外部脚本的正确写法
  • git pull could not read from remote repository
  • python数据结构与算法题库
  • python极简讲义pdf
  • jquery 插件写法
  • js如何判断是否有定时器功能并清除
  • 国家税务总局一个月多少钱
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设