跳转到主要内容

简单易用的解析和模式匹配。

项目描述

您可以在以下位置阅读更多文档:http://parsley.readthedocs.org/en/latest/

摘要

Parsley是一个解析库,适合那些觉得解析器令人畏惧或烦恼的人。我编写它是因为我想解析一种编程语言,而像PLY、ANTLR或Bison这样的工具很难理解且难以集成到我的Python代码中。大多数解析生成器都是基于LL或LR解析算法,这些算法编译成大的状态机表。这就像我必须唤醒大脑的不同部分来理解或处理语法规则一样。

Parsley与pyparsing和ZestyParser一样,使用PEG算法,因此语法规则中的每个表达式都像Python表达式一样工作。特别是,备选方案按顺序评估,与yacc、bison或PLY之类的表驱动解析器不同。

欧米茄(OMeta)是亚历山德罗·瓦尔特开发的一种面向对象的模式匹配语言,由Parsley实现。更多信息,请参阅瓦尔特的博士论文,其中详细描述了OMeta:[http://www.vpri.org/pdf/tr2008003_experimenting.pdf](http://www.vpri.org/pdf/tr2008003_experimenting.pdf)。

工作原理

Parsley将语法编译为Python类,规则作为方法。规则指定解析表达式,如果成功匹配,则消耗输入并返回值。

基本语法

foo = ....:

定义一个名为foo的规则。

expr1 expr2:

匹配expr1,如果成功,则匹配expr2,返回expr2的值。类似于Python中的and

expr1 | expr2:

尝试匹配expr1 — 如果失败,则匹配expr2。类似于Python中的or

expr*:

匹配expr零次或多次,返回匹配项的列表。

expr+:

匹配expr一次或多次,返回匹配项的列表。

expr?:

尝试匹配expr。如果匹配失败,则返回None

expr{n, m}:

至少匹配expr n 次,不超过m 次。

expr{n}:

精确匹配expr n 次。

~expr:

负向先行断言。如果输入中的下一个项与expr匹配,则失败。不消耗任何输入。

~~expr:

正向先行断言。如果输入中的下一个项不与expr匹配,则失败。不消耗任何输入。

ruleNameruleName(arg1 arg2 etc)

调用规则ruleName,可能带有参数。

'x':

匹配字面字符'x'。

<expr>:

返回由匹配expr所消耗的字符串。适用于令牌化规则。

expr:name:

将expr的结果绑定到局部变量name

-> pythonExpression:

评估给定的Python表达式并返回其结果。也可以在括号中使用!

!(pythonExpression):

将Python表达式作为操作调用。

?(pythonExpression):

如果Python表达式为假,则失败,否则返回True。

支持像Python注释一样的注释,从#开始,延伸到行尾。

接口

定义新语法的起点是parsley.makeGrammar(grammarSource, bindings),它接受语法定义和一个字典,该字典包含嵌入式表达式的变量绑定,并生成一个Python类。语法可以像通常一样被继承,可以调用这些类上的makeGrammar来覆盖规则并提供新的规则。语法规则作为方法公开。

示例用法

from parsley import makeGrammar
exampleGrammar = """
ones = '1' '1' -> 1
twos = '2' '2' -> 2
stuff = (ones | twos)+
"""
Example = makeGrammar(exampleGrammar, {})
g = Example("11221111")
result = g.stuff()
print result

[1, 2, 1, 1]

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

Parsley-1.3.tar.gz (99.6 kB 查看散列)

构建分发

Parsley-1.3-py2.py3-none-any.whl (88.9 kB 查看散列值)

上传于 Python 2 Python 3

由以下支持