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模块构造计算器相关推荐

  1. python 最好用的数据库模块_Python 使用pymysql模块操作数据库

    Python 中操作 MySQL 步骤 看完了上面的这个操作流程,那么python操作数据库可以用上面模块来操作呢? 目前比较流行的就是pymysql,下面来看看介绍. pymysql介绍PyMySQ ...

  2. 简述python中怎样导入模块_Python中导入模块的两种模式,import

    import import pandas import pandas as pd 使用函数方式:.(),或者.() 比如 pandas.read_csv("data/stock.csv&qu ...

  3. python必学的模块_Python常用的模块

    模块和包 1.1模块介绍模块定义:一系列功能的集合体 模块使用: import导入模块 或者 from ... import... 导入模块 模块分类:内置模块 自定义模块 第三方模块 模块加载顺序: ...

  4. python的窗口处理模块_python的图像处理模块

    除了opencv专门用来进行图像处理,可以进行像素级.特征级.语义级.应用级的图像处理外,python中还有其他库用来进行简单的图像处理,比如图像的读入和保存.滤波.直方图均衡等简单的操作,下面对这些 ...

  5. python安装os模块_python的os模块(ipython,文件,目录,权限,管理)

    什么是os模块 os模块提供了多数操作系统的功能接口函数.当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编程时,经常和文件.目录打交道,这时就离不了o ...

  6. python psycopg2使用_Python中用psycopg2模块操作PostgreSQL方法

    其实在Python中可以用来连接PostgreSQL的模块很多,这里比较推荐psycopg2.psycopg2安装起来非常的简单(pip install psycopg2),这里主要重点介绍下如何使用 ...

  7. python中自带的模块_python中的模块详解

    概念 python中的模块是什么?简而言之,在python中,一个文件(以".py"为后缀名的文件)就叫做一个模块,每一个模块在python里都被看做是一个独立的文件.模块可以被项 ...

  8. python xlrd模块_python之xlrd模块

    xlrd模块 一.xlrd模块 1.python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库,这两个适用于.xls格式有效 2. xlrd模块 ...

  9. c调用python第三方库_Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递...

    在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也可以充分利用目前市面上各种第三方的DLL库函数,以扩充Python软件 ...

最新文章

  1. Coding-数组(Array)
  2. 前端学python有什么用-原来 Python 还有这些实用的功能和特点!
  3. 处理网络故障常用的命令
  4. 区块链BaaS云服务(21)腾讯CCGP”安全沙箱“
  5. 在ubuntu20.10上搭建SVN Server
  6. RabbitMQ学习之消息可靠性及特性
  7. 虚拟机测试必备虚拟机之VirtualBox 使用
  8. 李开复:21世纪7种人才最抢手
  9. ado.net mysql 事务_ADO.NET事务
  10. RedisTemplate常用集合使用说明-opsForSet(五)
  11. _declspec(naked) 使用
  12. 单电源运算放大器全波整流电路_电子电路识图从入门到精通,从零开始学电子电路...
  13. Hadoop技术内幕:深入解析YARN架构设计与实现原理pdf
  14. linux复制文件到另一台服务器
  15. 4月第3周业务风控关注 |国家网信办启动小众即时通信工具专项整治
  16. XP下免U盘安装Ubuntu 18.04(持续更新遇到的问题,20200422更新)
  17. keras中的K.gradients()函数
  18. 实现广电宽带电视网关单线复用IPTV的设置
  19. SkyWalking仪表盘
  20. 关于装有WIN7系统的硬盘转移到USB3.0移动硬盘盒后开机启动蓝屏(代码7B)的解决方案

热门文章

  1. 一个带时间的相册页面(仿小米相册)
  2. 超屌超搞笑的B-BOX街舞表演
  3. pytorch神经网络训练及测试流程代码
  4. 13渐变 过渡 动画 利用多张图片制作动图
  5. windows10飞行模式怎么关
  6. Java中的类(基础详解)
  7. Proteus仿真基于stm32的PM2.5报警器
  8. 深圳辉煌通讯3.8折销售移动联通充值卡及手机
  9. android 各大厂商型号手机本地录音路径
  10. 2020再也不见,2021与你相约!