
%BEGIN
    %COMMENT STRIMATISAWHFRIDAYGROUP
    %INTEGERARRAY DATA(0:250),LINK(0:250)
    %INTEGERARRAY IP(1:20)
    %INTEGER AVAIL,VN,VT,P,N,INFO,POINTER,S,SP,COUNT,RULES
    AVAIL = 1
    VN = 0
    VT = 0
    P = 0
    N = 250
    COUNT = 0
    RULES = 1

    %ROUTINE SKIPSPACES(%INTEGER INFO)
P1:     SKIP  SYMBOL
        READ  SYMBOL(INFO)
        %IF INFO = ' ' %THEN ->P1
    %END

    %ROUTINE SETUPAVAIL(%INTEGER N)
        %INTEGER I
        AVAIL = N
        %CYCLE I = 1,1,N
            DATA(I) = ' '
            LINK(I) = I+1
        %REPEAT
        %PRINTTEXT 'AVAIL SET UP'
    %END

  %ROUTINE PUSH (%INTEGER INFO,POINTER)
        %INTEGER K,X
        %IF AVAIL = 0 %THEN %START
            %PRINTTEXT 'AVAIL EMPTY'
            %STOP
        %FINISH
        %IF POINTER = P %THEN %START
            %CYCLE X = 1,1,N
                %IF DATA(X) = INFO %THEN %START
                    INFO = X
                    ->L3
                %FINISH
            %REPEAT
        %FINISH
L3:     K = LINK(AVAIL)
        LINK(AVAIL) = POINTER
        POINTER = AVAIL
        AVAIL = K
        DATA(POINTER) = INFO
    %END

    %INTEGERFN COUNTAVAIL
        %INTEGER I,K
        K = 0
        %CYCLE I = 1,1,N
            %IF DATA(I) = ' ' %THEN K = K+1
        %REPEAT
        %RESULT = K
    %END

    %INTEGERFN POP(%INTEGERNAME POINTER)
        %INTEGER L,M
        %IF POINTER = 0 %THEN %RESULT = ' '
        L = LINK(POINTER)
        LINK(POINTER) = AVAIL
        AVAIL = POINTER
        POINTER = L
        M = DATA(AVAIL)
        DATA(AVAIL) = ' '
        %RESULT = M
    %END
    %COMMENT MAINPROGRAM
    %PRINTTEXT 'STRIMATI SAWH , FRIDAY GROUP'
    NEWLINES(2)
    SETUPAVAIL(N)
    NEWLINE
    %PRINTTEXT 'AVAILABLE SPACE = '
    WRITE((COUNTAVAIL),4)
    NEWLINE
    %PRINTTEXT 'SPACE IN USE ='
    WRITE((250-COUNTAVAIL),4)
    NEWLINE
L1: READ  SYMBOL(INFO)
    POINTER = VN
    %IF INFO = ' ' %THEN SKIPSPACES(INFO)
    %IF INFO # NL %THEN %START
        PUSH(INFO,POINTER)
        ->L1
    %FINISH
    %IF POINTER = VN %THEN POINTER = VT
    %IF POINTER = VT %THEN POINTER = S
    ->L1 %UNLESS POINTER = S
    READ  SYMBOL(INFO)
    %IF INFO = ' ' %THEN SKIPSPACES(INFO)
    SP = VN
R:      %IF DATA(VN) = INFO %THEN S = VN %ELSE %START
            %IF LINK(VN) = 0 %THEN %START
                %PRINTTEXT 'SENTENCE PROTOTYPE NOT IN VN'
                ->G
        %FINISH
        VN = LINK(VN)
        ->R
    %FINISH
G:  VN = SP
    READ  SYMBOL(INFO)
    SKIPSPACES(INFO)
    POINTER = P
    IP(RULES) = AVAIL
L2: READ  SYMBOL(INFO)
L10:%IF INFO = ' ' %THEN SKIPSPACES(INFO)
    %IF INFO # NL %THEN %START
        PUSH(INFO,POINTER)
        ->L2
    %FINISH
L4: READ  SYMBOL(INFO)
    %IF INFO = ' ' %THEN SKIPSPACES(INFO)
    %IF INFO = NL %THEN %START
        COUNT = COUNT+1
        ->L4 %UNLESS COUNT = 2
    %FINISH
    %IF COUNT = 1 %OR COUNT = 2 %THEN ->L5
    %IF COUNT # 2 %THEN %START
        LINK(IP(RULES)) = AVAIL
        RULES = RULES+1
        IP(RULES) = AVAIL
        ->L10
    %FINISH
L5: %PRINTTEXT 'RULES OF PRODUCTION PRINTED FIRST'
    NEWLINES(2)
L6: PRINT  SYMBOL(DATA(DATA(P)))
    P = LINK(P)
    ->L6 %UNLESS LINK(P) = 0 %OR LINK(P) = IP(RULES)
    NEWLINE
    RULES = RULES+1
    ->L6 %UNLESS RULES = 0
    NEWLINE
    %PRINTTEXT 'SENTENCE PROTOTYPE FOLLOWS'
    NEWLINES(2)
    PRINT  SYMBOL(DATA(S))
    NEWLINE
L7: PRINT  SYMBOL(POP(VN))
    ->L7 %UNLESS VN = 0
    NEWLINES(2)
L8: PRINT  SYMBOL(POP(VT))
    ->L8 %UNLESS VT = 0
    %IF COUNT = 1 %THEN ->L1
%ENDOFPROGRAM



