BASPAR: DO; /* PARSER MODULE FOR THE BASIC - E COMPILER */ $INCLUDE (:F1:BASCOM.LIT) /* GLOBAL PROCEDURES */ PRINT: PROCEDURE(A) EXTERNAL; DECLARE A ADDRESS; END PRINT; CRLF: PROCEDURE EXTERNAL; END CRLF; IN$SYMTBL: PROCEDURE EXTERNAL; END IN$SYMTBL; IN$SCANNER: PROCEDURE EXTERNAL; END IN$SCANNER; IN$SYN: PROCEDURE EXTERNAL; END IN$SYN; SCANNER: PROCEDURE EXTERNAL; END SCANNER; SYNTHESIZE: PROCEDURE(PROD) EXTERNAL; DECLARE PROD BYTE; END SYNTHESIZE; ERROR: PROCEDURE(ERR) EXTERNAL; DECLARE ERR ADDRESS; END ERROR; /* GLOBAL VARIABLES */ DECLARE /* SCANNER PARAMETERS USED IN PARSING */ TOKEN BYTE EXTERNAL, SUBTYPE BYTE EXTERNAL, HASHCODE BYTE EXTERNAL, ACCLEN BYTE EXTERNAL, ACCUM(IDENTSIZE) BYTE EXTERNAL, /* PASS CONTROLS */ LISTSOURCE BYTE EXTERNAL, (PASS1, PASS2) BYTE EXTERNAL; /* LOCAL VARIABLES AND PROCEDURES */ INITIALIZE: PROCEDURE; CALL IN$SYMTBL; CALL IN$SYN; CALL IN$SCANNER; END INITIALIZE; DECLARE I INDEXSIZE, J INDEXSIZE, K INDEXSIZE, INDEX BYTE; GETIN1: PROCEDURE INDEXSIZE; RETURN INDEX1(STATE); END GETIN1; GETIN2: PROCEDURE INDEXSIZE; RETURN INDEX2(STATE); END GETIN2; INCSP: PROCEDURE; IF (SP := SP + 1) = LENGTH(STATESTACK) THEN CALL ERROR('SO'); RETURN; END INCSP; LOOKAHEAD: PROCEDURE; IF NOLOOK THEN DO; CALL SCANNER; NOLOOK = FALSE; END; RETURN; END LOOKAHEAD; SET$VARC$I: PROCEDURE(I); DECLARE I BYTE; /* SET VARC AND INCREMENT VARINDEX */ VARC(VARINDEX) = I; IF (VARINDEX := VARINDEX + 1) > LENGTH(VARC) THEN CALL ERROR('VO'); END SET$VARC$I; DECLARE /* PARSE TABLES AND RELATED VARIABLES */ EXTERN LITERALLY 'EXTERNAL', COMPILING BYTE EXTERN, STATE STATESIZE EXTERN, /* CURRENT STATE OF FSM */ STATESTACK(PSTACKSIZE) STATESIZE EXTERN,/* HOLDS STATES DURING PARSE */ HASH(PSTACKSIZE) BYTE EXTERN, /* HASH CODE OF CURRENT SYMBOL */ SYMLOC(PSTACKSIZE) ADDRESS EXTERN, /* CURRENT SYMBOL LOCATION */ SRLOC(PSTACKSIZE) ADDRESS EXTERN, VAR(PSTACKSIZE) BYTE EXTERN, /* INDEX TO VARC */ TYPE(PSTACKSIZE) BYTE EXTERN, /* TYPE OF CURRENT SYMBOL */ STYPE(PSTACKSIZE) BYTE EXTERN, /* SUBTYPE OF CURRENT SYMBOL */ VARC(VARCSIZE) BYTE EXTERN, /* CHARACTERS FOR CURRENT SYMBOL */ VARINDEX BYTE EXTERN, /* CURRENT TOP OF VARC */ SP BYTE EXTERN, /* CURRENT TOP OF STACKS */ MP BYTE EXTERN, /* CURRENT "FRONT" OF PRODUCTIONS */ MPP1 BYTE EXTERN, /* MP + 1 */ NOLOOK BYTE EXTERN; /* TRUE IF NOT LOOKED-AHEAD */ DECLARE MAXRNO LITERALLY '120',/* MAX READ COUNT */ MAXLNO LITERALLY '175',/* MAX LOOK COUNT */ MAXPNO LITERALLY '189',/* MAX PUSH COUNT */ MAXSNO LITERALLY '341',/* MAX STATE COUNT */ STARTS LITERALLY '121',/* START STATE */ PRODNO LITERALLY '152';/* NUMBER OF PRODUCTIONS */ DECLARE READ1(*) BYTE DATA(0,49,10,13,2,49,50,52,53,54,49,13,22,32,2,3,7,27,30 ,49,50,52,53,54,2,3,7,30,49,50,52,53,54,54,52,12,52,2,3,7,49,50,52 ,53,54,12,52,49,49,50,2,3,7,12,30,49,50,52,53,54,2,2,2,9,5,9,49,4,8 ,49,16,20,28,29,31,35,36,37,38,40,42,43,44,45,46,48,49,51,52,49,14,6 ,22,13,52,9,52,9,23,9,21,33,41,16,21,33,36,43,9,21,33,5,9,21,33,5,21 ,33,5,9,21,33,5,9,21,33,6,9,21,33,21,33,39,21,33,41,5,21,33,6,21,33 ,9,6,9,16,17,20,25,26,27,28,29,31,35,36,37,38,40,42,43,44,45,46,48 ,51,52,2,16,20,28,29,31,35,36,37,38,40,42,43,44,45,46,48,51,52,52,13 ,24,11,34,9,2,1,3,7,10,13,15,18,19,3,7,9,0); DECLARE LOOK1(*) BYTE DATA(0,49,0,10,13,0,13,0,11,23,34,0,52,0,12,52,0,49,50,0,6 ,9,11,23,34,0,2,0,2,0,9,0,4,8,0,4,8,0,4,8,0,4,8,0,4,8,0,11,23,34,0 ,14,0,14,0,14,0,9,0,9,0,9,0,9,0,9,0,21,33,0,21,33,0,21,33,0,21,33,0 ,21,33,39,0,21,33,0,21,33,0,21,33,0,23,0,21,33,0,21,33,0,9,0,9,0,6,9 ,0,52,0,11,23,0,11,23,34,0,2,0,11,23,0,52,0,24,0,24,0,11,0,23,0,11,0 ,9,0,2,0,1,3,7,10,13,15,18,19,0,3,7,0,9,0); DECLARE APPLY1(*) BYTE DATA(0,0,0,0,55,105,0,19,0,0,32,47,0,0,3,4,12,14,16,17,20 ,21,22,26,27,34,36,38,40,98,100,102,103,114,116,0,0,46,0,28,0,33,0 ,63,0,5,6,8,9,0,7,10,0,23,0,13,19,32,35,47,55,99,101,105,106,0,0,0,0 ,0,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,99 ,106,0,0,0,0,0,40,0,0,0,0,0,0,62,0,0,74,0,74,0,0,0,0,0,0,0,0,0); DECLARE READ2(*) ADDRESS DATA (0,191,264,260,3,255,256,129,254,253,326,258,329,331,3 ,5,8,31,33,255,256,129,254,253,3,5,8,33,255,256,129,254,253,279,42 ,21,129,3,5,8,255,256,129,254,253,20,129,273,255,256,3,5,8,20,33,255 ,256,129,254,253,247,294,4,335,280,283,320,7,10,327,24,26,268,32,34 ,285,328,125,126,338,38,330,127,128,337,340,275,341,129,325,23,302 ,27,220,130,17,131,13,190,14,223,224,277,24,223,224,328,330,12,223 ,224,246,248,223,224,244,223,224,249,252,223,224,293,295,223,224,316 ,16,223,224,223,224,36,223,224,37,288,223,224,317,223,224,15,318,319 ,24,25,26,29,30,339,268,32,34,285,328,125,126,338,38,330,127,128,337 ,340,341,129,251,24,26,268,32,34,285,328,125,126,338,38,330,127,128 ,337,340,341,129,45,22,28,124,276,286,282,122,6,9,123,257,259,261 ,265,6,9,11,0); DECLARE LOOK2(*) ADDRESS DATA (0,1,176,2,2,263,18,262,177,177,177,19,334,333,35,35 ,178,39,39,179,180,180,180,180,180,40,41,245,43,181,44,332,49,49,231 ,50,50,234,51,51,235,52,52,232,53,53,233,182,182,182,55,57,236,58 ,237,59,238,66,308,68,300,69,299,70,301,72,296,76,76,297,77,77,309 ,78,78,219,84,84,312,85,85,85,183,87,87,336,88,88,298,89,89,310,278 ,91,93,93,313,94,94,269,95,321,96,322,97,97,184,99,185,186,186,101 ,314,314,314,102,104,250,187,187,105,106,188,109,221,110,222,111,193 ,274,112,113,272,115,284,117,189,118,118,118,118,118,118,118,118,229 ,119,119,230,120,290); DECLARE APPLY2(*) ADDRESS DATA (0,0,161,71,169,170,168,199,198,200,218,267,201,98,80 ,90,151,152,92,155,83,86,154,74,150,75,156,146,147,148,149,153,82,79 ,81,73,46,167,166,226,225,228,227,174,173,133,135,134,136,132,139 ,140,138,240,239,305,64,64,304,64,64,304,64,64,304,241,114,243,116 ,163,60,242,63,202,61,47,266,194,271,164,137,197,172,108,107,204,65 ,171,287,196,175,292,291,103,205,145,206,210,165,143,144,142,207,159 ,141,307,100,160,162,208,213,56,62,158,157,209,323,48,324,54,203,67 ,216,212,211,195,214,215); DECLARE INDEX1(*) ADDRESS DATA (0,1,2,24,24,4,4,4,4,4,4,34,24,36,24,10,24,24,11,168 ,24,24,24,4,12,14,24,24,24,33,34,35,36,37,24,45,24,47,24,48,50,60,61 ,62,63,64,24,36,66,67,67,67,67,67,69,70,89,90,90,90,91,92,89,37,93 ,94,95,96,97,97,97,98,99,100,103,108,100,100,100,111,115,118,122,126 ,100,130,133,100,100,100,136,100,139,100,100,142,142,143,24,36,24 ,145,24,24,167,168,36,186,187,188,188,189,189,189,24,191,24,192,193 ,201,203,1,3,6,8,12,14,17,20,26,28,30,32,35,38,41,44,47,51,53,55,57 ,59,61,63,65,67,70,73,76,79,83,86,89,92,94,97,100,102,104,107,109 ,112,116,118,121,123,125,127,129,131,133,135,137,146,149,192,217,306 ,303,311,289,217,270,315,306,217,217,306,281,1,2,2,3,3,3,3,3,4,4,7,7 ,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,9,10,13,14,14,36,36,37,37,39,39,41 ,41,43,43,43,43,43,45,45,45,50,50,53,53,53,53,55,55,66,66,67,67,68 ,68,69,69,70,70,72,72,72,72,72,72,72,72,72,73,74,75,76,76,77,77,77 ,78,78,79,80,81,82,83,83,84,84,85,86,86,87,88,88,89,90,90,91,93,93 ,94,95,95,96,96,97,98,98,99,99,99,102,102,103,103,103,104,104,105 ,105,106,106,108,108,109,110,110,111,112,113,113,115,116,116,118,118 ,120,120,121,121,122,123,124,125,126,127); DECLARE INDEX2(*) BYTE DATA(0,1,2,9,9,6,6,6,6,6,6,1,9,1,9,1,9,9,1,18,9,9,9,6,2 ,10,9,9,9,1,1,1,1,8,9,2,9,1,9,2,10,1,1,1,1,2,9,1,1,2,2,2,2,2,1,19,1 ,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,3,5,3,2,2,2,4,3,4,4,4,2,3,3,2,2,2,3 ,2,3,2,2,1,1,2,9,1,9,22,9,9,1,18,1,1,1,1,1,1,2,1,9,1,9,1,8,2,1,2,3,2 ,4,2,3,3,6,2,2,2,3,3,3,3,3,4,2,2,2,2,2,2,2,2,3,3,3,3,4,3,3,3,2,3,3,2 ,2,3,2,3,4,2,3,2,2,2,2,2,2,2,2,9,3,2,1,19,35,39,40,43,55,85,97,99 ,101,105,106,117,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,1,1,1,0,2,0,0,0,2,0,1,0,2,0,2,2,1,1,0,2,2,0,2,0,0,0,2,0,2,1,2,2 ,0,1,2,0,0,0,0,0,1,0,1,0,0,0,1,0,3,1,0,1,0,0,1,5,1,1,2,2,3,1,2,0,0,2 ,1,0,2,1,2,0,1,0,2,2,1,2,1,0,2,2,1,2,1,0,0,2,0,2,2,0,2,0,0,2,0,0,2,4 ,0,0,1,1,1,2,2,0,2,1,0,1,0,1,1,0,0,2,3,0,0,0,0,0); /* ********************************************************* * * * EXECUTION OF THE COMPILER BEGINS HERE * * * * THE OUTPUT FILE IS CREATED AND THE * * SYMBOLTABLE, SYNTHESIZE AND SCANNER * * ARE INITIALIZED. THEN THE PARSER * * BEGINS PROCESSING THE SOURCE PROGRAM. * * PROCESSING CONTINUES UNTIL AN END * * STATEMENT IS INCOUNTERED OR UNTIL THE * * END OF THE SOURCE FILE IS DETECTED. * * AT THIS TIME THE THREE MAIN PROCEDURES * * ARE INITIALIZED FOR PASS 2 AND THE * * PARSER PROCESSES THE SOURCE FILE A * * SECOND TIME. AT THE END OF EACH STATE- * * MENT (WHICH TO THE PARSER IS A PROGRAM) * * AND IF AN ERROR IS DETECTED THE PARSER * * VARIABLES ARE REINITIALIZED BY SETTING * * COMPILING FALSE. * * * ********************************************************* */ CALL PRINT(.('BASIC-E COMPILER VER 2.1$')); CALL CRLF; CALL INITIALIZE; /* INITIALIZE MAJOR SYSTEMS PRIOR TO PARSING */ DO FOREVER; /* THIS LOOP CONTROLS THE 2 PASSES OF THE COMPILER */ DO WHILE (PASS1 OR PASS2);/* THIS LOOP REINITIALIZES ON ERR OR OOC */ /* INITIALIZE VARIABLES */ COMPILING,NOLOOK=TRUE; STATE=STARTS; SP=255; VARINDEX, VAR(0) = 0; DO WHILE COMPILING; IF STATE <= MAXRNO THEN /* READ STATE */ DO; CALL INCSP; STATESTACK(SP) = STATE; I = GETIN1; CALL LOOKAHEAD; J = I + GETIN2 - 1; DO I = I TO J; IF READ1(I) = TOKEN THEN /* SAVE TOKEN */ DO; VAR(SP) = VARINDEX; DO INDEX = 0 TO ACCLEN; CALL SET$VARC$I(ACCUM(INDEX)); END; HASH(SP) = HASHCODE; STYPE(SP) = SUBTYPE; STATE = READ2(I); NOLOOK = TRUE; I = J; END; ELSE IF I = J THEN CALL ERROR('NP'); END; END; ELSE IF STATE > MAXPNO THEN /* APPLY PRODUCTION STATE */ DO; MP = SP - GETIN2; MPP1 = MP + 1; CALL SYNTHESIZE(STATE - MAXPNO); IF COMPILING THEN DO; SP = MP; I = GETIN1; VARINDEX = VAR(SP); J = STATESTACK(SP); DO WHILE (K := APPLY1(I)) <> 0 AND J <> K; I = I + 1; END; IF(STATE := APPLY2(I)) = 0 THEN COMPILING = FALSE; END; END; ELSE IF STATE<= MAXLNO THEN /* LOOKAHEAD STATE */ DO; I = GETIN1; CALL LOOKAHEAD; DO WHILE (K := LOOK1(I)) <> 0 AND TOKEN <> K; I = I + 1; END; STATE = LOOK2(I); END; ELSE /* PUSH STATE */ DO; CALL INCSP; STATESTACK(SP) = GETIN2; STATE = GETIN1; END; END; /* OF WHILE COMPILING */ END; /* OF WHILE PASS1 OR PASS2 */ LISTSOURCE = TRUE; CALL INITIALIZE; PASS2 = TRUE; END; /* OF DO FOREVER */ END; /* OF PARSER MODULE */