/***************************************************************************/ /* File pervasives.c. */ /***************************************************************************/ #ifndef PERVASIVES_C #define PERVASIVES_C #include #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) {"", 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 {"", 0, 3, 0, 0, 0, OP_NONE}, // real constant {"", 0, 4, 0, 0, 0, OP_NONE}, // string 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