SPL,L,M,O,T,C 
!         11/14/75  REV C 
      NAME P.ARS(8) 
! 
! PARSING ALGORITHM 
       LET STAK BE PSEUDO, EXTERNAL 
       LET SEG,DRCT BE FUNCTION, EXTERNAL 
       LET S,PTOP,GTOP,VTOP,DEF BE INTEGER
      LET CHAR BE INTEGER,EXTERNAL
       LET PUSH,POP BE SUBROUTINE 
! 
P.ARS: SUBROUTINE(ROOT,AGNRT,AINCC,ADECC)\
           FEXIT, GLOBAL
! 
       GTOP_ROOT; S,PTOP,VTOP_0!INITIALIZATION
       CALL $(AINCC)()        !GET FIRST CHARACTER
! 
B:     WHILE [DEF_$(GTOP+1)]>0 DO    \DEFINE LOOP 
           [PUSH; PTOP_S; GTOP_DEF; VTOP_0] 
       IFNOT CHAR THEN GOTO M 
       IF DEF THEN[CALL $(SEG($GTOP))(CHAR) ?[GO TO M]],\P-TERM 
           ELSE [IF CHAR#$GTOP THEN GO TO M] !MATCH 
! 
       VTOP_[IF CHAR<0 THEN CHAR, ELSE -CHAR]  !SET V STACK 
       CALL $(AINCC)()        !GET NEXT CHARACTER 
G:     DO [PUSH; GTOP_$(GTOP+3); VTOP_0] !SUCCESSOR 
H:     IF GTOP>0 THEN GO TO B !GO TO DEFINE LOOP
       CALL $(AGNRT)(S,PTOP,GTOP,VTOP) !GENERATE
       IF S THEN GO TO G    !GO AHEAD 
       IFNOT CHAR THEN RETURN, ELSE FRETURN !DONE 
! 
M:     DO [GTOP_[IF GTOP THEN $(GTOP+2),ELSE 0]; \
           VTOP_0]            !GET ALTERNATE
       IF GTOP THEN GO TO H   !GO TO DEF LOOP 
       DO [POP; IFNOT S THEN FRETURN] !BACKTRACK
       IF VTOP>0 THEN FRETURN,\ DELETE
           ELSE [IF VTOP<0 THEN [CALL $(ADECC)()]] !DECC
       GO TO M                !TRY AGAIN
       END
! 
PUSH:  SUBROUTINE 
       DO [STAK(S)_VTOP; STAK(S)_GTOP; STAK(S)_PTOP]
       RETURN 
       END
! 
POP:   SUBROUTINE 
       DO [PTOP_STAK(S); GTOP_STAK(S); VTOP_STAK(S)]
       RETURN 
       END
       END
END$
                                                                                                                            