summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2013-01-07 15:11:12 +0000
committerkr.angelov <kr.angelov@gmail.com>2013-01-07 15:11:12 +0000
commit9b78da535700f561952d0b6498d84b187e9a1791 (patch)
tree64951ee67c511350671702016ab1b69c3e7350b4
parent2c169406fcfa7a38cd89f8a6acbd0bb138d7c330 (diff)
now the Python binding has an alternative representation for abstract trees which is composed of Python objects. The new representation is not integrated with the core runtime yet
-rw-r--r--src/runtime/python/pgf/__init__.py3
-rw-r--r--src/runtime/python/pgf/binding.c (renamed from src/runtime/python/pypgf.c)4
-rw-r--r--src/runtime/python/pgf/expr.py169
-rw-r--r--src/runtime/python/setup.py10
4 files changed, 181 insertions, 5 deletions
diff --git a/src/runtime/python/pgf/__init__.py b/src/runtime/python/pgf/__init__.py
new file mode 100644
index 000000000..07e164093
--- /dev/null
+++ b/src/runtime/python/pgf/__init__.py
@@ -0,0 +1,3 @@
+import pgf.expr
+from pgf.binding import *
+from pgf.expr import (readExpr_py)
diff --git a/src/runtime/python/pypgf.c b/src/runtime/python/pgf/binding.c
index fec5e1578..5efb7a0be 100644
--- a/src/runtime/python/pypgf.c
+++ b/src/runtime/python/pgf/binding.c
@@ -863,7 +863,7 @@ static PyMethodDef module_methods[] = {
};
PyMODINIT_FUNC
-initpgf(void)
+initbinding(void)
{
PyObject *m;
@@ -879,7 +879,7 @@ initpgf(void)
if (PyType_Ready(&pgf_ExprIterType) < 0)
return;
- m = Py_InitModule("pgf", module_methods);
+ m = Py_InitModule("binding", module_methods);
if (m == NULL)
return;
diff --git a/src/runtime/python/pgf/expr.py b/src/runtime/python/pgf/expr.py
new file mode 100644
index 000000000..83cccd39f
--- /dev/null
+++ b/src/runtime/python/pgf/expr.py
@@ -0,0 +1,169 @@
+import pgf.binding
+import StringIO
+
+class App:
+ """An application of a function to an argument"""
+
+ def __init__(self, fun, arg):
+ self.fun = fun
+ self.arg = arg
+
+ def showExpr(self, prec):
+ s = self.fun.showExpr(3) + " " + self.arg.showExpr(4)
+ if prec > 3:
+ s = "(" + s + ")"
+ return s
+
+ def __str__(self):
+ return self.showExpr(0)
+
+class Lit:
+ """A literal value"""
+
+ def __init__(self, value):
+ self.value = value
+
+ def showExpr(self, prec):
+ if isinstance(self.value, str):
+ return '"' + self.value + '"'
+ else:
+ return str(self.value)
+
+ def __str__(self):
+ return self.showExpr(0)
+
+class Meta:
+ """A meta variable"""
+
+ def __init__(self, metaid):
+ self.metaid = metaid
+
+ def showExpr(self, prec):
+ return "?"
+
+ def __str__(self):
+ return self.showExpr(0)
+
+class Fun:
+ """A function name"""
+
+ def __init__(self, name):
+ self.name = name
+
+ def showExpr(self, prec):
+ return self.name
+
+ def __str__(self):
+ return self.showExpr(0)
+
+class __ExprParser:
+ # token types
+ TOKEN_UNKNOWN = 0
+ TOKEN_LPARENT = 1
+ TOKEN_RPARENT = 2
+ TOKEN_QUESTION = 3
+ TOKEN_IDENT = 4
+ TOKEN_STRING = 5
+ TOKEN_INT = 6
+ TOKEN_FLOAT = 7
+ TOKEN_EOF = 8
+
+ def __init__(self, fh):
+ self.ch = ' '
+ self.fh = fh
+ self.token = self.TOKEN_UNKNOWN
+ self.token_value = ""
+ self.readToken()
+
+ def readToken(self):
+ while self.ch.isspace():
+ self.ch = self.fh.read(1);
+
+ self.token_value = ""
+
+ if self.ch == '(':
+ self.ch = self.fh.read(1);
+ self.token = self.TOKEN_LPARENT
+ elif self.ch == ')':
+ self.ch = self.fh.read(1);
+ self.token = self.TOKEN_RPARENT
+ elif self.ch == '?':
+ self.ch = self.fh.read(1);
+ self.token = self.TOKEN_QUESTION
+ elif (self.ch.isalpha() or self.ch == '_'):
+ self.token = self.TOKEN_IDENT
+ while (self.ch.isalnum() or self.ch == '_' or self.ch == "'"):
+ self.token_value = self.token_value + self.ch
+ self.ch = self.fh.read(1)
+ elif self.ch == '"':
+ self.ch = self.fh.read(1)
+ self.token = self.TOKEN_STRING
+ while self.ch != '"':
+ if self.ch == '':
+ raise pgf.ParseError("Missing quotation mark")
+ self.token_value = self.token_value + self.ch
+ self.ch = self.fh.read(1)
+ self.ch = self.fh.read(1)
+ elif self.ch.isdigit():
+ self.token = self.TOKEN_INT
+ while self.ch.isdigit():
+ self.token_value = self.token_value + self.ch
+ self.ch = self.fh.read(1)
+
+ if self.ch == '.':
+ self.token = self.TOKEN_FLOAT
+
+ self.token_value = self.token_value + self.ch
+ self.ch = self.fh.read(1)
+
+ while self.ch.isdigit():
+ self.token_value = self.token_value + self.ch
+ self.ch = self.fh.read(1)
+
+ elif self.ch == '':
+ self.token = self.TOKEN_EOF
+ else:
+ self.token = self.TOKEN_UNKNOWN
+
+ def parseTerm(self):
+ if self.token == self.TOKEN_IDENT:
+ e = Fun(self.token_value)
+ self.readToken()
+ return e
+ elif self.token == self.TOKEN_LPARENT:
+ self.readToken()
+ e = self.parseExpr()
+ if self.token == self.TOKEN_RPARENT:
+ self.readToken()
+ return e;
+ else:
+ raise pgf.ParseError("Missing right parenthesis")
+ elif self.token == self.TOKEN_QUESTION:
+ e = Meta(0)
+ self.readToken()
+ return e
+ elif self.token == self.TOKEN_STRING:
+ e = Lit(self.token_value)
+ self.readToken()
+ return e
+ elif self.token == self.TOKEN_INT:
+ e = Lit(int(self.token_value))
+ self.readToken()
+ return e
+ elif self.token == self.TOKEN_FLOAT:
+ e = Lit(float(self.token_value))
+ self.readToken()
+ return e
+ else:
+ raise pgf.ParseError("Unknown token")
+
+ def parseExpr(self):
+ e = self.parseTerm()
+ while (self.token != self.TOKEN_EOF and
+ self.token != self.TOKEN_RPARENT):
+ e = App(e, self.parseTerm())
+ return e
+
+def readExpr_py(str):
+ parser = __ExprParser(StringIO.StringIO(str))
+ return parser.parseExpr()
diff --git a/src/runtime/python/setup.py b/src/runtime/python/setup.py
index 7356cb6c1..6f908cfe1 100644
--- a/src/runtime/python/setup.py
+++ b/src/runtime/python/setup.py
@@ -1,11 +1,15 @@
from distutils.core import setup, Extension
-pgf_module = Extension('pgf',
- sources = ['pypgf.c'],
+pgf_module = Extension('pgf.binding',
+ sources = ['pgf/binding.c'],
extra_compile_args = ['-std=c99'],
libraries = ['gu', 'pgf'])
setup (name = 'pgf',
version = '1.0',
- description = 'This is binding to the PGF engine',
+ description = 'A binding to the PGF engine',
+ author='Krasimir Angelov',
+ author_email='kr.angelov@gmail.com',
+ license='BSD',
+ packages=['pgf'],
ext_modules = [pgf_module])