跳转到主要内容

基于OMeta的模式匹配语言

项目描述

摘要

PyMeta是OMeta的一个实现,由Alessandro Warth开发(http://www.cs.ucla.edu/~awarth/ometa/)的一个面向对象模式匹配语言。PyMeta提供了一个紧凑的语法,基于解析表达式文法(PEGs),用于Python程序员在常见词法、解析和树转换活动中的推理。

工作原理

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

基本语法

foo ::= ....

定义一个名为foo的规则。

expr1 expr2

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

expr1 | expr2

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

expr*

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

expr+

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

expr?

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

~expr

如果输入中的下一个项匹配expr,则失败。

<ruleName>

调用规则ruleName

'x'

匹配字面字符‘x’。

expr:name

将expr的结果绑定到本地变量name

=> pythonExpression

评估给定的Python表达式并返回其结果。

支持与Python注释相同的注释,以#开头,延伸到行尾。

接口

定义新语法的起点是 pymeta.grammar.OMeta.makeGrammar,它接受一个语法定义以及其嵌入表达式的变量绑定字典,并生成一个Python类。语法可以像通常一样进行子类化,并且可以在这些类上调用makeGrammar来覆盖规则并添加新的规则。要调用语法规则,请使用语法对象的名字调用 grammarObject.apply()

示例用法

>>> from pymeta.grammar import OMeta
>>> exampleGrammar = """
ones ::= '1' '1' => 1
twos ::= '2' '2' => 2
stuff ::= (<ones> | <twos>)+
"""
>>> Example = OMeta.makeGrammar(exampleGrammar, {})
>>> g = Example("11221111")
>>> result, error = g.apply("stuff")
>>> result
[1, 2, 1, 1]

项目详情


下载文件

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

源分发

PyMeta-0.5.0.tar.gz (28.9 kB 查看哈希值)

上传时间

由以下支持