简单易用的解析和模式匹配。
项目描述
您可以在以下位置阅读更多文档: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匹配,则失败。不消耗任何输入。
- ruleName 或 ruleName(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]
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。