PyMeta3
A Pattern-Matching Language Based on Python
This is a fork of PyMeta 0.5.0 that supports Python 2 and 3.
Installation
pip install PyMeta3
Summary
PyMeta is an implementation of OMeta, an object-oriented pattern-matching language developed by Alessandro Warth (http://www.cs.ucla.edu/~awarth/ometa/). PyMeta provides a compact syntax based on Parsing Expression Grammars (PEGs) for common lexing, parsing and tree-transforming activities in a way that’s easy to reason about for Python programmers.
How It Works
PyMeta compiles a grammar to a Python class, with the rules as methods. The rules specify parsing expressions, which consume input and return values if they succeed in matching.
Basic syntax
- foo ::= ....
Define a rule named foo.
- expr1 expr2
Match expr1, and then match expr2 if it succeeds, returning the value of expr2. Like Python’s and.
- expr1 | expr2
Try to match expr1 — if it fails, match expr2 instead. Like Python’s or.
- expr*
Match expr zero or more times, returning a list of matches.
- expr+
Match expr one or more times, returning a list of matches.
- expr?
Try to match expr. Returns None if it fails to match.
- ~expr
Fail if the next item in the input matches expr.
- <ruleName>
Call the rule ruleName.
- 'x'
Match the literal character ‘x’.
- expr:name
Bind the result of expr to the local variable name.
- => pythonExpression
Evaluate the given Python expression and return its result.
Comments like Python comments are supported as well, starting with # and extending to the end of the line.
Interface
The starting point for defining a new grammar is pymeta.grammar.OMeta.makeGrammar, which takes a grammar definition and a dict of variable bindings for its embedded expressions and produces a Python class. Grammars can be subclassed as usual, and makeGrammar can be called on these classes to override rules and provide new ones. To invoke a grammar rule, call grammarObject.apply() with its name.
Example Usage
>>> 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]
Metadata
Release files for PyMeta3 0.5.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| PyMeta3-0.5.1.tar.gz | 29.6 kB | Without provenance | Details for PyMeta3-0.5.1.tar.gz |
Release files / PyMeta3-0.5.1.tar.gz
| Download URL | PyMeta3-0.5.1.tar.gz |
|---|---|
| Size | 29.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
18bda326d9a9bbf587bfc0ee0bc96864964d78b067288bcf55d4d98681d05bcb
|
|
BLAKE2b-256 checksum How to use checksums |
ceaf409edba35fc597f1e386e3860303791ab5a28d6cc9a8aecbc567051b19a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Security for PyMeta3 0.5.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.