Add and pass all the abstraction test cases. Some header cleanup.

This commit is contained in:
John J. Camilleri
2021-09-16 15:38:02 +02:00
parent b393efff59
commit a8bda009a4
7 changed files with 48 additions and 50 deletions

View File

@@ -1,29 +0,0 @@
#ifndef PYPGF_COMPAT_H_
#define PYPGF_COMPAT_H_
// #if PY_MAJOR_VERSION >= 3
// #define PyIntObject PyLongObject
// #define PyInt_Type PyLong_Type
// #define PyInt_Check(op) PyLong_Check(op)
// #define PyInt_CheckExact(op) PyLong_CheckExact(op)
// #define PyInt_FromString PyLong_FromString
// #define PyInt_FromUnicode PyLong_FromUnicode
// #define PyInt_FromLong PyLong_FromLong
// #define PyInt_FromSize_t PyLong_FromSize_t
// #define PyInt_FromSsize_t PyLong_FromSsize_t
// #define PyInt_AsLong PyLong_AsLong
// #define PyInt_AS_LONG PyLong_AS_LONG
// #define PyInt_AsSsize_t PyLong_AsSsize_t
// #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask
// #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
// #define PyStringObject PyUnicodeObject
// #define PyString_Check PyUnicode_Check
// #define PyString_FromStringAndSize PyUnicode_FromStringAndSize
// #define PyString_FromFormat PyUnicode_FromFormat
// #define PyString_Concat(ps,s) {PyObject* tmp = *(ps); *(ps) = PyUnicode_Concat(tmp,s); Py_DECREF(tmp);}
// #define PyString_Concat PyUnicode_Concat
// #define PyString_Compare PyUnicode_Compare
// #endif
#endif // PYPGF_COMPAT_H_

View File

@@ -2,7 +2,7 @@
#include <Python.h>
#include <stdbool.h>
#include "./compat.h"
#include <pgf/pgf.h>
#include "./expr.h"
#include "./marshaller.h"
@@ -245,6 +245,9 @@ ExprAbs_init(ExprAbsObject *self, PyObject *args, PyObject *kwds)
self->bindType = bindType;
self->var = var;
self->expr = expr;
Py_INCREF(bindType);
Py_INCREF(var);
Py_INCREF(expr);
return 0;
}
@@ -331,9 +334,10 @@ ExprApp_init(ExprAppObject *self, PyObject *args, PyObject *kwds)
if (!PyArg_ParseTuple(args, "O!O!", &pgf_ExprType, &e1, &pgf_ExprType, &e2)) {
return -1;
}
self->e1 = (ExprObject *)e1;
self->e2 = (ExprObject *)e2;
Py_INCREF(e1);
Py_INCREF(e2);
return 0;
}
@@ -420,6 +424,7 @@ ExprLit_init(ExprLitObject *self, PyObject *args, PyObject *kwds)
}
if (PyLong_Check(lit) || PyFloat_Check(lit) || PyUnicode_Check(lit)) {
self->value = lit;
Py_INCREF(lit);
return 0;
} else {
PyErr_SetString(PyExc_TypeError, "invalid argument in ExprLit_init");
@@ -528,6 +533,7 @@ ExprMeta_init(ExprMetaObject *self, PyObject *args, PyObject *kwds)
return 0;
} else if (PyLong_Check(lit)) {
self->id = lit;
Py_INCREF(lit);
return 0;
} else {
PyErr_SetString(PyExc_TypeError, "invalid argument in ExprMeta_init");
@@ -616,6 +622,7 @@ ExprFun_init(ExprFunObject *self, PyObject *args, PyObject *kwds)
return -1;
}
self->name = lit;
Py_INCREF(lit);
return 0;
}
@@ -704,6 +711,7 @@ ExprVar_init(ExprVarObject *self, PyObject *args, PyObject *kwds)
return 0;
} else if (PyLong_Check(lit)) {
self->index = lit;
Py_INCREF(lit);
return 0;
} else {
PyErr_SetString(PyExc_TypeError, "invalid argument in ExprVar_init");
@@ -794,6 +802,8 @@ ExprTyped_init(ExprTypedObject *self, PyObject *args, PyObject *kwds)
}
self->expr = expr;
self->type = type;
Py_INCREF(expr);
Py_INCREF(type);
return 0;
}
@@ -879,6 +889,7 @@ ExprImplArg_init(ExprImplArgObject *self, PyObject *args, PyObject *kwds)
return -1;
}
self->expr = expr;
Py_INCREF(expr);
return 0;
}

View File

@@ -6,8 +6,6 @@
#include <pgf/pgf.h>
#include "./compat.h"
typedef struct {
PyObject_HEAD
PyObject *hypos; // PyListObject of PyTupleObject: (bind_type: int, cid: string, type: TypeObject)

View File

@@ -4,8 +4,8 @@
#include <stdbool.h>
#include <pgf/pgf.h>
#include "./compat.h"
#include "./expr.h"
#include "./marshaller.h"
// ----------------------------------------------------------------------------

View File

@@ -1,17 +1,15 @@
#ifndef PYPGF_MARSHALLER_H_
#define PYPGF_MARSHALLER_H_
// #define PY_SSIZE_T_CLEAN
// #include <Python.h>
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <pgf/pgf.h>
PgfText *PyUnicode_AsPgfText(PyObject *pystr);
PyObject *PyUnicode_FromPgfText(PgfText *text);
extern PgfUnmarshaller unmarshaller;
extern PgfMarshaller marshaller;
#endif // PYPGF_MARSHALLER_H_

View File

@@ -3,7 +3,6 @@
#include <structmember.h>
#include <pgf/pgf.h>
#include "./compat.h"
#include "./expr.h"
#include "./marshaller.h"
@@ -2524,7 +2523,7 @@ pgf_bootNGF(PyObject *self, PyObject *args)
static PGFObject*
pgf_readNGF(PyObject *self, PyObject *args)
{
const char *fpath;
const char *fpath;
if (!PyArg_ParseTuple(args, "s", &fpath))
return NULL;

View File

@@ -282,14 +282,37 @@ def test_showExpr_evar_4():
# expressions: lambda abstractions
# ,TestCase (assertEqual "show expression 8" "\\w->w" (showExpr ["z","y","x"] (EAbs Explicit "w" (EVar 0))))
# ,TestCase (assertEqual "show expression 9" "\\v,w->z" (showExpr ["z","y","x"] (EAbs Explicit "v" (EAbs Explicit "w" (EVar 2)))))
# ,TestCase (assertEqual "show expression 10" "\\v,{w}->z" (showExpr ["z","y","x"] (EAbs Explicit "v" (EAbs Implicit "w" (EVar 2)))))
# ,TestCase (assertEqual "show expression 11" "\\v,{w},z->z" (showExpr ["y","x"] (EAbs Explicit "v" (EAbs Implicit "w" (EAbs Explicit "z" (EVar 0))))))
# ,TestCase (assertEqual "show expression 12" "\\v,{w,z}->v" (showExpr ["y","x"] (EAbs Explicit "v" (EAbs Implicit "w" (EAbs Implicit "z" (EVar 2))))))
# ,TestCase (assertEqual "show expression 13" "\\v,{w,z},t->v" (showExpr ["y","x"] (EAbs Explicit "v" (EAbs Implicit "w" (EAbs Implicit "z" (EAbs Explicit "t" (EVar 3)))))))
# ,TestCase (assertEqual "show expression 14" "\\u,v,{w,z},t->v" (showExpr ["y","x"] (EAbs Explicit "u" (EAbs Explicit "v" (EAbs Implicit "w" (EAbs Implicit "z" (EAbs Explicit "t" (EVar 3))))))))
# ,TestCase (assertEqual "show expression 15" "f (\\x->x)" (showExpr [] (EApp (EFun "f") (EAbs Explicit "x" (EVar 0)))))
def test_showExpr_eabs_1():
expr = pgf.ExprAbs(0, "w", pgf.ExprVar(0))
assert pgf.showExpr(["z", "y", "x"], expr) == "\\w->w"
def test_showExpr_eabs_2():
expr = pgf.ExprAbs(0, "v", pgf.ExprAbs(0, "w", pgf.ExprVar(2)))
assert pgf.showExpr(["z", "y", "x"], expr) == "\\v,w->z"
def test_showExpr_eabs_3():
expr = pgf.ExprAbs(0, "v", pgf.ExprAbs(1, "w", pgf.ExprVar(2)))
assert pgf.showExpr(["z", "y", "x"], expr) == "\\v,{w}->z"
def test_showExpr_eabs_4():
expr = pgf.ExprAbs(0, "v", pgf.ExprAbs(1, "w", pgf.ExprAbs(0, "z", pgf.ExprVar(0))))
assert pgf.showExpr(["y", "x"], expr) == "\\v,{w},z->z"
def test_showExpr_eabs_5():
expr = pgf.ExprAbs(0, "v", pgf.ExprAbs(1, "w", pgf.ExprAbs(1, "z", pgf.ExprVar(2))))
assert pgf.showExpr(["y", "x"], expr) == "\\v,{w,z}->v"
def test_showExpr_eabs_6():
expr = pgf.ExprAbs(0, "v", pgf.ExprAbs(1, "w", pgf.ExprAbs(1, "z", pgf.ExprAbs(0, "t", pgf.ExprVar(3)))))
assert pgf.showExpr(["y", "x"], expr) == "\\v,{w,z},t->v"
def test_showExpr_eabs_7():
expr = pgf.ExprAbs(0, "u", pgf.ExprAbs(0, "v", pgf.ExprAbs(1, "w", pgf.ExprAbs(1, "z", pgf.ExprAbs(0, "t", pgf.ExprVar(3))))))
assert pgf.showExpr(["y", "x"], expr) == "\\u,v,{w,z},t->v"
def test_showExpr_eabs_8():
expr = pgf.ExprApp(pgf.ExprFun("f"), pgf.ExprAbs(0, "x", pgf.ExprVar(0)))
assert pgf.showExpr([], expr) == "f (\\x->x)"
# expressions: meta variables
@@ -313,5 +336,3 @@ def test_readExpr_emeta_equality():
def test_readExpr_emeta_str():
assert str(pgf.readExpr("<z : N>")) == "<z : N>"
# ,TestCase (assertEqual "show expression 18" "<z : N>" (showExpr [] (ETyped (EFun "z") (DTyp [] "N" []))))