Skip to main content

LR(1) parsing framework for Python

Project description

PTK - (c) Jérôme Laheurte 2015

What is PTK ?

PTK is a LR(1) parser “generator” for Python. It is not actually a “generator” in the sense that it doesn’t output source code, using Python’s dynamic nature to build everything it needs at runtime instead. Also, it supports asynchronous parsing; see the API documentation for details.

This code is licensed under the GNU LGPL version 3.

Supported platforms

All unit tests pass on the following platforms/Python version:

Linux

OSX

Windows

2.7

X

X

X

3.2

X

X

3.3

X

3.4

X

3.5

X

See the Buildbot for details.

Although Python 2.6 is not officially supported, it does work with a few minor code modifications, namely replacing functools.total_ordering with the backport to 2.6.

Installation

Using pip:

$ pip install -U ptk

From source:

$ wget https://pypi.python.org/packages/source/p/ptk/ptk-1.2.0.tar.gz
$ tar xjf ptk-1.2.0.tar.bz2; cd ptk-1.2.0
$ sudo python ./setup.py install

Sample usage

Four-operations integer calculator:

from ptk.parser import LRParser, production, leftAssoc
from ptk.lexer import ReLexer, token
import operator, six

@leftAssoc('+', '-')
@rightAssoc('*', '/')
class Parser(LRParser, ReLexer):
    @token('[1-9][0-9]*')
    def number(self, tok):
        tok.value = int(tok.value)
    @production('E -> number<n>')
    def litteral(self, n):
        return n
    @production('E -> "-" E<val>', priority='*')
    def minus(self, val):
        return -val
    @production('E -> "(" E<val> ")"')
    def paren(self, val):
        return val
    @production('E -> E<left> "+"<op> E<right>')
    @production('E -> E<left> "-"<op> E<right>')
    @production('E -> E<left> "*"<op> E<right>')
    @production('E -> E<left> "/"<op> E<right>')
    def binaryop(self, left, op, right):
        return {
            '+': operator.add,
            '-': operator.sub,
            '*': operator.mul,
            '/': operator.floordiv
            }[op](left, right)

parser = Parser()
while True:
    expr = six.moves.input('> ')
    print parser.parse(expr)

Code samples

The samples subdirectory in the source tree contains the aforementioned calculator and a script that generates a skeleton Python file from a Yacc or Bison grammar file.

API documentation

The full documentation is hosted here.

Changelog

Version 1.2.0:

  • Production methods cannot have the same name any more. This was idiotic to begin with. Inheritance thus works as expected.

  • Add AsyncLexer and AsyncLRParser for asynchronous parsing.

Version 1.1.0:

  • Added repeat operators (‘*’, ‘+’, ‘?’) in production syntax.

  • Support for more yacc/bison declarations in yacc2py sample (most are actually ignored)

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

ptk-1.2.0.tar.gz (241.8 kB view details)

Uploaded Source

File details

Details for the file ptk-1.2.0.tar.gz.

File metadata

  • Download URL: ptk-1.2.0.tar.gz
  • Upload date:
  • Size: 241.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for ptk-1.2.0.tar.gz
Algorithm Hash digest
SHA256 1f9509235f590e1f5bb405f6337e896734290baae7f746ace315a115c5186034
MD5 48b564864fb371b01850e4032d5a3c5b
BLAKE2b-256 2df0ba202159cb2d72b77d009472b38a7b811b8364e4a64937cd30085203a2e7

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