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
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.