从无到有用Python创造一门属于自己的编程语言1

前言

如果你会编译原理,对其中的词法分析算法,语法分析算法足够了解,那么用什么语言来做这样的一件事情都是可以的,之所以使用Python只是因为本人会的编程语言中, Python的使用时间最长,也最得心应手。所谓性能什么的不在本文的考虑范围内, 本文主要重点是语法分析的表达式的解析,语法解析使用的是普拉特分析法,一种自顶向下的语法解析方法。

文章目录如下:

四则运算的问题
词法分析
语法分析与解释执行
参考链接
这有什么用
后记
源代码
四则运算的问题

怎么解决让代码算出以下解决结果?(假设问题代码保存文1.txt)

1 + 2 * 3 - 4 / 5
不用语法分析, 最简答的解决办法就是

with open(“1.txt”) as rf:
print(eval(rf.read()))

输出结果 6.2

那么如果是以下面的代码呢?(假设问题代码保存文2.txt)

add(1, add(1,2))
不用语法分析, 最简单的解决办法是

def add(a, b):
return a + b

with open(“2.txt”) as rf:
print(eval(rf.read()), dict(add=add))

输出结果

4 {‘add’: <function add at 0x0000013E8033AD90>}
如果要求加法的优先级大于乘法呢?就是说先加后乘,比如1+2*3=9而不是正常情况下的准确答案7。理论上可以通过重载python的加减乘除来解决这个问题,但是这里就不研究这个方法了,这个问题就留在文章的末尾解决吧。

PS: 怎么可能会有这么坑爹的需求?作为程序猿遇到的坑爹需求还少么?
总的来说上面的解决办法总是差点意思,我们没有更深入的研究它的语法结构,也就没办法获得更多的控制权。

词法分析

词法分析就是讲文本里面的代码分成一个个最小的组成部分, 这个最小的组成部分大家称之为Token.

什么是token呢?首先看下面的python代码。

1+2*3
如果通过词法分析处理,那么上面的代码大概是这样的表示

Token(“整型数字”, “1”) Token(“运算符”, “+”) Token(“整型数字”, 2) Token(“运算符”, “*”) Token(“整型数字”, “3”)
所以1,2,3分别是一个Token, +,*分别也是一个Token。

PS: 一个抽象的东西总喜欢用抽象的名词来解释。
语法定义

这里主要分析一种语法的结构。

四则运算的表达式
四则表达式虽然看起来很简单,但是应该算的上是编译原理中一个比较难的部分了吧,主要是算数优先级的问题。
首先定义基本组成元素:

数字: 只能由整型组成, 比如: 111, 123123
加减乘除: 分别对于符号 + - * /
四则运算的表达式定义如下:

  1. 数字
  2. 数字(加减乘除 数字)*

加减乘除代表±*/中的任意一个算术符, (加减乘除 数字)+代表+ 1或者 * 2 这样的结构能够重复一到无数次

比如: 1 或者 1 + 2 或者 1+2+3

PS: 对于这种语法的定义有一种专门的语法来表示,叫做BNF, 如果本文用BNF来说明就是两个问题了,所以这里就用中文来表示了。毕竟本文是从无到有系列,如果我的解释,定义看不懂可以学习一下BNF,在回来看应该就明白了。
所以本文中以下语法是合法的:

1+2-3*412/53
12
1-4
以下语法是不合法的:

1 +

  • 1
    1+2+
    实现原理

以下面代码为例。

1 + 2 - 3 * 4 / 5
通过对上面的语法定义,以及对代码的观察,我们可以总结出以下两点:

代码里面的空格对语法没有没有任何意义,所以我们应该

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值