diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2012-07-31 15:16:04 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2012-07-31 15:16:04 +0000 |
| commit | 83b321d862472f31c0c9f7feca8360ad5bfe8a75 (patch) | |
| tree | 0f0ef20ad78e25b320013c7bb160211a8612d4e9 /src/runtime/c/teyjus/tables/pervasives.c | |
| parent | 314662dd09d5d1480007faa79258b0e93cc2aa59 (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.c | 810 |
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 + |
