基于ometa的模式匹配语言
PyMeta的Python项目详细描述
摘要
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]