python计算器模块_Python使用spark模块构造计算器
Spark简介
Spark 解析器与 EBNF 语法有一些共同之处,但它将解析/处理过程分成了比传统的 EBNF 语法所允许的更小的组件。Spark 的优点在于,它对整个过程中每一步操作的控制都进行了微调,还提供了将定制代码插入到过程中的能力。
Spark的最新版是10年前发布的,真是非常的长寿,可见设计精良。其中的采用的设计模式有Reflection Pattern、Visitor Pattern、Pipes and Filters Pattern和Strategy Pattern。
初识Spark
第一次知道Spark这个模块是在IBM的网站[3]上看到的。
第一次激起我学习这个模块的兴趣是在看Python源码的时候,发现Python的编译器是用The Zephyr Abstract Syntax Description Language(Parser/Python.asdl)来定义的语法,然后通过(Parser/asdl.py、Parser/asdl_c.py、Parser/spark.py)根据Parser/Python.asdl生成C语言解析器。其中仅用了1000多行就实现了一个yacc。这个是非常地强大。
计算器
对于计算器的构造,我们在上文中使用LL(1)递归下降的方法构造了一个。但是Spark更加强大,Spark是用Earley语法分析算法,能够解析所有的上下文无关文法,这比LL和LR要更强,当然代价是更慢。
我们来看用Spark实现的计算器:
python1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96#!/usr/bin/env python
# author: Hua Liang [ Stupid ET ]
# email: et@everet.org
# website: http://EverET.org
#
# Grammar:
# expr ::= expr addop term | term
# term ::= term mulop factor | factor
# factor ::= number | ( expr )
# addop ::= + | -
# mulop ::= * | /
from spark import GenericParser, GenericScanner
class Token(object):
def __init__(self, type, attr=''):
self.type = type
self.attr = attr
def __cmp__(self, o):
return cmp(self.type, o)
def __str__(self):
return self.type
def __repr__(self):
return str(self)
class SimpleScanner(GenericScanner, object):
def __init__(self):
GenericScanner.__init__(self)
def tokenize(self, input):
self.rv = []
GenericScanner.tokenize(self, input)
return self.rv
def t_whitespace(self, s):
r' \s+ '
pass
def t_op(self, s):
r' \+ | \- | \* | / | \( | \) '
self.rv.append(Token(type=s))
def t_number(self, s):
r' \d+ '
self.rv.append(Token(type='number', attr=s))
class ExprParser(GenericParser):
def __init__(self, start='expr'):
GenericParser.__init__(self, start)
def p_expr_term_0(self, (lhs, op, rhs)):
'''
expr ::= expr addop term
term ::= term mulop factor
'''
return eval(str(lhs) + str(op) + str(rhs))
def p_expr_term_factor_1(self, (v, )):
'''
expr ::= term
term ::= factor
'''
return v
def p_factor_1(self, (n, )):
' factor ::= number '
return int(n.attr)
def p_factor_2(self, (_0, expr, _1)):
' factor ::= ( expr ) '
return expr
def p_addop_mulop(self, (op, )):
'''
addop ::= +
addop ::= -
mulop ::= *
mulop ::= /
'''
return op
def scan(code):
scanner = SimpleScanner()
return scanner.tokenize(code)
def parse(tokens):
parser = ExprParser()
return parser.parse(tokens)
if __name__ == '__main__':
text = ' 7 + (1 + 3) * 5'
print parse(scan(text))
参考
[1] Language Implementation Patterns
[2] Compiling Little Languages in Python
python计算器模块_Python使用spark模块构造计算器相关推荐
- python 最好用的数据库模块_Python 使用pymysql模块操作数据库
Python 中操作 MySQL 步骤 看完了上面的这个操作流程,那么python操作数据库可以用上面模块来操作呢? 目前比较流行的就是pymysql,下面来看看介绍. pymysql介绍PyMySQ ...
- 简述python中怎样导入模块_Python中导入模块的两种模式,import
import import pandas import pandas as pd 使用函数方式:.(),或者.() 比如 pandas.read_csv("data/stock.csv&qu ...
- python必学的模块_Python常用的模块
模块和包 1.1模块介绍模块定义:一系列功能的集合体 模块使用: import导入模块 或者 from ... import... 导入模块 模块分类:内置模块 自定义模块 第三方模块 模块加载顺序: ...
- python的窗口处理模块_python的图像处理模块
除了opencv专门用来进行图像处理,可以进行像素级.特征级.语义级.应用级的图像处理外,python中还有其他库用来进行简单的图像处理,比如图像的读入和保存.滤波.直方图均衡等简单的操作,下面对这些 ...
- python安装os模块_python的os模块(ipython,文件,目录,权限,管理)
什么是os模块 os模块提供了多数操作系统的功能接口函数.当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编程时,经常和文件.目录打交道,这时就离不了o ...
- python psycopg2使用_Python中用psycopg2模块操作PostgreSQL方法
其实在Python中可以用来连接PostgreSQL的模块很多,这里比较推荐psycopg2.psycopg2安装起来非常的简单(pip install psycopg2),这里主要重点介绍下如何使用 ...
- python中自带的模块_python中的模块详解
概念 python中的模块是什么?简而言之,在python中,一个文件(以".py"为后缀名的文件)就叫做一个模块,每一个模块在python里都被看做是一个独立的文件.模块可以被项 ...
- python xlrd模块_python之xlrd模块
xlrd模块 一.xlrd模块 1.python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库,这两个适用于.xls格式有效 2. xlrd模块 ...
- c调用python第三方库_Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递...
在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件 ...
最新文章
- Coding-数组(Array)
- 前端学python有什么用-原来 Python 还有这些实用的功能和特点!
- 处理网络故障常用的命令
- 区块链BaaS云服务(21)腾讯CCGP”安全沙箱“
- 在ubuntu20.10上搭建SVN Server
- RabbitMQ学习之消息可靠性及特性
- 虚拟机测试必备虚拟机之VirtualBox 使用
- 李开复:21世纪7种人才最抢手
- ado.net mysql 事务_ADO.NET事务
- RedisTemplate常用集合使用说明-opsForSet(五)
- _declspec(naked) 使用
- 单电源运算放大器全波整流电路_电子电路识图从入门到精通,从零开始学电子电路...
- Hadoop技术内幕:深入解析YARN架构设计与实现原理pdf
- linux复制文件到另一台服务器
- 4月第3周业务风控关注 |国家网信办启动小众即时通信工具专项整治
- XP下免U盘安装Ubuntu 18.04(持续更新遇到的问题,20200422更新)
- keras中的K.gradients()函数
- 实现广电宽带电视网关单线复用IPTV的设置
- SkyWalking仪表盘
- 关于装有WIN7系统的硬盘转移到USB3.0移动硬盘盒后开机启动蓝屏(代码7B)的解决方案