DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Hard and Floppy Disks

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CR80 Hard and Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦7ec1121c9⟧ TextFile

    Length: 20254 (0x4f1e)
    Types: TextFile
    Names: »PARSER.P«

Derivation

└─⟦b8af24a88⟧ Bits:30005796 CR80 Disc Pack ( MINICAMPS )
    └─ ⟦this⟧ »GENS.D!D_PARSE.D!PARSER.P« 

TextFile


======== COMPILATION STARTED AT:  81:09:01 12:53



======== PARSER.S«nul»«nul»«nul»«nul»«nul»«nul»«nul»«nul»

00.00001 "-----------------------------------------------------------------------
00.00002 "
00.00003 "
00.00004 "  MODULE NAME:      BOTTOM UP PARSER
00.00005 "  MODULE ID NMB:    CSS/210
00.00006 "  MODULE VERSION:   1
00.00007 "  MODULE TYPE:      LINK (SUB)MODULE
00.00008 "  MERGE  FILES:     @**GENS.D*PARSE.D*CHARCLASSTABLE.I
00.00009 "
00.00010 "  SPECIFICATIONS:   -
00.00011 "  AUTHOR/DATE:      LKN/810102
00.00012 "
00.00013 "  DELIVERABLE:      YES
00.00014 "  SOURCE LANGUAGE:  SWELL
00.00015 "  COMPILE COMPUTER: CR80
00.00016 "  TARGET COMPUTER:  CR80
00.00017 "  OPER. SYSTEM:     AMOS
00.00018 "
00.00019 "-----------------------------------------------------------------------
00.00020 "
00.00021 "  CHANGE RECORD
00.00022 "
00.00023 "  VERSION    AUTHOR/DATE    DESCRIPTION OF CHANGE
00.00024 "  -------    -----------    ---------------------
00.00025 "
00.00026 "-----------------------------------------------------------------------
00.00027 "PAGE«ff»00.00028 
00.00028 SUBMODULE BOTTOM_UP_PARSER;
00.00029 
00.00030 
00.00031 "**********************************************************************"
00.00032 "                                                                      "
00.00033 "  THIS MODULE IS A GENERAL TOOL FOR TABLE DRIVEN BOTTOM UP PARSING.   "
00.00034 "                                                                      "
00.00035 "  THE TABLES MAY BE GENERATED BY AN AUTOMATIC PARSE TABLE GENERATOR,  "
00.00036 "  USING SLR1 OR OTHER TECHNIQUES, REQUIRING A SINGLE LOOKAHEAD SYM-   "
00.00037 "  BOL, AND USING THE ACTIONS:  REDUCE, SHIFT/STACK, FAULT AND JUMP.   "
00.00038 "                                                                      "
00.00039 "**********************************************************************"
00.00040 
00.00041 
00.00042 %SOURCE

======== CHARCLASSTABLE.I


======== PARSER.S«nul»«nul»«nul»«nul»«nul»«nul»«nul»«nul»

00.00042 
00.00043 
00.00044 CONST
00.00045   MAXSYMBOLLENGTH = 132;
00.00046   SP =               32;
00.00047 
00.00048 
00.00049 TYPE
00.00050   PARSE_ERRORS =
00.00051     ( UNKNOWN_SYMBOL,
00.00052       CONST_OVERFLOW,
00.00053       UNEXPECTED_SYMBOL,
00.00054       STRING_SYNTAX,
00.00055       STRING_SIZE,
00.00056       PARSESTACKFULL,
00.00057       UNRECOVERABLE );
00.00058   SYMBOLTYPE =
00.00059     ( EMPTY,
00.00060       NAME,
00.00061       CONSTANT,
00.00062       STRING,
00.00063       ERRORSYM );
00.00064   ACTIONTYPE =
00.00065     ( REDUCE,
00.00066       SHIFT,
00.00067       FAULT,
00.00068       JUMP );
00.00069   STRINGSTATES =
00.00070     ( INSTRING,
00.00071       AFTERLEFTPAR,
00.00072       INCHARVALUE,
00.00073       BEFORERIGHTPAR );
00.00074 
00.00075   TABLEHEAD =
00.00076     RECORD
00.00077       SAVEREGS: ARRAY [0..6] OF INTEGER;
00.00078       TABLELINK, ITEMSIZE, STACKLIMIT, RECOVERING, WINDOW1, WINDOW2,
00.00079       PRODUCTIONS, ACTIONS, SCANENTRIES, RECOVERSYMBOLS: INTEGER;
00.00080     END;
00.00081   STACKENTRY =
00.00082     RECORD
00.00083       ACTION: INTEGER;
00.00084     END;
00.00085   SCANENTRY =
00.00086     RECORD
00.00087       CH, SYMBOL, ALTERNATIVE, NEXT: INTEGER;
00.00088     END;
00.00089   ACTIONENTRY =
00.00090     RECORD
00.00091       SYMBACTION, OBJECT: INTEGER;
00.00092     END;
00.00093   PRODUCTIONENTRY =
00.00094     RECORD
00.00095       SYMBLENGTH: INTEGER;
00.00096     END;
00.00097 
00.00098 
00.00099 VAR
00.00100   TABLEPTR,           "POINTER TO PARSE TABLE HEADER (TABLEHEAD)
00.00101   CURRCHAR,           "LAST SCANNED CHARACTER
00.00102   CURRCLASS:          "CLASS OF LAST SCANNED CHARACTER
00.00103             INTEGER;
00.00104 
00.00105 EXPORT VAR
00.00106   SYMBOLBUF: ARRAY [0..MAXSYMBOLLENGTH+6] OF CHAR;
00.00107 
00.00108 INIT
00.00109   CURRCLASS = IGNORE;
00.00110 
00.00111 
00.00112 
00.00113 IMPORT PROCEDURE IN_BYTE
00.00114 "====================="
00.00115                (R3;  "CHARACTER VALUE (RETURN)
00.00116                 R6); "LINK
00.00117 
00.00118 
00.00119 
00.00120 PROCEDURE GETCHAR
00.00121 "==============="
00.00122                (R0;  "CHARACTER VALUE (RETURN)
00.00123                 R7;  "CHARACTER CLASS (RETURN)
00.00124                 R6); "LINK
00.00125 VAR
00.00126   SAVER3, SAVER4, SAVER6: INTEGER;
00.00127 BEGIN
00.00128   R3=>SAVER3;
00.00129   R4=>SAVER4;
00.00130   R6=>SAVER6;
00.00131   REPEAT
00.00132     IN_BYTE(R3, R6);
00.00133     R3 EXTRACT 7;
00.00134     CHARCLASSTABLE[R3=>R7]=>R0=>R7;
00.00135   UNTIL R7 <> SKIP;
00.00136   R7=>CURRCLASS;
00.00137   R3=>R0=>CURRCHAR;
00.00138   SAVER3=>R3;
00.00139   SAVER4=>R4;
00.00140   EXIT(SAVER6);
00.00141 END;
00.00142 
00.00143 
00.00144 
00.00145 PROCEDURE SEMANTICS
00.00146 "================="
00.00147                (R1;  "SEMANTIC ACTION NO
00.00148                 R2;  "ATTRIBUTE
00.00149                 R5;  "PARSE STACK POINTER
00.00150                 R6); "LINK
00.00151                      "R4 IS DESTROYED AT RETURN
00.00152 BEGIN
00.00153   TABLEPTR=>R4;
00.00154   EXIT(R4@TABLEHEAD.SAVEREGS[4]);
00.00155 END;
00.00156 
00.00157 
00.00158 
00.00159 PROCEDURE NEXTSYMBOL
00.00160 "=================="
00.00161                (R1;  "SYMBOL NUMBER (RETURN)
00.00162                 R2;  "ATTRIBUTE (RETURN)
00.00163                 R6); "LINK
00.00164 LABEL NEWSYMBOL;
00.00165 VAR
00.00166   ATTRIBUTE: LONG;
00.00167   SAVER0, SAVER3, SAVER4, SAVER5, SAVER6, SAVER7: INTEGER;
00.00168   STRINGSTATE, STRINGPOS: INTEGER;
00.00169 BEGIN
00.00170   R0=>SAVER0;
00.00171   R3=>SAVER3;
00.00172   R4=>SAVER4;
00.00173   R5=>SAVER5;
00.00174   R6=>SAVER6;
00.00175   R7=>SAVER7;
00.00176   CURRCHAR=>R0;
00.00177   CURRCLASS=>R7;
00.00178 NEWSYMBOL:
00.00179   WHILE R7 = IGNORE DO GETCHAR(R0, R7, R6);
00.00180 
00.00181   CASE R7:CHARCLASS OF
00.00182 
00.00183   ALFA:
00.00184     BEGIN
00.00185       TABLEPTR=>R4;
00.00186       R4+R4@TABLEHEAD.SCANENTRIES+SIZE(SCANENTRY);
00.00187       IF R0 >= 'a' LOGAND R0 < ('z'+1) THEN
00.00188         R0 - ('a' - 'A');
00.00189       WHILE R4@SCANENTRY.CH <> R0 LOGAND R4@SCANENTRY.CH <> 0 DO
00.00190         R4+R4@SCANENTRY.ALTERNATIVE;
00.00191       R0=>SYMBOLBUF[0=>R5];
00.00192       GETCHAR(R0, R7, R6);
00.00193       WHILE R7 < DELIMITER DO
00.00194       BEGIN
00.00195         R4+R4@SCANENTRY.NEXT;
00.00196         IF R0 >= 'a' LOGAND R0 < ('z'+1) THEN
00.00197           R0 - ('a' - 'A');
00.00198         IF R5 < MAXSYMBOLLENGTH THEN R0=>SYMBOLBUF[R5+1];
00.00199         WHILE R4@SCANENTRY.CH <> R0 LOGAND R4@SCANENTRY.CH <> 0 DO
00.00200           R4+R4@SCANENTRY.ALTERNATIVE;
00.00201         GETCHAR(R0, R7, R6);
00.00202       END;
00.00203       R4@SCANENTRY.SYMBOL=>R1;
00.00204       IF R1 = 0 LOGOR R1 = ERRORSYM THEN
00.00205       BEGIN
00.00206         NAME=>R1;
00.00207         0=>R2;
00.00208         R2=>SYMBOLBUF[R5+1];
00.00209         R2=>SYMBOLBUF[R5+1];
00.00210       END;
00.00211     END;
00.00212 
00.00213   NUMERIC:
00.00214     BEGIN
00.00215       ADDRESS(ATTRIBUTE)=>R5;
00.00216       0=>R5@INTEGER;
00.00217       10=>R1;
00.00218       REPEAT
00.00219         IF R5@INTEGER >= 6554 LOGOR
00.00220           R5@INTEGER >= 6553 LOGAND R0 >= '6'
00.00221         THEN SEMANTICS(ERRORSYM=>R1, CONST_OVERFLOW=>R2, R5, R6) ELSE
00.00222         BEGIN
00.00223           R5@LONG*R1;
00.00224           R5@INTEGER+(R0-'0');
00.00225         END;
00.00226         GETCHAR(R0, R7, R6);
00.00227       UNTIL R7 <> NUMERIC;
00.00228       CONSTANT=>R1;
00.00229       R5@INTEGER=>R2;
00.00230     END;
00.00231 
00.00232   DELIMITER:
00.00233     BEGIN
00.00234       TABLEPTR=>R4;
00.00235       R4+R4@TABLEHEAD.SCANENTRIES+SIZE(SCANENTRY);
00.00236       WHILE R4@SCANENTRY.CH <> R0 LOGAND R4@SCANENTRY.CH <> 0 DO
00.00237         R4+R4@SCANENTRY.ALTERNATIVE;
00.00238       R4=>R5;
00.00239       IF R4@SCANENTRY.NEXT=>R6 < 0 THEN IGNORE=>R7=>CURRCLASS ELSE
00.00240       GETCHAR(R0, R7, R6);
00.00241       WHILE R7 = DELIMITER LOGAND R4@SCANENTRY.CH <> 0 DO
00.00242       BEGIN
00.00243         R4=>R5;
00.00244         R4+R4@SCANENTRY.NEXT;
00.00245         WHILE R4@SCANENTRY.CH <> R0 LOGAND R4@SCANENTRY.CH <> 0 DO
00.00246           R4+R4@SCANENTRY.ALTERNATIVE;
00.00247         IF R4@SCANENTRY.CH <> 0 THEN
00.00248         BEGIN
00.00249           R4=>R5;
00.00250           IF R4@SCANENTRY.NEXT=>R6 < 0 THEN IGNORE=>R7=>CURRCLASS ELSE
00.00251           GETCHAR(R0, R7, R6);
00.00252         END;
00.00253       END;
00.00254       R5@SCANENTRY.SYMBOL=>R1;
00.00255       IF R1 = 0 THEN
00.00256       BEGIN
00.00257         ERRORSYM=>R1;
00.00258         SEMANTICS(R1, UNKNOWN_SYMBOL=>R2, R5, R6);
00.00259       END;
00.00260     END;
00.00261 
00.00262   COMMENTCHAR:
00.00263     BEGIN
00.00264       REPEAT
00.00265         GETCHAR(R0, R7, R6);
00.00266       UNTIL R7 = COMMENTCHAR LOGOR R0 < SP;
00.00267       IGNORE=>R7;
00.00268       GOTO NEWSYMBOL;
00.00269     END;
00.00270 
00.00271   STRINGCHAR:
00.00272     BEGIN
00.00273       -1=>R5;
00.00274       INSTRING=>R6=>STRINGSTATE;
00.00275       REPEAT
00.00276         GETCHAR(R0, R7, R6);
00.00277         WHILE R7 <> STRINGCHAR LOGAND R0 >= SP DO
00.00278         BEGIN
00.00279           R0=>SYMBOLBUF[R5+1];
00.00280           IF R5 >= MAXSYMBOLLENGTH THEN
00.00281           BEGIN
00.00282             SEMANTICS(ERRORSYM=>R1, STRING_SIZE=>R2, R5, R6);
00.00283             -1=>R5;
00.00284           END;
00.00285           CASE STRINGSTATE=>R6 OF
00.00286           INSTRING:
00.00287             IF R0 = '(' THEN
00.00288             BEGIN
00.00289               R5=>STRINGPOS;
00.00290               AFTERLEFTPAR=>R6=>STRINGSTATE;
00.00291             END;
00.00292           AFTERLEFTPAR:
00.00293             IF R0 = ':' THEN
00.00294             BEGIN
00.00295               ADDRESS(ATTRIBUTE)=>R2;
00.00296               0=>R2@INTEGER;
00.00297               10=>R1;
00.00298               INCHARVALUE=>R6=>STRINGSTATE;
00.00299             END ELSE
00.00300             IF R0 <> '(' THEN INSTRING=>R6=>STRINGSTATE;
00.00301           INCHARVALUE:
00.00302             BEGIN
00.00303               IF R7 = NUMERIC THEN
00.00304               BEGIN
00.00305                 R2@LONG*R1;
00.00306                 R2@INTEGER+(R0-'0');
00.00307                 IF R2@INTEGER >= 128 THEN INSTRING=>R6;
00.00308               END ELSE
00.00309               IF R0 = ':' THEN BEFORERIGHTPAR=>R6;
00.00310               R6=>STRINGSTATE;
00.00311             END;
00.00312           BEFORERIGHTPAR:
00.00313             BEGIN
00.00314               IF R0 = ')' THEN R2@INTEGER=>R2=>SYMBOLBUF[STRINGPOS=>R5];
00.00315               INSTRING=>R6=>STRINGSTATE;
00.00316             END;
00.00317           END;
00.00318           GETCHAR(R0, R7, R6);
00.00319         END;
00.00320         IF R7 <> STRINGCHAR
00.00321         THEN SEMANTICS(ERRORSYM=>R1, STRING_SYNTAX=>R2, R5, R6) ELSE
00.00322         BEGIN
00.00323           GETCHAR(R0, R7, R6);
00.00324           IF R5 >= MAXSYMBOLLENGTH THEN
00.00325           BEGIN
00.00326             SEMANTICS(ERRORSYM=>R1, STRING_SIZE=>R2, R5, R6);
00.00327             -1=>R5;
00.00328           END ELSE
00.00329           IF R7 = STRINGCHAR THEN R0=>SYMBOLBUF[R5+1] ELSE
00.00330           BEGIN
00.00331             WHILE R7 = IGNORE DO GETCHAR(R0, R7, R6);
00.00332             IF R0 = '&' THEN
00.00333             BEGIN
00.00334               REPEAT GETCHAR(R0, R7, R6) UNTIL R7 <> IGNORE;
00.00335               IF R7 <> STRINGCHAR
00.00336               THEN SEMANTICS(ERRORSYM=>R1, STRING_SYNTAX=>R2, R5, R6);
00.00337             END;
00.00338           END;
00.00339         END;
00.00340       UNTIL R7 <> STRINGCHAR;
00.00341       STRING=>R1;
00.00342       0=>R0=>SYMBOLBUF[R5+1];
00.00343       R5=>R2;
00.00344       R0=>SYMBOLBUF[R5+1];
00.00345     END;
00.00346 
00.00347   HEXCHAR:
00.00348     BEGIN
00.00349       GETCHAR(R0, R7, R6);
00.00350       0=>R2;
00.00351       WHILE R7 < DELIMITER LOGAND R0 < 'G' DO
00.00352       BEGIN
00.00353         IF R7 = NUMERIC THEN R0-'0' ELSE R0-('A'-10);
00.00354         IF R2 >= #1000 THEN SEMANTICS(ERRORSYM=>R1, CONST_OVERFLOW=>R2, R5, R6)
00.00355         ELSE R2 SHIFTLL 4 + R0;
00.00356         GETCHAR(R0, R7, R6);
00.00357       END;
00.00358       CONSTANT=>R1;
00.00359     END;
00.00360 
00.00361   ESCAPE:
00.00362     BEGIN
00.00363       EMPTY=>R1;
00.00364       IGNORE=>R7=>CURRCLASS;
00.00365     END;
00.00366 
00.00367 
00.00368   END; "CASE"
00.00369 
00.00370   SAVER0=>R0;
00.00371   SAVER3=>R3;
00.00372   SAVER4=>R4;
00.00373   SAVER5=>R5;
00.00374   SAVER6=>R6;
00.00375   SAVER7=>R7;
00.00376   SAVER6=>R6;
00.00377   EXIT(R6);
00.00378 END;  "NEXTSYMBOL"
00.00379 
00.00380 
00.00381 
00.00382 PROCEDURE TESTACCEPT
00.00383 "=================="
00.00384                (R1;  "SYMBOL NO (CALL)
00.00385                      "LEGAL FOLLOWERSYMBOL (RETURN)
00.00386                 R0;  "FOLLOWERCOUNT (RETURN)
00.00387                 R3;  "FOUND (RETURN),  0 = FALSE
00.00388                 R4;  "PARSE STATE
00.00389                 R6); "LINK
00.00390 VAR
00.00391   SAVER4, SAVER5, SAVER6, SAVER7: INTEGER;
00.00392 BEGIN
00.00393   R4=>SAVER4;
00.00394   R5=>SAVER5;
00.00395   R6=>SAVER6;
00.00396   R7=>SAVER7;
00.00397   0=>R3;  "SYMBOL NOT FOUND"
00.00398   0=>R7;  "NO FOLLOWER SYMBOL"
00.00399   0=>R0;  "LEGAL FOLLOWER COUNT"
00.00400   REPEAT
00.00401     R4@ACTIONENTRY.SYMBACTION=>R6 SHIFTRL 4;  "SYMBOL NO"
00.00402     R4@ACTIONENTRY.SYMBACTION=>R5 EXTRACT 4;  "ACTION"
00.00403     IF R6 = 0 THEN
00.00404     BEGIN
00.00405       IF R5 = JUMP THEN R4+R4@ACTIONENTRY.OBJECT ELSE 0=>R4;
00.00406     END ELSE
00.00407     BEGIN
00.00408       IF R6 = R1 THEN R1=>R3; "SYMBOL FOUND"
00.00409       R6=>R7;
00.00410       R0+1;
00.00411       R4+SIZE(ACTIONENTRY);
00.00412     END;
00.00413   UNTIL R4 = 0;
00.00414   R7=>R1;  "FOLLOWER SYMBOL"
00.00415   SAVER4=>R4;
00.00416   SAVER5=>R5;
00.00417   SAVER6=>R6;
00.00418   SAVER7=>R7;
00.00419   EXIT(R6);
00.00420 END;
00.00421 
00.00422 
00.00423 
00.00424 PROCEDURE RECOVER
00.00425 "==============="
00.00426                (R4;  "PARSE STATE
00.00427                 R5;  "PARSE STACK POINTER
00.00428                 R6); "LINK
00.00429 VAR
00.00430   SAVER0, SAVER1, SAVER2, SAVER3, SAVER5, SAVER6, SAVER7: INTEGER;
00.00431 BEGIN
00.00432   R0=>SAVER0;
00.00433   R1=>SAVER1;
00.00434   R2=>SAVER2;
00.00435   R3=>SAVER3;
00.00436   R5=>SAVER5;
00.00437   R6=>SAVER6;
00.00438   R7=>SAVER7;
00.00439   TABLEPTR=>R7;
00.00440   SEMANTICS(ERRORSYM=>R1, UNEXPECTED_SYMBOL=>R2, R5, R6);
00.00441   IF R7@TABLEHEAD.WINDOW2=>R1 = 0
00.00442   LOGOR R1 = R7@TABLEHEAD.WINDOW1 THEN
00.00443   BEGIN
00.00444     NEXTSYMBOL(R1, R2, R6);
00.00445     R1=>R7@TABLEHEAD.WINDOW2;
00.00446   END;
00.00447   ERRORSYM=>R0=>R7@TABLEHEAD.WINDOW1;
00.00448   R7=>R6+R7@TABLEHEAD.RECOVERSYMBOLS=>R4;
00.00449   WHILE R6@INTEGER <> R1 LOGAND R6@INTEGER <> 0 DO R6+1;
00.00450   IF R6 <> R4 LOGOR R6@INTEGER <> 0  " RECOVER SYMBOLS PRESENT " THEN
00.00451   WHILE R6@INTEGER <> R1 DO
00.00452   BEGIN
00.00453     NEXTSYMBOL(R1, R2, R6);
00.00454     R7=>R6+R7@TABLEHEAD.RECOVERSYMBOLS;
00.00455     WHILE R6@INTEGER <> R1 LOGAND R6@INTEGER <> 0 DO R6+1;
00.00456   END;
00.00457   R1=>R7@TABLEHEAD.WINDOW2;
00.00458   R5+R7@TABLEHEAD.ITEMSIZE;
00.00459   REPEAT
00.00460     R5-(R7@TABLEHEAD.ITEMSIZE=>R4)=>SAVER5;
00.00461     IF R5 >= R7@TABLEHEAD.SAVEREGS[5] THEN
00.00462     BEGIN
00.00463       R5@STACKENTRY.ACTION=>R4;
00.00464       TESTACCEPT(ERRORSYM=>R1, R0, R3, R4, R6);
00.00465     END ELSE
00.00466     BEGIN
00.00467       SEMANTICS(ERRORSYM=>R1, UNRECOVERABLE=>R2, R5, R6);
00.00468       0=>R5=>SAVER5;  "TERMINATE
00.00469     END;
00.00470   UNTIL R3 <> 0 LOGOR R5 = 0;
00.00471   SAVER0=>R0;
00.00472   SAVER1=>R1;
00.00473   SAVER2=>R2;
00.00474   SAVER3=>R3;
00.00475   R5@STACKENTRY.ACTION=>R4;
00.00476   SAVER5=>R5;
00.00477   SAVER6=>R6;
00.00478   SAVER7=>R7;
00.00479   EXIT(R6);
00.00480 END;
00.00481 
00.00482 
00.00483 
00.00484 EXPORT PROCEDURE PARSE
00.00485 "===================="
00.00486               (STACKITEMSIZE, MAXSTACKITEMS: INTEGER;
00.00487                R4;  "ENTRY POINT OF SEMANTICS PROCEDURE
00.00488                R5;  "PARSE STACK BASE
00.00489                R7;  "PARSE TABLE PTR
00.00490                R6); "LINK
00.00491 BEGIN
00.00492   STC(6, R7+7);
00.00493   TABLEPTR=>R0=>R7@TABLEHEAD.TABLELINK;
00.00494   R7=>TABLEPTR;
00.00495   R6@PARSE.STACKITEMSIZE=>R0=>R7@TABLEHEAD.ITEMSIZE;
00.00496   R6@PARSE.MAXSTACKITEMS=>R1;
00.00497   R5=>R3;
00.00498   WHILE R1-1 >= 0 DO R3+R0;
00.00499   R3=>R7@TABLEHEAD.STACKLIMIT;
00.00500   R7=>R4+R7@TABLEHEAD.ACTIONS+SIZE(ACTIONENTRY);
00.00501   R4=>R5@STACKENTRY.ACTION;
00.00502   0=>R1=>R7@TABLEHEAD.WINDOW1;
00.00503   R1=>R7@TABLEHEAD.WINDOW2;
00.00504   R1=>R7@TABLEHEAD.RECOVERING;
00.00505   REPEAT
00.00506     R7@TABLEHEAD.WINDOW1=>R1;
00.00507     R4@ACTIONENTRY.SYMBACTION=>R3 SHIFTRL 4;
00.00508     WHILE R3 <> 0 LOGAND R1 = 0 DO
00.00509     BEGIN
00.00510       NEXTSYMBOL(R1, R2, R6);
00.00511       IF R1 = EMPTY THEN  "ESCAPE"
00.00512       BEGIN
00.00513         R4=>R2;  "SAVE R4
00.00514         SEMANTICS(R1, R2, R5+R7@TABLEHEAD.ITEMSIZE, R6);
00.00515         R2=>R4;  "REESTABLISH R4;
00.00516         (TABLEPTR=>R7)@TABLEHEAD.ITEMSIZE=>R0;
00.00517         R5-R0;
00.00518       END;
00.00519       R1=>R7@TABLEHEAD.WINDOW1;
00.00520       R1=>R7@TABLEHEAD.WINDOW2;
00.00521     END;
00.00522     WHILE R3 <> R1 LOGAND R3 <> 0 DO
00.00523     BEGIN
00.00524       R4+SIZE(ACTIONENTRY);
00.00525       R4@ACTIONENTRY.SYMBACTION=>R3 SHIFTRL 4;
00.00526     END;
00.00527 
00.00528     TABLEPTR=>R7;
00.00529     R4@ACTIONENTRY.SYMBACTION=>R6 EXTRACT 4;
00.00530     CASE R6:ACTIONTYPE OF
00.00531 
00.00532     REDUCE:
00.00533       BEGIN
00.00534         R4@ACTIONENTRY.OBJECT=>R6;  "TAKE PRODUCTION NUMBER"
00.00535         R6+R7+R7@TABLEHEAD.PRODUCTIONS;  "TAKE PRODUCTION TABLE ENTRY"
00.00536         R6@PRODUCTIONENTRY.SYMBLENGTH=>R0 EXTRACT 4;
00.00537         R7@TABLEHEAD.ITEMSIZE=>R1;
00.00538         WHILE R0-1 <> 0 DO R5-R1;  "UPDATE PARSE STACK POINTER
00.00539         R6@PRODUCTIONENTRY.SYMBLENGTH=>R0 SHIFTRL 4;
00.00540         R0=>R7@TABLEHEAD.WINDOW1;
00.00541         R4@ACTIONENTRY.OBJECT=>R1;  "PRODUCTION NO"
00.00542         R1+4;  "SEMANTIC ACTION NO"
00.00543         SEMANTICS(R1, R2, R5, R6);
00.00544         TABLEPTR=>R7;
00.00545         IF R1 = 5  " FINAL REDUCTION "  THEN 0=>R5
00.00546         ELSE R5-(R7@TABLEHEAD.ITEMSIZE=>R0);
00.00547         R5@STACKENTRY.ACTION=>R4;
00.00548       END;
00.00549 
00.00550     SHIFT:
00.00551       BEGIN
00.00552         IF R5+R7@TABLEHEAD.ITEMSIZE >= R7@TABLEHEAD.STACKLIMIT THEN
00.00553         BEGIN
00.00554           SEMANTICS(ERRORSYM=>R1, PARSESTACKFULL=>R2, R5, R6);
00.00555           0=>R5;  "TERMINATE
00.00556         END ELSE
00.00557         BEGIN
00.00558           R4+R4@ACTIONENTRY.OBJECT;  "NEXT ACTION"
00.00559           R4=>R5@STACKENTRY.ACTION;
00.00560           IF R1 < ERRORSYM THEN SEMANTICS(R1, R2, R5, R6);
00.00561           R5@STACKENTRY.ACTION=>R4;
00.00562           IF R7@TABLEHEAD.WINDOW2=>R0 = R7@TABLEHEAD.WINDOW1=>R1
00.00563           THEN 0=>R0=>R7@TABLEHEAD.WINDOW2;
00.00564           IF R1 = ERRORSYM THEN 1=>R0 ELSE 0=>R0;
00.00565           R0=>R7@TABLEHEAD.RECOVERING;  "SET RECOVERING (TRUE OR FALSE = 1/0)"
00.00566           R7@TABLEHEAD.WINDOW2=>R0=>R7@TABLEHEAD.WINDOW1;
00.00567         END;
00.00568       END;
00.00569 
00.00570     JUMP:
00.00571       BEGIN
00.00572         R4+R4@ACTIONENTRY.OBJECT;
00.00573       END;
00.00574 
00.00575     FAULT:
00.00576       BEGIN
00.00577         RECOVER(R4, R5, R6);
00.00578       END;
00.00579 
00.00580     END;  "CASE"
00.00581   UNTIL R5 = 0;
00.00582   TABLEPTR=>R7;
00.00583   R7@TABLEHEAD.TABLELINK=>R0=>TABLEPTR;
00.00584   UNS(6, R7);
00.00585   R7-7;
00.00586   EXIT(R6, SIZE(PARSE));
00.00587 END;  "PARSE"
00.00588 
00.00589 
00.00590 ENDMODULE

LINES:     637


      CODESIZE  VARSIZE  CONSTSIZE  TEMPSIZE
      --------  -------  ---------  --------
       #0294     #0060     #0000     #0000