*PARSER                                                 HEADER  FUPTPA  0001.000
         M.PGM     TPARSE,MPX-32,3.6.1,00                               0002.000
         SPACE                                                          0003.000
         CSECT                                                          0004.000
         SPACE                                                          0005.000
*                                                                       0006.000
************************************************************************0007.000
*                                                                      *0008.000
*                    PROPRIETARY INFORMATION                           *0009.000
*                    -----------------------                           *0010.000
*   THE INFORMATION CONTAINED HEREIN IS PROPRIETARY TO ENCORE          *0011.000
*   COMPUTER CORPORATION AND/OR ITS VENDORS, AND ITS USE, DISCLOSURE,  *0012.000
*   OR DUPLICATION IS SUBJECT TO THE RESTRICTIONS STATED IN THE        *0013.000
*   STANDARD ENCORE COMPUTER CORPORATION LICENSE TERMS AND CONDITIONS  *0014.000
*   OR THE APPROPRIATE THIRD-PARTY SUBLICENSE AGREEMENT.               *0015.000
*                                                                      *0016.000
*                       RESTRICTED RIGHTS                              *0017.000
*                       -----------------                              *0018.000
*   USE, DUPLICATION, OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT       *0019.000
*   TO RESTRICTIONS AS SET FOURTH IN SUBDIVISION (c) (1) (ii) OF       *0020.000
*   THE RIGHTS IN TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT       *0021.000
*   252.227.7013                                                       *0022.000
************************************************************************0023.000
* (C) COPYRIGHT 1989 ENCORE COMPUTER CORPORATION                       *0024.000
*     ALL RIGHTS RESERVED                                              *0025.000
************************************************************************0026.000
*-                                                                      0027.000
*                                                                       0028.000
*-                                                                      0029.000
* EXTERNAL REFERENCES:                                                  0030.000
*                                                                       0031.000
*        NONE                                                           0032.000
*                                                                       0033.000
*-                                                                      0034.000
* GLOBAL DEFINITIONS:                                                   0035.000
*                                                                       0036.000
         EXT       FUP.0018                                             0037.000
         DEF       TPARSE                                               0038.000
*                                                                       0039.000
*-                                                                      0040.000
* COMMON AREAS:                                                         0041.000
*                                                                       0042.000
*        NONE                                                           0043.000
*                                                                       0044.000
*----                                                                   0045.000
         TITLE     TPARSE                                               0046.000
         PAGE                                                           0047.000
*++++                                                                   0048.000
* ROUTINE: TPARSE                                                       0049.000
*                                                                       0050.000
* INPUTS:                                                               0051.000
*                                                                       0052.000
*        R1: HIGHEST ADDRESS OF STACK AREA.  MUST BE                    0053.000
*            FILE BOUNDED AND CONTAIN 8 WORDS FOR EACH                  0054.000
*            LEVEL OF RECURSION IN THE STATE/TRANSITION                 0055.000
*            TABLE                                                      0056.000
*        R2: BYTE ADDRESS OF STRING TO BE PARSED                        0057.000
*        R3: ADDRESS OF STATE/TRANSITION TABLE                          0058.000
*        R4: LENGTH OF STRING                                           0059.000
*                                                                       0060.000
* IMPLICIT INPUTS:                                                      0061.000
*                                                                       0062.000
*        NONE                                                           0063.000
*                                                                       0064.000
* DESCRIPTION:                                                          0065.000
*                                                                       0066.000
*        TPARSE IS A FINITE STATE PARSER.  IT OPERATES IN A             0067.000
*        MANNER WHERE IT MAY BE IN ONLY ONE OF A FINITE NUMBER          0068.000
*        OF WELL DEFINED STATES AT ANY ONE INSTANCE.                    0069.000
*        THE OPERATION OF TPARSE IS CONTROLLED BY A SET OF              0070.000
*        TABLES AND THE INPUT STRING.  THE TABLES ARE                   0071.000
*        GENERATED BY THE CALLING PROGRAM AND ARE PROVIDED AS           0072.000
*        INPUT TO THE PARSER.  THESE TABLES DEFINE ALL VALID            0073.000
*        STATES FOR THE ASSOCIATED PARSING OPERATION AND THE            0074.000
*        TRANSITIONAL STIMULI THAT ARE LEGAL FOR EACH OF THE            0075.000
*        STATES.  THE TABLES ALSO DEFINE THE NEXT STATE FOR             0076.000
*        EACH VALID STIMULUS ASSOCIATED WITH THE VARIOUS STATES.        0077.000
*        THEY ALSO SPECIFY CALLING PROGRAM ACTION ROUTINES THAT         0078.000
*        ARE TO BE INVOKED WHEN SPECIFIC STATE TRANSITIONS ARE          0079.000
*        MADE.                                                          0080.000
*                                                                       0081.000
* OUTPUTS:                                                              0082.000
*                                                                       0083.000
*        R2: BYTE ADDRESS OF LAST CHARACTER EXAMINED                    0084.000
*        R4: -REMAINING BYTE COUNT                                      0085.000
*        R1,R3,R5-R7: DESTROYED                                         0086.000
*                                                                       0087.000
* IMPLICIT OUTPUTS:                                                     0088.000
*                                                                       0089.000
*        CC1=0: NORMAL COMPLETION                                       0090.000
*        CC1=1: PARSING ERROR                                           0091.000
*                                                                       0092.000
*----                                                                   0093.000
         TITLE     ACTION ROUTINES                                      0094.000
         PAGE                                                           0095.000
*++++                                                                   0096.000
* ROUTINE: ACTION ROUTINES                                              0097.000
*                                                                       0098.000
* INPUTS:                                                               0099.000
*                                                                       0100.000
*        R2: BYTE ADDRESS OF ITEM                                       0101.000
*        R4: LENGTH OF ITEM, IN BYTES                                   0102.000
*        R5: LAST CHARACTER SCANNED                                     0103.000
*        R7: <KEYWD>  KEYWORD VALUE                                     0104.000
*            <DNUMB>  CONVERTED DECIMAL NUMBER                          0105.000
*            <HNUMB>  CONVERTED HEXADECIMAL NUMBER                      0106.000
*                                                                       0107.000
* IMPLICIT INPUTS:                                                      0108.000
*                                                                       0109.000
*        CC1=0                                                          0110.000
*                                                                       0111.000
* DESCRIPTION:                                                          0112.000
*                                                                       0113.000
*        THIS ROUTINE IS A SUBSET OF THE PARSER.  IT IS USED BY         0114.000
*        THE PARSER IN ORDER TO PERFORM ACTION ROUTINES WHICH           0115.000
*        ARE TO BE PERFORMED UPON FINDING A SUCCESSFUL                  0116.000
*        TRANSITION FROM ONE STATE TO ANOTHER STATE.                    0117.000
*                                                                       0118.000
* OUTPUTS:                                                              0119.000
*                                                                       0120.000
*        R1: MUST BE RESTORED                                           0121.000
*                                                                       0122.000
* IMPLICIT OUTPUTS:                                                     0123.000
*                                                                       0124.000
*        CC1=0: NORMAL COMPLETION                                       0125.000
*        CC1=1: ERROR DETECTED                                          0126.000
*                                                                       0127.000
*----                                                                   0128.000
         TITLE     LOCAL VARIABLES                                      0129.000
         SPACE                                                          0130.000
*0       EQU       0                                                    0131.000
*1       EQU       1                                                    0132.000
*2       EQU       2                                                    0133.000
*3       EQU       3                                                    0134.000
*4       EQU       4                                                    0135.000
*5       EQU       5                                                    0136.000
*6       EQU       6                                                    0137.000
*7       EQU       7                                                    0138.000
PR.STCK  EQU       0F              STACK AREA                           0139.000
PR.RTRN  EQU       0W              RETURN ADDRESS                       0140.000
         EQU       1W              STACK AREA POINTER                   0141.000
PR.ST0   EQU       2W              STRING POINTER (CURRENT STATE)       0142.000
PR.TRAN  EQU       3W              TRAN. TABLE POINTER                  0143.000
PR.L0    EQU       4W              STRING LENGTH (CURRENT STATE)        0144.000
PR.TMP   EQU       5W              TEMPORARY SAVE AREA                  0145.000
PR.ST1   EQU       6W              STRING POINTER (CURRENT TRAN)        0146.000
PR.L1    EQU       7W              STRING LENGTH (CURRENT TRAN)         0147.000
*                                  TRAN FLAGS                           0148.000
*                                                                       0149.000
*    DEFINE OFFSETS INTO KEYWORD TABLE                                  0150.000
*                                                                       0151.000
KW.VAR   EQU       0               SIZE OF VARIABLE PART OF BLOCK       0152.000
KW.SIZ   EQU       1               SIZE OF KEYWORD STRING               0153.000
KW.MIN   EQU       2               MINIMUM MATCH STRING SIZE            0154.000
KW.VAL   EQU       3               VALUE ASSOCIATED WITH KEYWORD        0155.000
         SPACE                                                          0156.000
         M.REQS                                                         0157.000
         STINIT                    INITIALIZE PARSER VALUES             0158.000
         SPACE                                                          0159.000
*  NOTE:                                                                0160.000
*        ANY LOCAL DATA THAT IS DECLARED IN THIS MODULE MUST HAVE A DSEC0161.000
*        CONSTRUCTED FOR IT.                                            0162.000
*                                                                       0163.000
         TITLE     TPARSE - MAIN ROUTINE CODE                           0164.000
         BOUND     1W                                                   0165.000
TPARSE   EQU       $                                                    0166.000
         TRN       R4,R4           -REMAINING STRING LENGTH             0167.000
         SBR       R2,12           FORM BYTE ADDRESS (F=1)              0168.000
         SUI       R1,1F           ALLOCATE STACK FRAME FOR PARSE       0169.000
         STF       R0,PR.STCK,R1   INITIALIZE STACK AREA                0170.000
PR.00    EQU       $                                                    0171.000
         ZBM       CC1,PR.RTRN,R1  ASSUME PARSE COMPLETED               0172.000
         ANMW      R3,=X'0007FFFC' RETAIN WORD ADDRESS OF TRAN. POINTER 0173.000
         BZ        PR.EXIT         TRANSITION 'EXIT'? YES, BRANCH       0174.000
         STW       R3,PR.TRAN,R1   SAVE POINTER TO TRAN. ENTRY          0175.000
         LW        R6,PR.ST0,R1    FETCH STRING POINTER FOR CURR. STATE 0176.000
         LW        R7,PR.L0,R1     FETCH REMAINING LENGTH FOR CURR STATE0177.000
         STD       R6,PR.ST1,R1    SET POINTER, LENGTH FOR CURRENT TRAN.0178.000
         LB        R2,0B,R3        FETCH 'ITEM' FROM TRAN. ENTRY        0179.000
         SUI       R2,X'80'        SUBTRACT BIAS                        0180.000
         BP        PR.10           IS IT A SPECIAL TYPE?                0181.000
         ZR        R2              NO, INDICATE 'CHAR'                  0182.000
PR.10    LA        R0,PR.15        GET RETURN ADDRESS                   0183.000
         STW       R0,PR.TMP,R1    SET RETURN ADDRESS IN STACK FRAME    0184.000
*                                                                       0185.000
*    DISPATCH TO TRANSITION TEST ROUTINE. PR.ST1 IS ADDRESS OF NEXT     0186.000
*    BYTE IN THE INPUT & PR.L1 IS THE REMAINING BYTE COUNT. R0 &        0187.000
*    PR.TMP CONTAIN THE RETURN ADDRESS WITH ALL CC'S = 0                0188.000
*                                                                       0189.000
         BU        *PR.ITEM,R2     EXECUTE ROUTINE FOR ITEM TYPE        0190.000
*                                                                       0191.000
*    RETURN FROM ITEM TEST, CC1=0=NOMATCH CC1=1=MATCH                   0192.000
*                                                                       0193.000
PR.15    BNS       PR.30           BR IF TEST FOR TRANSITION FAILED     0194.000
*                                                                       0195.000
*    ITEM WAS FOUND. IF AN ACTION ROUTINE WAS SPECIFIED, CALL IT.       0196.000
*                                                                       0197.000
         LW        R3,PR.TRAN,R1   GET TRANSITION TABLE ADDRESS         0198.000
         TBM       ACT.F,TT.FLGS,R3  WAS ACTION SPECIFIED?              0199.000
         BNS       PR.40           BRANCH IF NO ACTION SPECIFIED        0200.000
         LW        R2,0W,R3        GET ACTION ROUTINE ADDRESS           0201.000
         ANMW      R2,=X'000FFFFF' RETAIN ADDRESS PORTION ONLY          0202.000
         STW       R2,PR.TMP,R1    SAVE ADDRESS OF ACTION ROUTINE       0203.000
         LW        R2,PR.ST0,R1    FETCH BYTE ADDRESS OF ITEM           0204.000
         LW        R4,PR.ST1,R1    ADDRESS OF END OF ITEM               0205.000
         SUR       R2,R4           LENGTH OF ITEM, IN BYTES             0206.000
*                                                                       0207.000
*    READY TO DISPATCH TO USERS ACTION ROUTINE.                         0208.000
*                                                                       0209.000
*    R1 = CURRENT STACK ADDRESS *** THIS MUST BE PRESERVED ***          0210.000
*    R2 = ADDRESS OF ITEM THAT MATCHED TRANSITION                       0211.000
*    R4 = LENGTH OF ITEM                                                0212.000
*    R7 = VALUE IF APPLICABLE                                           0213.000
*                                                                       0214.000
*                                                                       0215.000
         BL        *PR.TMP,R1      EXECUTE THE ACTION ROUTINE           0216.000
*                                                                       0217.000
*    RETURN FROM USER ACTION. NON-SKIP RETURN IS NORMAL RETURN AND      0218.000
*    CC1 = 1 INDICATES THAT TRANSITION SHOULD NOT BE TAKEN. FOR         0219.000
*    SKIP RETURN, R3 = ADDRESS OF NEXT STATE WITH IMPLED SUCCESS.       0220.000
*                                                                       0221.000
         BU        PR.20           NON-SKIP RETURN IS NORMAL            0222.000
*                                                                       0223.000
*    SKIP RETURN - TRANSITION IS SUCCESSFUL AND R3 HAS ADDRESS          0224.000
*    UPDATE STRING POINTER PAST THE ITEM THAT CAUSE THE TRANSITION      0225.000
*    AND CONTINUE THE PARSE                                             0226.000
*                                                                       0227.000
         LD        R6,PR.ST1,R1    GET DESCRIPTOR FOR REMAINING STRING  0228.000
         STW       R6,PR.ST0,R1    SET NEW START OF STRING              0229.000
         STW       R7,PR.L0,R1     AND LENGTH                           0230.000
         BU        PR.00           GO AGAIN                             0231.000
*                                                                       0232.000
*    NON-SKIP RETURN FORM ACTION ROUTINE COMES HERE.                    0233.000
*      CC1 = 0 FOR SUCCESS, CC1 = 1 FOR NO TRANSITION                   0234.000
*                                                                       0235.000
PR.20    BNS       PR.40           BR IF TRANSITION SHOULD BE TAKEN     0236.000
PR.30    LW        R3,PR.TRAN,R1   GET CURRENT TRANSITION ADDRESS       0237.000
         TBM       LMB.F,TT.FLGS,R3 SHOULD TRANSITION OCCUR ANYWAY?     0238.000
         BNS       PR.70           BR IF NOT OPTIONAL TRANSITION        0239.000
         BU        PR.55           ALWAYS TAKE TRANSITION               0240.000
*                                                                       0241.000
*    TRANSITION WAS SUCCESSFUL. UPDATE STRING POINTER AND CHECK         0242.000
*    FOR ADDRESS OF NEXT STATE. IF NO ADDRESS GIVEN, SCAN FOR THE       0243.000
*    START OF THE NEXT STATE.                                           0244.000
*                                                                       0245.000
PR.40    LW        R3,PR.TRAN,R1   GET CURRENT TRANSITION TABLE ADDRESS 0246.000
         TBM       NOB.F,TT.FLGS,R3 SHOULD BLANKS BE SKIPPED?           0247.000
         BNS       PR.50           BR IF NO                             0248.000
         BL        PR.NOBLK        SKIP THE BLANKS                      0249.000
PR.50    LD        R6,PR.ST1,R1    GET DESCRIPTOR FOR REMAINING STRING  0250.000
         STW       R6,PR.ST0,R1    SET NEW START OF REMAINING STRING    0251.000
         STW       R7,PR.L0,R1     AND REMAINING LENGTH                 0252.000
PR.55    TBM       TRN.F,TT.FLGS,R3 WAS TRANSITION ADDRESS STATED       0253.000
         BNS       PR.80            BR IF NO, LOOK FOR NEXT STATE       0254.000
         TBM       ACT.F,TT.FLGS,R3 WAS ACTION SPECIFIED AS WELL        0255.000
         BNS       PR.60            BR IF NO-TABLE ADDRESS IN FIRST WORD0256.000
         ADI       R3,1W           ADVANCE POINTER TO SECOND WORD       0257.000
PR.60    LW        R3,0W,R3        FETCH ADDRESS OF TRANSITION          0258.000
         BU        PR.00           BRANCH TO CONTINUE                   0259.000
*                                                                       0260.000
*  TRANSITION FAILED. CHECK IF THERE ARE MORE. IF SO, SET TRANSITION    0261.000
*  TABLE ADDRESS TO THE NEXT ENTRY IN THE TABLE AND PROCEED. IF         0262.000
*  LAST TRANSITION IN STATE, THERE IS NO MATCH, RETURN FAILURE.         0263.000
*                                                                       0264.000
PR.70    ZR        R7              ASSUME END OF TRANSITION TABLE EXIT  0265.000
         TBM       EXT.F,TT.FLGS,R3 ELSE EXIT SET FOR THIS TRANSITION   0266.000
         BS        PR.EXIT         THEN EXIT THEN PARSE                 0267.000
         TBM       LST.F,TT.FLGS,R3 LAST TRANSITION IN STATE?           0268.000
         BS        PR.ER0          YES, BRANCH TO EXIT                  0269.000
         BL        PR.ADVNC        ADVANCE STATE TABLE POINTER          0270.000
         BU        PR.00           PROCESS NEXT TRANSITION              0271.000
         SPACE                                                          0272.000
*    COME HERE WHEN A TRANSITION TABLE ENTRY HAS NO NEXT STATE          0273.000
*    ADDRESS. THIS INDICATES THE STATE TO ENTER IS THE NEXT             0274.000
*    SEQUENTIAL STATE IN THE TABLE. THEREFORE, ALL INTERVENING          0275.000
*    TRANSITIONS IN THE CURRENT STATE MUST BE SCANED OVER TO FIND       0276.000
*    THE START OF THE NEXT STATE.                                       0277.000
         SPACE                                                          0278.000
PR.80    LW        R3,PR.TRAN,R1   GET PREVIOUS STATE ADDRESS           0279.000
PR.90    LI        R7,ERRVAL       GET ITEM FOR ERROR VALUE ENTRY       0280.000
         CAMB      R7,TT.ITEM,R3   IS THIS ENTRY ERROR VALUE            0281.000
         BNE       PR.95           BR IF NO                             0282.000
         ADI       R3,1W           ADVANCE TO START OF NEXT STATE       0283.000
         BU        PR.00           RESTART PARSE                        0284.000
PR.95    BL        PR.ADVNC        ADVANCE STATE TABLE POINTER          0285.000
         TBM       LST.F,TT.FLGS,R2 WAS PREVIOUS LAST IN STATE?         0286.000
         BS        PR.00           BR IF YES - PROCESS NEXT STATE       0287.000
         BU        PR.90           GO CHECK THAT FOR LAST               0288.000
         SPACE                                                          0289.000
*    PR.ADVNC - ADVANCE TRANSITION TABLE POINTER TO NEXT ENRTY          0290.000
*    THIS ROUTINE TAKES THE ADDRESS OF THE CURRENT TRANSITION           0291.000
*    AS INDICATED BY PR.TRAN AND RETURNS R3 EQUAL TO THE WORD           0292.000
*    ADDRESS OF THE NEXT ENTRY IN THE TABLE                             0293.000
         SPACE                                                          0294.000
PR.ADVNC EQU       $               ADVANCE TRANSITION POINTER           0295.000
         TRR       R3,R2           SAVE PREVIOUS STATE ADDRESS          0296.000
         ABR       R3,28           ADVANCE TWO WORDS                    0297.000
         LB        R7,TT.ITEM,R2   GET THE PREVIOUS ITEM TYPE           0298.000
         CI        R7,ERRVAL       CHECK IF ENTRY COULD BE 3 WORDS LONG 0299.000
         BLE       PR.AVX          EXIT ROUTINE IF CAN'T BE 3 WORDS     0300.000
         TBM       ACT.F,TT.FLGS,R2 DOES ENTRY HAVE A ACTION ADDRESS    0301.000
         BNS       PR.AVX          BR IF NO-CAN'T BE A 3 WORD ENTRY     0302.000
         TBM       TRN.F,TT.FLGS,R2 DOES IT HAVE TRANSITION ADDRESS TOO 0303.000
         BNS       PR.AVX          BR IF NO-NOT A 3 WORD ENTRY          0304.000
         ABR       R3,29           SKIP OVER 3RD WORD FOR THOSE ENTRIES 0305.000
PR.AVX   TRSW      R0              BACK TO CALLER                       0306.000
*                                                                       0307.000
*    ITEM: ERRVAL                                                       0308.000
*    THIS ITEM IS USED TO PASS A 20 BIT VALUE BACK TO THE MAINLINE      0309.000
*    PROGRAM AS AN INDICATION OF THE CAUSE OF THE ERROR. ALL THAT       0310.000
*    IS DONE NOW IS TO RETURN WITH PARSE FAIL INDICATION AND            0311.000
*    THE EXIT TO THE CALLER IS MADE WITH THE VALUE  IN R7.              0312.000
*    AN EXIT DUE TO LIST TERMINATION WILL RETURN WITH R7=0.             0313.000
*                                                                       0314.000
PR.ERROR LW        R7,0W,R3        GET TRANSITION TABLE VALUE           0315.000
         ANMW      R7,=X'000FFFFF' RETAIN LOW 20 BITS OF ENTRY          0316.000
PR.ER0   STW       R7,PR.STCK+7W,R1  SET VALUE INTO SAVED R7            0317.000
         SBM       CC1,PR.RTRN,R1  RETURN PARSING ERROR FLAG            0318.000
         LW        R4,=X'000FFFFF' ADDR MASK                    EVOL-33 0319.000
         LMW       R7,PR.RTRN,X1   GET RETURN ADDR              EVOL-33 0320.000
         LA        R4,FUP.0018     RETURN ADDR IN FUPMAN        EVOL-33 0321.000
         CAR       R4,R7           RTRN TO FUPMAN (END PARSING) EVOL-33 0322.000
         BNE       PR.EXIT         NOT YET                      EVOL-33 0323.000
*  END OF PARSE - GET THE STRING WHERE PARSE ERROR OCCURRED     EVOL-33 0324.000
*                 BY TRACING BACKWARD STACK LEVELS              EVOL-33 0325.000
         TRR       R1,R2           SAV STACK POINTER            EVOL-33 0326.000
PR.ER1   TBM       CC1,-32,X2      PARSE ERROR AT THIS LEVEL?   EVOL-33 0327.000
         BNS       PR.ER2          IF NOT, WE'VE REACHED        EVOL-33 0328.000
         SUI       R2,X'20'        BACK ONE LEVEL               EVOL-33 0329.000
         BU        PR.ER1          AND TEST AGAIN               EVOL-33 0330.000
PR.ER2   LW        R6,PR.ST0,X2    GET BYTE ADDR OF ITEM        EVOL-33 0331.000
         STW       R6,PR.ST0,X1    PUT IN STACK TO BE RETURNED  EVOL-33 0332.000
         LW        R6,PR.L0,X2     GET LENGTH                   EVOL-33 0333.000
         STW       R6,PR.L0,X1     PUT IN STACK                         0334.000
PR.EXIT  EQU       $                                                    0335.000
         LF        R0,PR.STCK,R1   RESTORE REGISTERS                    0336.000
         LA        R1,1F,R1        RESET STACK POINTER                  0337.000
         TRSW      0               RETURN (CALL+1W)                     0338.000
         SPACE                                                          0339.000
         BOUND     4                                                    0340.000
PR.ITEM  EQU       $                                                    0341.000
         DATAW     PR.CHAR         ITEM: C'<CHAR>'                      0342.000
         DATAW     PR.LAMDA        ITEM: LAMBDA                         0343.000
         DATAW     PR.EOS          ITEM: EOS                            0344.000
         DATAW     PR.DIGIT        ITEM: DIGIT (0-9)                    0345.000
         DATAW     PR.ALPHA        ITEM: ALPHABETIC (A-Z)               0346.000
         DATAW     PR.HEXCH        ITEM: HEXADECIMAL CHARACTER          0347.000
         DATAW     PR.SPEC         ITEM: SPECIAL CHARACTER              0348.000
         DATAW     PR.ANY          ITEM: ANY (X'00'-X'FF')              0349.000
         DATAW     PR.STRNG        ITEM: STRING                         0350.000
         DATAW     PR.DNUMB        ITEM: DNUMB (DECIMAL NUMBER)         0351.000
         DATAW     PR.HNUMB        ITEM: HNUMB                          0352.000
         DATAW     PR.NOBLK        ITEM: SKIP BLANKS                    0353.000
         DATAW     0,0             ITEM: TWO SPARES!!!!!!               0354.000
         DATAW     PR.ERROR        ITEM: ERROR IN PARSE                 0355.000
         DATAW     PR.SUBXP        ITEM: SUBEXP - EVALUATE SUBEXPRESSION0356.000
         DATAW     PR.TSTXP        ITEM: TSTEXP - TEST FOR SUBEXPRESSION0357.000
         DATAW     PR.STRNG        ITEM: KEYWD                          0358.000
*                                                                       0359.000
*  FOLLOWING ARE THE VARIOUS PARSE TRANSITION TEST ROUTINES.            0360.000
*  EACH IS CALLED TO CHECK TO SEE IF THE NEXT ITEM IN THE               0361.000
*  INPUT PARSE STRING MATCHES THE CURRENT TRANSITION TYPE               0362.000
*  SPECIFIED BY THE TRANSITION TABLE.                                   0363.000
*                                                                       0364.000
* INPUTS:                                                               0365.000
*                                                                       0366.000
*        R0 = PR.TMP = RETURN ADDRESS WITH ALL CC'S ZERO                0367.000
*        PR.ST0 = PR.ST1 = ADDRESS OF NEXT BYTE IN INPUT STRING         0368.000
*        PR.L0  = PR.L1  = NEGATIVE COUNT OF BYTES REMAINING            0369.000
*                                                                       0370.000
* OUTPUTS:                                                              0371.000
*                                                                       0372.000
*        PR.ST1 = ADDRESS BYTE BEYOND CURRENT ITEM IN THE INPUT         0373.000
*        PR.L1  = REMINING LENGTH                                       0374.000
*                                                                       0375.000
*        RETURN VIA "BU  *PR.TMP,R1" WITH:                              0376.000
*          CC1 = 0 = NO MATCH OF TRANSITION                             0377.000
*          CC1 = 1 = TRANSITION FOUND                                   0378.000
*                                                                       0379.000
         SPACE                                                          0380.000
         SPACE                                                          0381.000
*                                                                       0382.000
*  PR.CHAR - CHECK FOR SPECIFIC CHARATER                                0383.000
*                                                                       0384.000
*  THIS ROUTINE IS CALLED TO CHECK IF THE NEXT ITEM IN THE PARSE        0385.000
*  STRING MATCHES A SPECIFIC. SUCCESS IS RETURNED IF IT MATCHES.        0386.000
*                                                                       0387.000
         SPACE                                                          0388.000
PR.CHAR  EQU       $                                                    0389.000
         BL        PR.BYTE         FETCH BYTE FROM STRING               0390.000
         CAMB      R5,0B,R3        <CHAR> SPECIFIED IN TRANSITON?       0391.000
         BEQ       PR.XIT          YES, BRANCH TO CONTINUE              0392.000
         BU        *PR.TMP,R1      RETURN (CALL+1W)                     0393.000
         SPACE                                                          0394.000
*                                                                       0395.000
*  PR.EOS - TAKE TRANSITION IF INPUT STRING IS EXHAUSTED                0396.000
*                                                                       0397.000
         SPACE                                                          0398.000
PR.EOS   EQU       $                                                    0399.000
         BL        PR.BYTE         FETCH BYTE FROM STRING               0400.000
         BCT       CC1,PR.XIT      END OF STRING?  YES, BRANCH          0401.000
         BU        *PR.TMP,R1      RETURN (CALL+1W)                     0402.000
         SPACE                                                          0403.000
*                                                                       0404.000
* PR.DIGIT - TRANSITION IF NEXT ITEM IS A ASCII DECIMAL DIGIT           0405.000
*                                                                       0406.000
         SPACE                                                          0407.000
PR.DIGIT EQU       $                                                    0408.000
         BL        PR.BYTE         FETCH NEXT BYTE FROM STRING          0409.000
         BCT       CC2,PR.XIT      DIGIT? YES, BRANCH                   0410.000
         BU        *PR.TMP,R1      RETURN (CALL+1W)                     0411.000
         SPACE                                                          0412.000
*                                                                       0413.000
*  PR.ALPHA - TRANSITION IF NEXT CHARACTER IS ALPHA                     0414.000
*                                                                       0415.000
         SPACE                                                          0416.000
PR.ALPHA EQU       $                                                    0417.000
         BL        PR.BYTE         FETCH NEXT BYTE FROM STRING          0418.000
         BCT       CC4,PR.XIT      ALPHABETIC? YES, BRANCH              0419.000
         BU        *PR.TMP,R1      RETURN (CALL+1W)                     0420.000
         SPACE                                                          0421.000
*                                                                       0422.000
* PR.HEXCH - TAKE TRANSITION IF NEXT CHARACTER IN HEXIDECIMAL SET       0423.000
*                                                                       0424.000
         SPACE                                                          0425.000
PR.HEXCH EQU       $               CHECK FOR HEX CHAR                   0426.000
         BL        PR.BYTE         GET NEXT CHAR FROM INPUT STREAM      0427.000
         BCT       CC2,PR.XIT      IF DIGIT DEFINITLY HEX-TAKE SUCCESS  0428.000
         BCF       CC4,*PR.TMP,R1  IF NOT ALPHA, CANT BE HEX-TAKE FAIL  0429.000
         CI        R5,G'F'         CHECK AGAINST HEX LIMIT              0430.000
         BLE       PR.XIT          IF ASCII HEX, TAKE SUCCESS EXIT      0431.000
         BU        *PR.TMP,R1      ELSE RETURN UNSUCCESSFUL EXIT        0432.000
         SPACE                                                          0433.000
*                                                                       0434.000
* PR.SPEC - TAKE TRANSITION IF NEXT CHARACTER IS SPECIAL                0435.000
*                                                                       0436.000
         SPACE                                                          0437.000
PR.SPEC  EQU       $                                                    0438.000
         BL        PR.BYTE         FETCH NEXT BYTE FROM STRING          0439.000
         BCT       CC1,*PR.TMP,R1  END OF STRING?  YES, BRANCH          0440.000
         BCF       5,PR.XIT        SPECIAL CHARACTER? YES, BRANCH       0441.000
         BU        *PR.TMP,R1      RETURN (CALL+1W)                     0442.000
         SPACE                                                          0443.000
*                                                                       0444.000
*  PR.ANY - TAKE TRANSITION ON ANY CHARACTER EXCEPT END OF STRING       0445.000
*                                                                       0446.000
         SPACE                                                          0447.000
PR.ANY   EQU       $                                                    0448.000
         BL        PR.BYTE         FETCH NEXT BYTE FROM STRING          0449.000
         BCT       CC1,*PR.TMP,R1  END OF STRING?  YES, BRANCH          0450.000
         BU        PR.XIT          BRANCH TO CONTINUE                   0451.000
         SPACE                                                          0452.000
*                                                                       0453.000
*  PR.STRNG - TRANSITION ON STRING OF ALPHA/NUMERIC CHARATERS           0454.000
*        OR "." AND "_". THIS IS USED AS PREFIX TO KEYWORD              0455.000
*        MATCH ROUTINE.                                                 0456.000
*                                                                       0457.000
         SPACE                                                          0458.000
PR.STRNG EQU       $                                                    0459.000
         ZR        R6              INITIALIZE <STRING> LENGTH           0460.000
PR.STRN0 EQU       $                                                    0461.000
         BL        PR.BYTE         FETCH NEXT BYTE FROM STRING          0462.000
         BCT       5,PR.STRN1      ALPHANUMERIC? YES-BRANCH             0463.000
         CI        R5,G'.'         IS IT A DOT?                         0464.000
         BEQ       PR.STRN1        BR IF YES-ITS OK FOR STRING          0465.000
         CI        R5,G'_'         HOW ABOUT UNDERSCORE                 0466.000
         BNE       PR.KEYWD        BR IF END OF STRING                  0467.000
PR.STRN1 ADI       R6,1            INCREMENT STRING LENGTH              0468.000
         SBM       CC1,PR.TMP,R1   INDICATE PARSE SUCCESSFUL            0469.000
         BU        PR.STRN0        BRANCH TO CONTINUE                   0470.000
PR.KEYWD EQU       $                                                    0471.000
         TBM       CC1,PR.TMP,R1   DID WE GET A STRING                  0472.000
         BNS       PR.RXIT         JUST EXIT IF NO STRING               0473.000
         CI        R2,KEYWD-X'80'  IS ITEM KEYWORD?                     0474.000
         BNE       PR.RXIT         NO, BRANCH TO CONTINUE               0475.000
         BL        PR.VRBL         POINT TO KEYWORD IN 'TRAN' ENTRY     0476.000
         LW        R3,0W,R3        GET POINTER TO KEYWORD TABLE         0477.000
KW.10    TRR       R3,R7           SAVE ADDRESS OF KEYWORD TABLE        0478.000
         TRR       R6,R4           COPY REAL INPUT LENGTH           2.2 0479.000
         CAMB      R6,KW.MIN,R3    IS INPUT STRING TOO SHORT            0480.000
         BLT       KW.50           BR IF INPUT TO SHORT FOR MATCH       0481.000
         LB        R5,KW.SIZ,R3    GET KEYWORD SIZE VALUE               0482.000
         ZBR       R5,24           ZERO TRUNCATION FLAG                 0483.000
         BNS       KW.15           BR IF NO TRUNCATION ALLOWED          0484.000
         CAR       R5,R4           IS INPUT LONGER THAN KEYWORD      2.20485.000
         BLT       KW.15           BR IF NO - CHECK ACTUAL LENGTH       0486.000
         TRR       R5,R4           USE KEYWORD LENGTH FOR MATCH      2.20487.000
KW.15    CAR       R5,R4           IS INPUT TOO LONG TO MATCH        2.20488.000
         BGT       KW.50           BR IF YES                            0489.000
         ABR       R3,29           ADVANCE TO KEYWORD SPELLING          0490.000
         TRN       R4,R5           GET MINUS THE INPUT LENGTH        2.20491.000
         LW        R2,PR.ST0,R1    GET START OF INPUT STRING            0492.000
KW.20    LB        R4,0B,R2        GET BYTE FROM INPUT STRING           0493.000
         CAMB      R4,0B,R3        DOES IT MATCH THE KEYWORD CHAR       0494.000
         BNE       KW.50           BR IF NO                             0495.000
         ABR       R2,31           ADVANCE INPUT STRING POINTER         0496.000
         ABR       R3,31           AND THE KEYWORD SPELLING POINTER     0497.000
         BIB       R5,KW.20        BR IF MORE TO CHECK                  0498.000
         TRR       R7,R3           FOUND A MATCH                        0499.000
         LB        R7,KW.VAL,R3    GET KEYWORD VALUE                    0500.000
         LB        R5,KW.VAR,R3    GET SIZE OF VARIABLE PART            0501.000
         BEQ       KW.30           BR IF NO VARIABLE PART               0502.000
         LB        R2,KW.SIZ,R3    GET KEYWORD SIZE                     0503.000
         ADI       R2,7            SIZE OF HEADER PLUS ROUND UP         0504.000
         ZBR       R2,24           CLEAR TRUNCATE KEYWORD MATCH FLAG    0505.000
         ADR       R3,R2           FIND START OF FAKE TRANSITION TABLE  0506.000
         ANMW      R2,=X'0007FFFC' ROUND TO EVEN WORD ADDRESS           0507.000
         STW       R2,PR.TRAN,R1   SAVE TRANSITION TABLE ADDRESS        0508.000
KW.30    BU        PR.RXIT         TAKE SUCCESSFUL RETURN               0509.000
*                                                                       0510.000
*    KEYWORD DOES NOT MATCH INPUT STRING - CHECK IF MORE                0511.000
*                                                                       0512.000
KW.50    TRR       R7,R3           GET KEYWD TBL ADDR TO INDEX REG      0513.000
         LB        R5,KW.SIZ,R3    GET SIZE OF KEYWORD SPELLING         0514.000
         ADMB      R5,KW.VAR,R3    ADD IN VARIABLE PART                 0515.000
         ADI       R5,7            ADD IN FOR 1 WORD PLUS ROUNDUP VAL   0516.000
         ZBR       R5,24           ZERO TRUNCATE COMPARE BIT            0517.000
         ADR       R5,R3           ADVANCE POINTER                      0518.000
         ANMW      R3,=X'0007FFFC' CLEAR TO WORD ADDRESS                0519.000
         LB        R5,KW.SIZ,R3    IS NEXT ENTRY NONE ZERO              0520.000
         BNE       KW.10           BR IF MORE                           0521.000
         ZBM       CC1,PR.TMP,R1   CLEAR SUCCESSFUL FLAG                0522.000
         BU        *PR.TMP,R1      RETURN TO PARSER                     0523.000
         SPACE                                                          0524.000
*                                                                       0525.000
* PR.DNUMB - TRANSITION ON DECIMAL NUMBER                               0526.000
*                                                                       0527.000
         SPACE                                                          0528.000
PR.DNUMB EQU       $                                                    0529.000
         LI        R2,10           MULTIPLIER FOR DECIMAL CONVERSION    0530.000
         BU        PR.NUMB         BRANCH TO CONTINUE                   0531.000
         SPACE                                                          0532.000
*                                                                       0533.000
*  PR.HNUMB - TRANSITION ON HEX NUMBER                                  0534.000
*                                                                       0535.000
         SPACE                                                          0536.000
PR.HNUMB EQU       $                                                    0537.000
         LI        R2,16           MULTIPLIER FOR HEX. CONVERSION       0538.000
         SPACE                                                          0539.000
PR.NUMB  EQU       $                                                    0540.000
         ZR        R7              CLEAR RESULT ACCUMULATOR             0541.000
PR.NUMB0 EQU       $                                                    0542.000
         BL        PR.BYTE         FETCH NEXT BYTE FROM STRING          0543.000
         BCT       CC2,PR.NUMB1    BR IF NUMERIC CHARACTER              0544.000
         BCF       CC4,PR.RXIT     EXIT IF NOT NUMERIC THIS MAY BE HEX  0545.000
         ZBM       CC1,PR.TMP,R1   ASSUME NONE NUMERIC CHARACTER        0546.000
         SUI       R5,G'A'-G'0'-X'A' SUBTRACT BIAS FOR X'A' TO X'F'     0547.000
PR.NUMB1 SUI       R5,G'0'          SUBTRACT NUMERIC BIAS               0548.000
         CAR       R2,R5           IS VALUE WITHIN THE RADIX            0549.000
         BGE       PR.RXIT         YES, BRANCH TO CONTINUE              0550.000
         MPR       R2,R6           MULTIPLY ACCUMULATOR BY CONV. FACTOR 0551.000
         ADR       R5,R7           ADD IN NEXT DIGIT                    0552.000
         SBM       CC1,PR.TMP,R1   INDICATE PARSE SUCCESSFUL            0553.000
         BU        PR.NUMB0        BRANCH TO CONTINUE                   0554.000
         SPACE                                                          0555.000
*                                                                       0556.000
*  PR.NOBLK - SKIP BLANKS AND TAKE TRANSITION. THE INPUT STRING         0557.000
*        IS SET TO POINT AN THE NEXT NON-BLANK CHARACTER AND            0558.000
*        THE TRANSITION FLAG IS SET TRUE.                               0559.000
*                                                                       0560.000
         SPACE                                                          0561.000
PR.NOBLK STW       R0,PR.TMP,R1    SAVE RETURN WHEN CALLED AS SUBR      0562.000
PR.NOBK1 SBM       CC1,PR.TMP,R1   INDICATE SUCCESSFUL PARSE            0563.000
         BL        PR.BYTE         GET NEXT CHARACTER                   0564.000
         CI        R5,G' '         IS IT BLANK                          0565.000
         BEQ       PR.NOBK1        BR IF YES-GET THE NEXT               0566.000
         BU        PR.RXIT         BACK OVER LAST CHARACTER             0567.000
         SPACE                                                          0568.000
*                                                                       0569.000
* PR.SUBXP - TEST SUB-EXPRESSION FOR MATCH                              0570.000
* PR.TSTXP - TEST SUB-EXPRESSION, BUT DON'T CONSUME TOKEN               0571.000
*                                                                       0572.000
*        THESE ROUTINE RECURSIVELY CALL THE PARSER TO CHECK             0573.000
*        FOR A COMPLEX EXPRESSION. IF RETURN WITH ERROR VALUE,          0574.000
*        EXIT FROM PARSE IS TAKEN. IF "PR.SUBXP", THE STRING            0575.000
*        PARSED IN THE SUB-EXPRESSION IS REMOVED FROM THE               0576.000
*        INPUT AND IS LEFT FOR REPARSE IN "PR.TSTXP".                   0577.000
*                                                                       0578.000
         SPACE                                                          0579.000
PR.SUBXP EQU       $               EVALUATE SUBEXPRESSION               0580.000
PR.TSTXP EQU       $               TEST FOR SUBEXPRESSION SYNTAX        0581.000
         LW        R2,PR.ST1,R1    FETCH STRING POINTER                 0582.000
         LNW       R4,PR.L1,R1     FETCH STRING LENGTH                  0583.000
         BL        PR.VRBL         POINT TO 'STATE' IN TRAN ENTRY       0584.000
         LW        R3,0W,R3        FETCH POINTER TO STATE               0585.000
         BL        TPARSE          CALL PARSE RECURSIVELY               0586.000
         BNS       PR.STAT0        BR IF PARSE WAS SUCCESSFUL           0587.000
         CI        R7,0            WAS ERROR VALUE SET                  0588.000
         BNE       PR.ER0          BR IF YES - PROPOGATE THE ERROR      0589.000
         BU        *PR.TMP,R1      ELSE JUST RETURN UNSUCCESSFUL        0590.000
PR.STAT0 LI        R7,TSTEXP       CHECK IF TEST OR EVALUATE SUBEXPRESS 0591.000
         CAMB      R7,*PR.TRAN,R1  COMPARE AGAINST CURRENT ENTRY        0592.000
         BEQ       PR.XIT          IF TEST - DON'T UPDATE STRING ADDRESS0593.000
         STW       R2,PR.ST1,R1    SET STRING ADDRESS                   0594.000
         STW       R4,PR.L1,R1     AND REMAINING LENGTH                 0595.000
         SPACE                                                          0596.000
*                                                                       0597.000
*  PR.LAMDA - ALWAYS TAKE TRANSITION AND LEAVE STRING ALONE             0598.000
*                                                                       0599.000
         SPACE                                                          0600.000
PR.LAMDA EQU       $               TAKE TRANSITION                      0601.000
         SPACE                                                          0602.000
*                                                                       0603.000
*  PR.XIT - EXIT PARSE TEST ROUTINE WITH SUCCESSFUL INDICATION          0604.000
*                                                                       0605.000
         SPACE                                                          0606.000
PR.XIT   EQU       $                                                    0607.000
         SBM       CC1,PR.TMP,R1   INDICATE PARSE SUCCESSFUL            0608.000
         BU        *PR.TMP,R1      RETURN (CALL+1W)                     0609.000
         SPACE                                                          0610.000
*                                                                       0611.000
*  PR.RXIT - RETURN ONE CHARACTER TO THE INPUT AND EXIT                 0612.000
*                                                                       0613.000
         SPACE                                                          0614.000
PR.RXIT  EQU       $                                                    0615.000
         LI        R2,-1           DECREMENT VALUE                      0616.000
         ARMW      R2,PR.ST1,R1    RESET STRING POINTER BY 1 BYTE       0617.000
         ARMW      R2,PR.L1,R1     RESET REMAINING STRING LENGTH BY 1   0618.000
         BU        *PR.TMP,R1      RETURN (CALL+1W)                     0619.000
         SPACE                                                          0620.000
*                                                                       0621.000
*    PR.BYTE - GET NEXT BYTE FROM THE INPUT STREAM                      0622.000
*                                                                       0623.000
*    THIS ROUTINE IS CALLED TO FETCH THE NEXT CHARACTER FROM THE        0624.000
*    INPUT PARSE STRING.                                                0625.000
*                                                                       0626.000
* INPUTS:                                                               0627.000
*                                                                       0628.000
*        PR.ST1 CONTAINS THE ADDRESS OF THE NEXT BYTE                   0629.000
*        PR.L1  CONTAINS THE NEGATIVE OF THE COUNT OF BYTES REMAINING   0630.000
*                                                                       0631.000
* OUTPUTS:                                                              0632.000
*                                                                       0633.000
*        R5 = CHAR OR ZERO IF END OF STRING                             0634.000
*        CC1= END OF STRING                                             0635.000
*        CC2= NUMERIC CHARACTER                                         0636.000
*        CC4= ALPHABETIC CHARACTER (A-Z)                                0637.000
*                                                                       0638.000
         SPACE                                                          0639.000
PR.BYTE  SBR       R0,CC4          ASSUME CHARACTER IS ALPHA            0640.000
         ZBR       R0,CC2          AND NOT NUMERIC                      0641.000
         LB        5,*PR.ST1,R1    FETCH NEXT BYTE FROM STRING          0642.000
         ABM       31,PR.ST1,R1    POINT TO NEXT BYTE IN STRING         0643.000
         ABM       31,PR.L1,R1     ADJUST REMAINING STRING LENGTH       0644.000
         BLE       PR.BYTA         END OF STRING? BRANCH IF NO          0645.000
         SBR       R0,CC1          SET END OF STRING FLAG               0646.000
         ZR        R5              GET NON ALPHA/NUMERIC CHARATER       0647.000
PR.BYTA  CI        R5,G'A'         IS CHAR BELOW THE ALPHA RANGE        0648.000
         BLT       PR.BYTN         BR IF YES-CK FOR NUMERIC             0649.000
         CI        R5,G'Z'         IS IT ALPHABETIC?                    0650.000
         BLE       PR.BYTX         BR IF YES-ALL SET                    0651.000
PR.BYTN  ZBR       R0,CC4          CLEAR THE ALPHA FLAG                 0652.000
         SBR       R0,CC2          AND SET THE NUMERIC FLAG             0653.000
         CI        R5,G'0'         CHARACTER LESS THAN '0'?             0654.000
         BLT       PR.BYTW         YES, BRANCH TO EXIT AS NON NUMERIC   0655.000
         CI        R5,G'9'         CHARACTER LESS THAN OR EQUAL '9'     0656.000
         BLE       PR.BYTX         YES, BRANCH TO EXIT                  0657.000
PR.BYTW  ZBR       0,CC2           INDICATE NOT DIGIT                   0658.000
PR.BYTX  EQU       $                                                    0659.000
         TRSW      0               RETURN (CALL+1W)                     0660.000
         SPACE                                                          0661.000
*                                                                       0662.000
*  PR.VRBL - FIND END OF TRANSITION TABLE. IF ENTRY IS 2 OR 3 WORDS     0663.000
*                                                                       0664.000
* INPUT: R3 = ADDRESS OF TRANSITION TABLE ENTRY                         0665.000
*                                                                       0666.000
* OUTPUT: R3 = ADDRESS OF LAST WORD IN THE TABLE WHICH IS THE ADDRESS   0667.000
*              OF THE KEYWORD SUB-EXPRESSION TABLE.                     0668.000
*                                                                       0669.000
         SPACE                                                          0670.000
PR.VRBL  EQU       $                                                    0671.000
         ADI       R3,1W           INCREMENT TRAN. TABLE POINTER 1 WORD 0672.000
         TBM       ACT.F,0B,R3     IS THERE AN ACTION ADDRESS           0673.000
         BNS       PR.VRBX         NO, CAN'T BE A 3 WORD ENTRY          0674.000
         TBM       TRN.F,0B,R3     WAS TRANSITION STATED AS WELL        0675.000
         BNS       PR.VRBX         NO, TABLE IS NOT 3 WORDS             0676.000
         ABR       R3,29           INCREMENT TRAN. TABLE POINTER BY 1W  0677.000
PR.VRBX  TRSW      R0              RETURN TO CALLER                     0678.000
         BOUND     4                                                    0679.000
         LPOOL                                                          0680.000
         END                                                            0681.000
