基于ometa的python 3和python 2模式匹配语言
PyMeta3的Python项目详细描述
这是pymeta 0.5.0的一个分支,支持python 2和3。
安装
pip安装pymeta3
摘要
pymeta是面向对象模式匹配ometa的实现 Alessandro Warth开发的语言 (http://www.cs.ucla.edu/~awarth/ometa/)。pymeta提供了一个基于紧凑语法的 解析表达式文法(PEGS),用于常见的词法分析和句法分析 以一种易于为python推理的方式对活动进行树转换 程序员。
工作原理
pymeta将语法编译为python类,规则作为方法。这个 规则指定解析表达式,如果 他们成功地配对了。
基本语法
- foo ::= ....
- 定义名为foo的规则。
- expr1 expr2
- 匹配expr1,如果成功则匹配expr2,返回 表达式2。就像python的and。
- expr1 | expr2
- 尝试匹配expr1-如果失败,请改为匹配expr2。像Python一样 or.
- expr*
- 匹配表达式零次或多次,返回匹配列表。
- expr+
- 匹配表达式一次或多次,返回匹配列表。
- expr?
- 尝试匹配expr。如果不匹配,则返回“无”。
- ~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]