pPEG -- portable PEG in Python
Project description
pPEGpy
This is an implementation of a portable PEG parser in Python.
For documentation see pPEG, the portable PEG project.
The pPEGpy package can be installed from PyPi with:
> pip install pPEGpy
Note the spelling of pPEGpy, there are unrelated packages with similar names.
For other ways to use the pPEGpy grammar-parser see the Package Notes below.
Example
from pPEGpy import peg
sexp = peg.compile("""
sexp = _ list
list = '(' _ elem* ')' _
elem = list / atom _
atom = ~[() \t\n\r]+
_ = [ \t\n\r]*
""")
test = """
(foo bar (blat 42) (f(g(x))))
"""
p = sexp.parse(test)
print(p)
This prints a parse tree diagram:
list
│ atom 'foo'
│ atom 'bar'
│ list
│ │ atom 'blat'
│ │ atom '42'
│ list
│ │ atom 'f'
│ │ list
│ │ │ atom 'g'
│ │ │ atom 'x'
Application can use a ptree:
ptree = p.tree()
print(ptree) # =>
["list",[["atom","foo"],["atom","bar"],
["list",[["atom","blat"],["atom","42"]]],
["list",[["atom","f"],
["list",[["atom","g"],["atom","x"]]]]]]]
Another example:
from pPEGpy import peg
# Equivalent to the regular expression for well-formed URI's in RFC 3986.
pURI = peg.compile("""
URI = (scheme ':')? ('//' auth)? path ('?' query)? ('#' frag)?
scheme = ~[:/?#]+
auth = ~[/?#]*
path = ~[?#]*
query = ~'#'*
frag = ~[ \t\n\r]*
""")
test = "http://www.ics.uci.edu/pub/ietf/uri/#Related"
uri = pURI.parse(test)
print(uri)
URI
│ scheme 'http'
│ auth 'www.ics.uci.edu'
│ path '/pub/ietf/uri/'
│ frag 'Related'
ptree:
["URI",[["scheme","http"],["auth","www.ics.uci.edu"],
["path","/pub/ietf/uri/"],["frag","Related"]]]
Usage
Common usage:
from pPEGpy import peg
my_parser = peg.compile(""... my pPEG grammar rules...""")
# -- use my-parser in my application .......
my_parse = my_parser.parse('...input string...}')
if not my_parse.ok:
print(my_parse.err)
.... handle parse failure ...
else:
ptree = my_parse.tree()
process(ptree)
The ptree parse tree type is JSON data, as defined in pPEG.
Package Notes
To experiment you can clone the GitHub repository pPEGpy.
These command lines can be used to build a local package:
> cd <your pPEGpy directory>
> uv init --lib
> uv build
> pip install -e .
The -e option allows local editing of the local files.
The repo includes an examples/ folder, try running the date.py for example.
Bare File
The peg.py file in: pPEGpy/src/pPEGy/peg.py is the only file you really need.
If you put a copy of this file into a folder together with your own programs you can import the grammar-parser directly with import peg. Very simple and easy.
But that does not work across directories, to import the bare peg.py file from another directory requires a hack like this:
import sys
sys.path.insert(1, <path to your copy of peg.py>)
import peg
To avoid that (at the cost of all the Python packaging complications!) you can build a package pPEGpy and install it with pip, as above.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ppegpy-0.3.7.tar.gz.
File metadata
- Download URL: ppegpy-0.3.7.tar.gz
- Upload date:
- Size: 23.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
196333042fcc9f4cb29294e5189cf3829c906c7add5e45cf68a1cf424e53e1ba
|
|
| MD5 |
1aaafbab81c644665b8840a54ca48c01
|
|
| BLAKE2b-256 |
af8a76ff324b92a7bf4ee158feaafb5c219cdc16112ee1ff6e33521c1ac1bddb
|
File details
Details for the file ppegpy-0.3.7-py3-none-any.whl.
File metadata
- Download URL: ppegpy-0.3.7-py3-none-any.whl
- Upload date:
- Size: 11.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5e4d0ba24e28693457c109280bce6908bf5ecafff24e0544b6ca5b1a72f2994
|
|
| MD5 |
44c0d1afaa4c2cc7f894cd745d0af77a
|
|
| BLAKE2b-256 |
8f4d19355a04c97606e7a53137b9292f8799dbed8daf74c148cf4bf350cc812b
|