summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjordi.saludes <jordi.saludes@upc.edu>2010-07-27 07:50:48 +0000
committerjordi.saludes <jordi.saludes@upc.edu>2010-07-27 07:50:48 +0000
commitb9de5c36c0a62048abee457d89b994ebbeb7acf7 (patch)
tree6b07136d3404bf665f6632b6e49fd864c0ed21c9
parent1209cd8f9e83dd7824980f3f6ec5c94588a63bb2 (diff)
Added inferExpr to py-bindings.
-rw-r--r--contrib/py-bindings/PyGF.hsc7
-rw-r--r--contrib/py-bindings/gfmodule.c28
-rw-r--r--contrib/py-bindings/test.py12
3 files changed, 43 insertions, 4 deletions
diff --git a/contrib/py-bindings/PyGF.hsc b/contrib/py-bindings/PyGF.hsc
index 6ac5b05d7..7b9991f3e 100644
--- a/contrib/py-bindings/PyGF.hsc
+++ b/contrib/py-bindings/PyGF.hsc
@@ -219,6 +219,13 @@ gf_unstr pexp = do
Just s -> newCString s
_ -> return nullPtr
+foreign export ccall gf_inferexpr :: Ptr PGF -> Ptr Expr -> Ptr Type -> IO ()
+gf_inferexpr ppgf pexp ptype = do
+ pgf <- peek ppgf
+ exp <- peek pexp
+ let Right (_,t) = inferExpr pgf exp
+ poke ptype t
+
foreign import ccall "newLang" pyLang :: IO (Ptr Language)
foreign import ccall "newTree" pyTree :: IO (Ptr Tree)
foreign import ccall "newCId" pyCId :: IO (Ptr CId)
diff --git a/contrib/py-bindings/gfmodule.c b/contrib/py-bindings/gfmodule.c
index 06896b9ba..8491f2eb5 100644
--- a/contrib/py-bindings/gfmodule.c
+++ b/contrib/py-bindings/gfmodule.c
@@ -245,13 +245,33 @@ unapp(Expr *self) {
return obj;
}
+static PyObject*
+infer_expr(Expr *self, PyObject* args) {
+ PGF* pgf;
+ if (!PyArg_ParseTuple(args, "O", &pgf))
+ return NULL;
+ if (!checkType(pgf, &PGFType)) {
+ PyErr_Format(PyExc_ValueError, "Must be a pgf module.");
+ return NULL;
+ }
+ gfType* gftp = (gfType*)gfTypeType.tp_new(&gfTypeType,NULL,NULL);
+ gf_inferexpr(pgf, self, gftp);
+ return gftp;
+}
+
+
+
+/* todo: Is Tree == Expr ?
+
static PyMethodDef tree_methods[] = {
- {"unapply", (PyCFunction)unapp, METH_NOARGS,"Unapply a tree."},
- {NULL, NULL, 0, NULL} /* Sentinel */
+ {"unapply", (PyCFunction)unapp, METH_NOARGS, "Unapply a tree."},
+ {NULL, NULL, 0, NULL} // * Sentinel * //
};
+*/
static PyMethodDef expr_methods[] = {
- {"unapply", (PyCFunction)unapp, METH_NOARGS,"Unapply an expression."},
+ {"unapply", (PyCFunction)unapp, METH_NOARGS, "Unapply an expression."},
+ {"infer", (PyCFunction)infer_expr, METH_VARARGS, "Infer the type of an expression."},
{NULL, NULL, 0, NULL} /* Sentinel */
};
@@ -297,7 +317,7 @@ initgf(void)
READYTYPE(gfTypeType, gfType_repr, gfType_dealloc)
ExprType.tp_methods = expr_methods;
READYTYPE(ExprType, expr_repr, expr_dealloc)
- TreeType.tp_methods = tree_methods;
+ TreeType.tp_methods = expr_methods; // Tree == Expr ?
READYTYPE(TreeType, tree_repr, Tree_dealloc)
m = Py_InitModule3("gf", gf_methods,
diff --git a/contrib/py-bindings/test.py b/contrib/py-bindings/test.py
index 253360a4f..04adb2c29 100644
--- a/contrib/py-bindings/test.py
+++ b/contrib/py-bindings/test.py
@@ -142,5 +142,17 @@ class TestUnapplyExpr(unittest.TestCase):
uparsed = self.deep_unapp(parsed[0])
self.assertEqual(abs,uparsed)
+ def test_infer(self):
+ lg = 'eng'
+ lang = self.langs[lg]
+ cnc = self.samples[0][1]
+ parsed = self.pgf.parse(cnc[lg],lang)
+ exp = parsed[0]
+ for t in 'Question Object Int'.split():
+ self.assertEqual(`exp.infer(self.pgf)`, t)
+ uexp = exp.unapply()
+ if type(uexp) != type(2) and type(uexp) != type('2'):
+ exp = uexp[1]
+
if __name__ == '__main__':
unittest.main()