Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ppegpy-0.3.5.tar.gz (23.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ppegpy-0.3.5-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

Details for the file ppegpy-0.3.5.tar.gz.

File metadata

  • Download URL: ppegpy-0.3.5.tar.gz
  • Upload date:
  • Size: 23.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.4

File hashes

Hashes for ppegpy-0.3.5.tar.gz
Algorithm Hash digest
SHA256 bf175db7e21c4bde7bb98e534d1630bbdf03d11f79dd5789e3e0e3b83511fec1
MD5 e6a73673588f8e046897dd7eeef93776
BLAKE2b-256 a5f64c2b1dd6a1eaea657e92356ba2343d411bc20840ece0dacf3a8a5b269433

See more details on using hashes here.

File details

Details for the file ppegpy-0.3.5-py3-none-any.whl.

File metadata

  • Download URL: ppegpy-0.3.5-py3-none-any.whl
  • Upload date:
  • Size: 10.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.4

File hashes

Hashes for ppegpy-0.3.5-py3-none-any.whl
Algorithm Hash digest
SHA256 bc9d1a1ade091a33ff46241b4b4679f8933775da2db5f935e85e6c084c073dae
MD5 c000749c415ae7a33749a288c1334456
BLAKE2b-256 c0b29645cc545bca7a1d1e55a5fb9047d0cc2d195c6989ca1cf50dc5263470f1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page