LETTERS('QWERTYUIOPASDFGHJKLZXCVBNM') NUMBERS('1234567890') G_BIT_TYPE = 1 G_INT_TYPE = 2 G_CHA_TYPE = 3 G_FLT_TYPE = 4 G_BOO_TYPE = 5 G_ATOMIC = 0 G_VECOTR_TYPE = 1 G_2D_TYPE = 2 G_3D_TYPE = 3 DATA('G_BSTE(OUTER_BLOCK,NAME,ARG_RESOLVED_YET)') G_ARGT = TABLE() G_ARG_RESOLVED = YES ** how many argumnets processed G_ARGN = 0 ** counter to go up to g_argn G_ARG_COUNTER = 0 G_RUN_TIME_DONE = NO DATA('G_SYME(OBJ_NAME,ARG_OBJECT,ARG_POS, + OBJ_DATA_TYPE,LEX_LEVEL,BLOCK_NUM + STRUCT_TYPE,UB1,LB1,UB2,LB2,UB3,LB3)') G_SYM = TABLE() G_ID_COUNT = 0 ************************************************************* TRY_PROC P_MAIN = BREAK(LETTERS) SPAN(LETTERS) . V1 BREAK(':') SPAN(':') + BREAK(LETTERS) 'PROC' ! 'PROCEDURE' P_PROC_1 = P_MAIN BREAK('(') SPAN('(') ARB . V2 ')' P_PROC_2 = P_MAIN P_PROC_1 BREAK(LETTERS) 'RETURNS' BREAK(LETTERS) + SPAN(LETTERS) . V3 AUX = '' DEFINE('ENTRY_MANAGER(PROC_NAME)') DEFINE('CHECK_RUN_TIME()') PROC_LINE P_PROC_2 :F(TRY_PROC_B1) G_ARG_RESOLVED = NO ENTRY_MANAGER(V1) G_CB = G_LB OUT = '(**************************************************)' AUX = 'Function ' V1 ';' V3 'FLOAT' :F(TRY_PROC_A1) AUX = AUX ' :' 'Real;' OUT = AUX :(TRY_PROC_HANLE_ARGS) TRY_PROC_A1 V3 'CHAR' :F(TRY_PROC_A2) AUX = AUX ' :' 'Char;' OUT = AUX :(TRY_PROC_HANLE_ARGS) TRY_PROC_A3 V3 'FIXED' :F(FRETURN) AUX = AUX ' :' 'Integer;' OUT = AUX TRY_PROC_HANLE_ARGS CHECK_RUN_TIME() TRY_PROC_LOOP1 V2 BREAK(LETTERS) SPAN(LETTERS) . P1 = :F(RETURN) GARGN = GARGN + 1 G_ARGT = P1 :TRY_BLOCK_LOOP1 TRY_PROC_B1 PROC_LINE P_PROC_1 :F(TRY_PROC_C1) ENTRY_MANAGER(V1) G_CB = G_LB OUT = '(**************************************************)' AUX = 'Procedure ' V1 ';' OUT = AUX TRY_PROC_HANDLE_ARGS_B CHECK_RUN_TIME() TRY_PPROC_LOOP2 V2 BREAK(LETTERS) SPAN(LETTERS) . P1 = :F(RETURN) GARGN = GARGN + 1 G_ARGT = P1 :(TRY_PROC_LOOP2) TRY_PROC_C1 PROC_LINE P_MAIN :F(FRETURN) ENTRY_MANAGER(V1) EQ(OUTER_BLOCK(G_BST),0) :F(NOT_MAIN) G_CB = G_LB OUT = 'Program ' V1 ';' OUT = ' ' DEFINE('EMIT_PASCAL_GLOBAL_TYPES()') EMIT_PASCAL_GLOBALS_TYPES() :(RETURN) NOT_MAIN ENTRY_MANAGER() G_CB = G_LB OUT = 'Procedure ' V1 ';' CHECK_RUN_TIME() :(RETURN) ********************************************************************** ENTRY_MANAGER G_LB = G_LB + 1 G_BST = G_BSTE() NAME(G_BST) = PROC_NAME OUTER_BLOCK(G_BST) = G_CB :(RETURN) ********************************************************************* CHECK_RUN_TIME EQ(G_RUN_TIME_DONE,NO) :F(RETURN) DEFINE('EMIT_PASCAL_RUN_TIME()') EMIT_PASCAL_RUN_TIME() G_RUN_TIME_DONE = YES :(RETURN) ********************************************************************** TRY_DCL P_DCL = BREAK(LETTERS) 'DCL' ! 'DECLARATION' G1 = P_DCL BREAK('(') SPAN('(') ARB . V1 ')' BREAK('(') + SPAN('(') ARB .V2 ')' G2 = P_DCL BREAK(LETTERS) SPAN(LETTERS) . V1 BREAK('(') + SPPAN('(') ARB .V2 ')' G3 = P_DCL BREAK('(') SPAN('(') ARB .V1 ')' G4 = P_DCL BREAK(LETTERS) . V1 P_BIT1 = G3 BREAK(LETTERS) 'BIT' BREAK('(') SPAN('(') + ARB . V2 ')' P_BIT2 = G3 BREAK(LETTERS) 'BIT' P_BIT3 = G4 BREAK(LETTERS) 'BIT' P_BIT4 = G4 BREAK(LETTERS) 'BIT' BREAK ('(') SPAN('(') + ARB . V2 ')' P_FIX1 = G1 BREAK(LETTERS) 'FIXED' P_FIX2 = G3 BREAK(LETTERS) 'FIXED' P_FIX3 = G2 BREAK(LETTERS) 'FIXED' P_FIX4 = G3 BREAK(LETTERS) 'FIXED' P_FLT1 = G1 BREAK(LETTERS) 'FLOAT' P_FLT2 = G3 BREAK(LETTERS) 'FLOAT' P_FLT3 = G2 BREAK(LETTERS) 'FLOAT' P_FLT4 = G4 BREAK(LETTERS) 'FLOAT' P_CHR1 = G3 BREAK(LETTERS) 'CHAR' BREAK('(') SPAN('(') + ARB . V2 ')' BREAK(LETTERS) 'VAR' ! 'VARYING' P_CHR2 = G3 BREAK(LETTERS) 'CHAR' BREAK('(') SPAN('(') + ARB . V2 ')' P_CHR3 = G3 BREAK(LETTERS) 'CHAR' P_CHR4 = G4 BREAK(LETTERS) 'CHAR' DEFINE('SYM_TABLE_MANAGER(P1,P2,P3,P4,P5,P6 + ,P7,P8,P9,P10,P11,P12,P13)') ** arg manager takes name and returns position in arg list DEFINE('ARG_MANAGER(NAME)') ** check if variable is from arg list if in arg list add to symbol ** table but with flag indicating it is an argument ang it ** position else add to sym tanble with rest of atttributes DCL_LINE P_BIT1 :F(TRY_BIT2) TRY_BIT1_LOOP1 V1 BREAK(LETTERS) SPAN(LETTERS) . NAME = :F(RETURNS) ARG_POSITION = ARG_MANAGER(NAME) EQ(ARG_POSITION,0) :S(NOT_ARG_A1) ** if an arg this size allready in descriptor SYM_TABLE_MANAGER(NAME + ,YES + ,ARG_POSITION + ,0 + ,G_LEX_LEVEL + ,G_CB + ,0 + ,1 + ,1 + ,1 + ,1 + ,1 + ,1 + ) :(TRY_BIT1_LOOP1) NOT_ARG_A1 V2 BREAK(NUMBERS) SPAN(NUMBERS) . SIZE = SYM_TABLE_MANAGER(NAME + ,NO + ,0 + ,G_BIT_TYPE + ,G_LEX_LEVEL + ,G_CB + ,G_VECTOR_TYPE + ,SIZE + ,1 + ,1 + ,1 + ,1 + ,1 + ,1 + ) :(TRY_BIT1_LOOP1) TRY_BIT2 DCL_LINE P_BIT2 :F(TRY_BIT3) SIZE = 1 TRY_BIT1_LOOP2 V1 BREAK(LETTERS) SPAN(LETTERS) . NAME = :F(RETURNS) ARG_POSITION = ARG_MANAGER(NAME) EQ(ARG_POSITION,0) :S(NOT_ARG_B1) SYM_TABLE_MANAGER(NAME + ,YES + ,ARG_POSITION + ,G_BIT_TYPE + ,G_LEX_LEVEL + ,G_CB + ,G_VECTOR_TYPE + ,SIZE + ,1 + ,1 + ,1 + ,1 + ,1 + ) :(TRY_BIT2_LOOP1) NOT_ARG_B1 SYM_TABLE_MANAGER(NAME + ,NO + ,0 + ,G_BIT_TYPE + ,G_LEX_LEVEL + ,G_CB + ,G_VECTOR_TYPE + ,SIZE + ,1 + ,1 + ,1 + ,1 + ,1 + ,1 + ) :(TRY_BIT1_LOOP1) TRY_DCL_PBIT2_LOOP V1 BREAK(LETTERS) SPAN(LETTERS) . NAME = :F(RETURN) SYM_TABLE_MANAGER(NAME + ,G_BIT_TYPE + ,G_LEX_LEVEL + ,G_CB + ,G_VECTOR_TYPE + ,SIZE + ,1 + ,1 + ,1 + ,1 + ,1 + ) :(TRY_DCL_PBIT2_LOOP) TRY_BIT3 DCL_LINE P_BIT3 :F(TRY_BIT4) V2 BREAK(NUMBERS) SPAN(NUMBERS) . SIZE = V1 BREAK(LETTERS) SPAN(LETTERS) . NAME = SYM_TABLE_MANAGER(NAME + ,G_BIT_TYPE + ,G_LEX_LEVEL + ,G_CB + ,G_VECTOR_TYPE + ,SIZE + ,1 + ,1 + ,1 + ,1 + ,1 + ) :(RETURN) TRY_BIT4 DCL_LINE P_BIT4 :F(TRY_FIX1) SIZE = 1 V1 BREAK(LETTERS) SPAN(LETTERS) . NAME = SYM_TABLE_MANAGER(NAME + ,G_BIT_TYPE + ,G_LEX_LEVEL + ,G_CB + ,G_VECTOR_TYPE + ,SIZE + ,1 + ,1 + ,1 + ,1 + ,1 + ) :(RETURN) TRY_FIX1 DCL_LINE P_FIX1 :F(TRY_FIX2) TRY_FIX2 DCL_LINE P_FIX2 :F(TRY_FIX3) TRY_FIX3 DCL_LINE P_FIX3 :F(TRY_FIX4) TRY_FIX4 DCL_LINE P_FIX4 :F(TRY_FLT1) TRY_FLT1 DCL_LINE P_FLT1 :F(TRY_FLT2) TRY_FLT2 DCL_LINE P_FLT2 :F(TRY_FLT3) TRY_FLT3 DCL_LINE P_FLT3 :F(TRY_FLT4) TRY_FLT4 DCL_LINE P_FLT4 :F(TRY_CHR1) TRY_CHR1 DCL_LINE P_CHR1 :F(TRY_CHR2) TRY_CHR2 DCL_LINE P_CHR2 :F(TRY_CHR3) TRY_CHR3 DCL_LINE P_CHR3 :F(TRY_CHR4) TRY_CHR4 DCL_LINE P_CHR4 :F(FRETURN) *************************************************************** SYMBOL_TABLE_MANAGER() G_ID_COUNT = G_ID_COUNT + 1 G_SYM = G_SYME() OBJ_NAME(G_SYM) = P1 OBJ_DATA_TYPE(G_SYM) = P2 LEX_LEVEL(G_SYM) = P3 BLOCK_NUM(G_SYM) = P4 STRUCT_TYPE(G_SYM) = P5 UB1(G_SYM) = P6 LB1(G_SYM) = P7 UB2(G_SYM) = P8 LB2(G_SYM) = P9 UB3(G_SYM) = P10 LB3(G_SYM) = P11 :(RETURN) *******************************************************************