summaryrefslogtreecommitdiff
path: root/src/runtime/c/teyjus/tables/pervasives.c
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2012-07-31 15:16:04 +0000
committerkr.angelov <kr.angelov@gmail.com>2012-07-31 15:16:04 +0000
commit83b321d862472f31c0c9f7feca8360ad5bfe8a75 (patch)
tree0f0ef20ad78e25b320013c7bb160211a8612d4e9 /src/runtime/c/teyjus/tables/pervasives.c
parent314662dd09d5d1480007faa79258b0e93cc2aa59 (diff)
An initial import of the teyjus source code in the C runtime for GF. The two runtime are still not connected but the source code compiles.
Diffstat (limited to 'src/runtime/c/teyjus/tables/pervasives.c')
-rw-r--r--src/runtime/c/teyjus/tables/pervasives.c810
1 files changed, 810 insertions, 0 deletions
diff --git a/src/runtime/c/teyjus/tables/pervasives.c b/src/runtime/c/teyjus/tables/pervasives.c
new file mode 100644
index 000000000..4c2b3ad4c
--- /dev/null
+++ b/src/runtime/c/teyjus/tables/pervasives.c
@@ -0,0 +1,810 @@
+/***************************************************************************/
+/* File pervasives.c. */
+/***************************************************************************/
+
+#ifndef PERVASIVES_C
+#define PERVASIVES_C
+
+#include <string.h>
+#include "pervasives.h"
+#include "../system/error.h" //to be changed
+#include "../system/operators.h" //to be changed
+
+
+/****************************************************************************/
+/* PERVASIVE KIND */
+/****************************************************************************/
+//pervasive kind data table (array)
+PERV_KindData PERV_kindDataTab[PERV_KIND_NUM] = {
+ //name, arity
+ // int
+ {"int", 0},
+ // real
+ {"real", 0},
+ // bool
+ {"o", 0},
+ // string
+ {"string", 0},
+ // list type constructor
+ {"list", 1},
+ // in_stream
+ {"in_stream", 0},
+ // out_stream
+ {"out_stream", 0}
+};
+
+PERV_KindData PERV_getKindData(int index)
+{
+ return PERV_kindDataTab[index];
+}
+
+void PERV_copyKindDataTab(PERV_KindData* dst)
+{
+ //this way of copy relies on the assumption that the pervasive kind data
+ //has the same structure as that of the run-time kind symbol table entries.
+ memcpy((void*)dst, (void*)PERV_kindDataTab,
+ sizeof(PERV_KindData) * PERV_KIND_NUM);
+}
+
+
+/***************************************************************************/
+/* TYPE SKELETIONS FOR PERVASIVE CONSTANTS */
+/****************************************************************************/
+
+//pervasive type skeleton table (array)
+PERV_TySkelData PERV_tySkelTab[PERV_TY_SKEL_NUM];
+
+//pervasive type skeletons and type skeleton table initialization
+//The type skeletons are created in the memory of the system through malloc,
+//and addresses are entered into the pervasive type skeleton table.
+void PERV_tySkelTabInit()
+{
+ int tySkelInd = 0; //ts tab index
+ MemPtr tySkelBase = (MemPtr)EM_malloc(WORD_SIZE * 336 ); //ts area
+
+ // A
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // (list A)
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkStrType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkStrFuncType(tySkelBase, PERV_LIST_INDEX, 1);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // A->(list A)->(list A)
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkStrType(tySkelBase, (DF_TypePtr)(tySkelBase + 2 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkStrType(tySkelBase, (DF_TypePtr)(tySkelBase + 3 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkStrFuncType(tySkelBase, PERV_LIST_INDEX, 1);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkStrFuncType(tySkelBase, PERV_LIST_INDEX, 1);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // int
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // real
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkSortType(tySkelBase, PERV_REAL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // string
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // o (type of proposition)
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // int -> int
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // int -> int -> int
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // int -> int -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // int -> real
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_REAL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // real -> int
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_REAL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // real -> real
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_REAL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_REAL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // real -> string
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_REAL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // real -> real -> real
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_REAL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_REAL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_REAL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // real -> real -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_REAL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_REAL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // string -> int
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // int -> string
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // string -> string -> string
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // string -> string -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // string -> int -> int -> string
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // o -> o -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // (A -> o) -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 2 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // A -> A -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // in_stream
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkSortType(tySkelBase, PERV_INSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // out_stream
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkSortType(tySkelBase, PERV_OUTSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // string -> in_stream -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // string -> out_stream -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_OUTSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // in_stream -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // out_stream -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_OUTSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // A -> string -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // string -> A -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // out_stream -> string -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_OUTSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // in_stream -> int -> string -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // in_stream -> string -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // string -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // A -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // out_stream -> A -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_OUTSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // in_stream -> A -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSkelVarType(tySkelBase, 0);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // o -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // string -> int -> in_stream -> out_stream -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_OUTSTREAM_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+ // string -> int -> o
+ PERV_tySkelTab[tySkelInd] = (PERV_TySkelData)tySkelBase;
+ tySkelInd++;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_STRING_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkArrowType(tySkelBase, (DF_TypePtr)(tySkelBase + 1 * DF_TY_ATOMIC_SIZE));
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_INT_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+ DF_mkSortType(tySkelBase, PERV_BOOL_INDEX);
+ tySkelBase += DF_TY_ATOMIC_SIZE;
+
+}
+
+void PERV_copyTySkelTab(PERV_TySkelData* dst)
+{
+ memcpy((void*)dst, (void*)PERV_tySkelTab,
+ sizeof(PERV_TySkelData) * PERV_KIND_NUM);
+}
+
+
+/***************************************************************************/
+/* PERVASIVE CONSTANTS */
+/***************************************************************************/
+
+//pervasive constant data table (array)
+PERV_ConstData PERV_constDataTab[PERV_CONST_NUM] = {
+ //name, tesize, tst, neededness, UC, prec, fixity
+ // logical and
+ {",", 0, 21, 0, 0, 110, OP_INFIXL},
+ // logical or
+ {";", 0, 21, 0, 0, 100, OP_INFIXL},
+ // existential quantifier
+ {"sigma", 1, 22, 1, 0, 0, OP_NONE},
+ // universal quantifier
+ {"pi", 1, 22, 1, 0, 0, OP_NONE},
+ // true proposition
+ {"true", 0, 6, 0, 0, 0, OP_NONE},
+ // cut predicate
+ {"!", 0, 6, 0, 0, 0, OP_NONE},
+ // fail predicate
+ {"fail", 0, 6, 0, 0, 0, OP_NONE},
+ //nothing
+ {NULL, 0, 0, 0, 0, OP_NONE },
+ // another logical and
+ {"&", 0, 21, 0, 0, 120, OP_INFIXR},
+ // halt the system
+ {"halt", 0, 6, 0, 0, 0, OP_NONE},
+ // return to top level
+ {"stop", 0, 6, 0, 0, 0, OP_NONE},
+ // Prolog if; needed?
+ {":-", 0, 21, 0, 0, 0, OP_INFIXL},
+ // implication; needed?
+ {"=>", 0, 21, 0, 0, 130, OP_INFIXR},
+ //nothing
+ {NULL, 0, 0, 0, 0, OP_NONE },
+ //nothing
+ {NULL, 0, 0, 0, 0, OP_NONE },
+ // solve; used by code generator
+ {"solve", 0, 39, 0, 0, 0, OP_NONE},
+ // is
+ {"is", 1, 23, 1, 0, 130, OP_INFIX},
+ // not
+ {"not", 0, 39, 0, 0, 0, OP_NONE},
+ // equality (unify) predicate
+ {"=", 1, 23, 1, 0, 130, OP_INFIX},
+ // less than on integers
+ {"<", 0, 9, 0, 0, 130, OP_INFIX},
+ // greater than on integers
+ {">", 0, 9, 0, 0, 130, OP_INFIX},
+ // less than or eq on integers
+ {"<=", 0, 9, 0, 0, 130, OP_INFIX},
+ // greater than or eq on integers
+ {">=", 0, 9, 0, 0, 130, OP_INFIX},
+ // less than in reals
+ {"<", 0, 15, 0, 0, 130, OP_INFIX},
+ // greater than on reals
+ {">", 0, 15, 0, 0, 130, OP_INFIX},
+ // less than or eq on reals
+ {"<=", 0, 15, 0, 0, 130, OP_INFIX},
+ // greater than or eq on reals
+ {">=", 0, 15, 0, 0, 130, OP_INFIX},
+ // less than on strings
+ {"<", 0, 19, 0, 0, 130, OP_INFIX},
+ // greater than on strings
+ {">", 0, 19, 0, 0, 130, OP_INFIX},
+ // less than or eq on strings
+ {"<=", 0, 19, 0, 0, 130, OP_INFIX},
+ // greater than or eq on strings
+ {">=", 0, 19, 0, 0, 130, OP_INFIX},
+ // open_in
+ {"open_in", 0, 26, 0, 0, 0, OP_NONE},
+ // open_out
+ {"open_out", 0, 27, 0, 0, 0, OP_NONE},
+ // open_append
+ {"open_append", 0, 27, 0, 0, 0, OP_NONE},
+ // close_in
+ {"close_in", 0, 28, 0, 0, 0, OP_NONE},
+ // close_out
+ {"close_out", 0, 29, 0, 0, 0, OP_NONE},
+ // open_string
+ {"open_string", 0, 26, 0, 0, 0, OP_NONE},
+ // input
+ {"input", 0, 33, 0, 0, 0, OP_NONE},
+ // output
+ {"output", 0, 32, 0, 0, 0, OP_NONE},
+ // input_line
+ {"input_line", 0, 34, 0, 0, 0, OP_NONE},
+ // lookahead
+ {"lookahead", 0, 34, 0, 0, 0, OP_NONE},
+ // eof
+ {"eof", 0, 28, 0, 0, 0, OP_NONE},
+ // flush
+ {"flush", 0, 29, 0, 0, 0, OP_NONE},
+ // print
+ {"print", 0, 35, 0, 0, 0, OP_NONE},
+ // read
+ {"read", 1, 36, 1, 0, 0, OP_NONE},
+ // printterm
+ {"printterm", 1, 37, 0, 0, 0, OP_NONE},
+ // term_to_string
+ {"term_to_string", 1, 30, 0, 0, 0, OP_NONE},
+ // string_to_term
+ {"string_to_term", 1, 31, 1, 0, 0, OP_NONE},
+ // readterm
+ {"readterm", 1, 38, 1, 0, 0, OP_NONE},
+ // getenv predicate; needed?
+ {"getenv", 0, 19, 0, 0, 0, OP_NONE},
+ // open_socket predicate
+ {"open_socket", 0, 40, 0, 0, 0, OP_NONE},
+ // time predicate
+ {"time", 0, 9, 0, 0, 0, OP_NONE},
+ // system predicate
+ {"system", 0, 41, 0, 0, 0, OP_NONE},
+ //nothing
+ {NULL, 0, 0, 0, 0, OP_NONE },
+ //nothing
+ {NULL, 0, 0, 0, 0, OP_NONE },
+ //nothing
+ {NULL, 0, 0, 0, 0, OP_NONE },
+ // unary minus on integers
+ {"-", 0, 7, 0, 0, 256, OP_PREFIX},
+ // addition on integers
+ {"+", 0, 8, 0, 0, 150, OP_INFIXL},
+ // subtraction on integers
+ {"-", 0, 8, 0, 0, 150, OP_INFIXL},
+ // mutiplication on integers
+ {"*", 0, 8, 0, 0, 160, OP_INFIXL},
+ // integer division
+ {"div", 0, 8, 0, 0, 160, OP_INFIXL},
+ // modulus
+ {"mod", 0, 7, 0, 0, 160, OP_INFIXL},
+ // coercion to real
+ {"int_to_real", 0, 10, 0, 0, 0, OP_NONE},
+ // integer abs
+ {"abs", 0, 7, 0, 0, 0, OP_NONE},
+ // unary minus on real
+ {"-", 0, 12, 0, 0, 256, OP_PREFIX},
+ // addition on reals
+ {"+", 0, 14, 0, 0, 150, OP_INFIXL},
+ // subtraction on reals
+ {"-", 0, 14, 0, 0, 150, OP_INFIXL},
+ // multiplication on reals
+ {"*", 0, 14, 0, 0, 160, OP_INFIXL},
+ // division
+ {"/", 0, 14, 0, 0, 160, OP_INFIXL},
+ // square root
+ {"sqrt", 0, 12, 0, 0, 0, OP_NONE},
+ // sine
+ {"sin", 0, 12, 0, 0, 0, OP_NONE},
+ // cosine
+ {"cos", 0, 12, 0, 0, 0, OP_NONE},
+ // arc tan
+ {"arctan", 0, 12, 0, 0, 0, OP_NONE},
+ // natural log
+ {"ln", 0, 12, 0, 0, 0, OP_NONE},
+ // floor function
+ {"floor", 0, 11, 0, 0, 0, OP_NONE},
+ // ceiling function
+ {"ceil", 0, 11, 0, 0, 0, OP_NONE},
+ // truncation
+ {"truncate", 0, 11, 0, 0, 0, OP_NONE},
+ // real abs
+ {"rabs", 0, 12, 0, 0, 0, OP_NONE},
+ // string concatination
+ {"^", 0, 18, 0, 0, 150, OP_INFIXL},
+ // string length
+ {"size", 0, 16, 0, 0, 0, OP_NONE},
+ // chr function
+ {"chr", 0, 17, 0, 0, 0, OP_NONE},
+ // ord function
+ {"string_to_int", 0, 16, 0, 0, 0, OP_NONE},
+ // substring
+ {"substring", 0, 20, 0, 0, 0, OP_NONE},
+ // int to string
+ {"int_to_string", 0, 17, 0, 0, 0, OP_NONE},
+ // real to string
+ {"real_to_string", 0, 13, 0, 0, 0, OP_NONE},
+ // for unnamed universal constants (Note: tesize should be 0)
+ {"<constant>", 0, 0, 0, 0, 0, OP_NONE},
+ // std_in
+ {"std_in", 0, 24, 0, 0, 0, OP_NONE},
+ // std_out
+ {"std_out", 0, 25, 0, 0, 0, OP_NONE},
+ // std_err
+ {"std_err", 0, 25, 0, 0, 0, OP_NONE},
+ // nil
+ {"nil", 0, 1, 0, 0, 0, OP_NONE},
+ // integer constant
+ {"<int_constant>", 0, 3, 0, 0, 0, OP_NONE},
+ // real constant
+ {"<real_constant>", 0, 4, 0, 0, 0, OP_NONE},
+ // string constant
+ {"<str_constant>", 0, 5, 0, 0, 0, OP_NONE},
+ // cons
+ {"::", 0, 2, 0, 0, 140, OP_INFIXR}
+};
+
+PERV_ConstData PERV_getConstData(int index)
+{
+ return PERV_constDataTab[index];
+}
+
+void PERV_copyConstDataTab(PERV_ConstData* dst)
+{
+ //this way of copy relies on the assumption that the pervasive kind data
+ //has the same structure as that of the run-time kind symbol table entries.
+ memcpy((void*)dst, (void*)PERV_constDataTab,
+ sizeof(PERV_ConstData) * PERV_CONST_NUM);
+}
+
+Boolean PERV_isLogicSymb(int index)
+{
+ return ((index >= PERV_LSSTART) && (index <= PERV_LSEND));
+}
+
+Boolean PERV_isPredSymb(int index)
+{
+ return ((index >= PERV_PREDSTART) && (index <= PERV_PREDEND));
+}
+
+PERV_LogicSymbTypes PERV_logicSymb(int index)
+{
+ return ((PERV_LogicSymbTypes)(index - PERV_LSSTART));
+}
+
+int PERV_predBuiltin(int index)
+{
+ return (index - PERV_PREDSTART);
+}
+
+
+#endif //PERVASIVES_C
+