LETTER      : GETIDENTIFIER(
                                  (* UPDATING *)  CURRCHAR,
                                                  NEXTCHAR,
                                  (* RETURNING *) NAME,
                                                  VALUE,
                                                  LENGTH    );
     DIGIT       : GETNUMBER(
                              (* UPDATING *)  CURRCHAR,
                                              NEXTCHAR,
                              (* RETURNING *) NAME,
                                              VALUE,
                                              LENGTH    );
     QUOTE       : GETCHARLITERAL(
                                   (* UPDATING *)  CURRCHAR,
                                                   NEXTCHAR,
                                   (* RETURNING *) NAME,
                                                   VALUE,
                                                   LENGTH    );
     OTHERCHAR   : BEGIN
                              GETSPECIALCHAR(
                                      (* UPDATING *)  CURRCHAR,
                                                      NEXTCHAR,
                                      (* RETURNING *) NAME,
                                                      VALUE,
                                                      LENGTH    );
                      IF NAME = OPENCOMMENT
                         THEN
                            GETCOMMENT(
                                        (* UPDATING *) CURRCHAR,
                                                       NEXTCHAR,
                                                       NAME,
                                                       VALUE,
                                                       LENGTH    )
                   END;
     FILEMARK    : NAME := ENDOFFILE
  END (* CASE *)
END; (* GETNEXTSYMBOL *)
PROCEDURE GETSYMBOL(
                    (* UPDATING *)  VAR NEXTSYM   : SYMBOLINFO;
                    (* RETURNING *) VAR CURRSYM   : SYMBOLINFO );
VAR
   DUMMY: SYMBOLINFO;
BEGIN (* GETSYMBOL *)
  DUMMY   := CURRSYM;
  CURRSYM := NEXTSYM;
  NEXTSYM := DUMMY  ;
  WITH NEXTSYM^ DO
     BEGIN
        SKIPSPACES(
                    (* UPDATING *)  CURRCHAR,
                                    NEXTCHAR,
                    (* RETURNING *) SPACESBEFORE,
                                    CRSBEFORE     );
        LENGTH := 0;
        IF CURRSYM^.NAME = OPENCOMMENT
           THEN
              GETCOMMENT(
                          (* UPDATING *)  CURRCHAR,
                                          NEXTCHAR,
                          (* RETURNING *) NAME,
                                          VALUE,
                                          LENGTH    )
           ELSE
              GETNEXTSYMBOL(
                             (* UPDATING *)  CURRCHAR,
                                             NEXTCHAR,
                             (* RETURNING *) NAME,
                                                       VALUE,
                                             LENGTH    )
     END (* WITH *)
END; (* GETSYMBOL *)
PROCEDURE INT2 ( VAR TOPOFSTACK : INTEGER;
VAR CURRLINEPOS,
    CURRMARGIN : INTEGER;
VAR KEYWORD    : KEYWORDTABLE;
VAR DBLCHARS   : DBLCHRSET;
VAR DBLCHAR    : DBLCHARTABLE;
VAR SGLCHAR    : SGLCHARTABLE;
VAR RECORDSEEN : BOOLEAN;
VAR CURRCHAR,
    NEXTCHAR   : CHARINFO;
VAR CURRSYM,
    NEXTSYM    : SYMBOLINFO;
VAR PPOPTION   : OPTIONTABLE );

BEGIN
  WITH PPOPTION [ OFSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ CRSUPPRESS,
                               SPACEBEFORE ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ FORSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ SPACEAFTER,
                               INDENTBYTAB,
                               GOBBLESYMBOLS,
                               CRAFTER ];
        DINDENTSYMBOLS    := [];
                                 GOBBLETERMINATORS := [ DOSYM ]
     END;
  WITH PPOPTION [ WHILESYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ SPACEAFTER,
                               INDENTBYTAB,
                               GOBBLESYMBOLS,
                               CRAFTER ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := [ DOSYM ]
     END;
  WITH PPOPTION [ WITHSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ SPACEAFTER,
                               INDENTBYTAB,
                               GOBBLESYMBOLS,
                               CRAFTER ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := [ DOSYM ]
     END;
  WITH PPOPTION [ DOSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ CRSUPPRESS,
                               SPACEBEFORE ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;

  WITH PPOPTION [ IFSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ SPACEAFTER,
                               INDENTBYTAB,
                                            GOBBLESYMBOLS,
                               CRAFTER ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := [ THENSYM ]
     END;
  WITH PPOPTION [ THENSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ INDENTBYTAB, CRAFTER ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ ELSESYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ CRBEFORE,
                               DINDENTONKEYS,
                               DINDENT,
                               INDENTBYTAB,
                               CRAFTER ];
        DINDENTSYMBOLS    := [ IFSYM,
                               ELSESYM ];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ ENDSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ CRBEFORE,
                               DINDENTONKEYS,
                               DINDENT,
                               CRAFTER ];
        DINDENTSYMBOLS    := [ IFSYM,
                               THENSYM,
                               ELSESYM,
                               FORSYM,
                               WHILESYM,
                               WITHSYM,
                               CASEVARSYM,
                               COLON,
                               EQUALS ];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ UNTILSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ CRBEFORE,
                               DINDENTONKEYS,
                               DINDENT,
                               SPACEAFTER,
                               GOBBLESYMBOLS,
                               CRAFTER ];
        DINDENTSYMBOLS    := [ IFSYM,
                               THENSYM,
                               ELSESYM,
                               FORSYM,
                               WHILESYM,
                               WITHSYM,
                               COLON,
                               EQUALS ];
        GOBBLETERMINATORS := [ ENDSYM,
                               UNTILSYM,
                               ELSESYM,
                               SEMICOLON ];
     END;
  WITH PPOPTION [ BECOMES ] DO
     BEGIN
        OPTIONSSELECTED   := [ SPACEBEFORE,
                               SPACEAFTER,
                               GOBBLESYMBOLS ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := [ ENDSYM,
                               UNTILSYM,
                               ELSESYM,
                               SEMICOLON ]
     END;
  WITH PPOPTION [ OPENCOMMENT ] DO
     BEGIN
        OPTIONSSELECTED   := [ CRSUPPRESS ];
        DINDENTSYMBOLS    := [];
         GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ CLOSECOMMENT ] DO
     BEGIN
        OPTIONSSELECTED   := [ CRSUPPRESS ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ SEMICOLON ] DO
     BEGIN
        OPTIONSSELECTED   := [ CRSUPPRESS,
                               DINDENTONKEYS,
                               CRAFTER ];
        DINDENTSYMBOLS    := [ IFSYM,
                               THENSYM,
                               ELSESYM,
                               FORSYM,
                               WHILESYM,
                               WITHSYM,
                               COLON,
                               EQUALS ];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ COLON ] DO
     BEGIN
        OPTIONSSELECTED   := [ SPACEAFTER,
                               INDENTTOCLP ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ EQUALS ] DO
     BEGIN
        OPTIONSSELECTED   := [ SPACEBEFORE,
                               SPACEAFTER,
                               INDENTTOCLP ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ OPENPAREN ] DO
     BEGIN
        OPTIONSSELECTED   := [ GOBBLESYMBOLS ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := [ CLOSEPAREN ]
     END;
  WITH PPOPTION [ CLOSEPAREN ] DO
     BEGIN
        OPTIONSSELECTED   := [];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ PERIOD ] DO
     BEGIN
        OPTIONSSELECTED   := [ CRSUPPRESS ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ ENDOFFILE ] DO
     BEGIN
        OPTIONSSELECTED   := [];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ OTHERSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END
END; (* INITIALIZE2 *)



PROCEDURE INITIALIZE( (* RETURNING *)
                         VAR TOPOFSTACK  : INTEGER;
                         VAR CURRLINEPOS,
                             CURRMARGIN  : INTEGER;
                         VAR KEYWORD     : KEYWORDTABLE;
                         VAR DBLCHARS    : DBLCHRSET;
                         VAR DBLCHAR     : DBLCHARTABLE;
                         VAR SGLCHAR     : SGLCHARTABLE;
                         VAR RECORDSEEN  : BOOLEAN;
                         VAR CURRCHAR,
                             NEXTCHAR    : CHARINFO;
                         VAR CURRSYM,
                             NEXTSYM     : SYMBOLINFO;
                         VAR PPOPTION    : OPTIONTABLE   );
BEGIN (* INITIALIZE *)
  TOPOFSTACK  := 0;
  CURRLINEPOS := 0;
  CURRMARGIN  := 0;
  KEYWORD [ PROGSYM    ] := 'PROGRAM   ' ;
  KEYWORD [ FUNCSYM    ] := 'FUNCTION  ' ;
  KEYWORD [ PROCSYM    ] := 'PROCEDURE ' ;
  KEYWORD [ LABELSYM   ] := 'LABEL     ' ;
  KEYWORD [ CONSTSYM   ] := 'CONST     ' ;
  KEYWORD [ TYPESYM    ] := 'TYPE      ' ;
  KEYWORD [ VARSYM     ] := 'VAR       ' ;
  KEYWORD [ BEGINSYM   ] := 'BEGIN     ' ;
  KEYWORD [ REPEATSYM  ] := 'REPEAT    ' ;
  KEYWORD [ RECORDSYM  ] := 'RECORD    ' ;
  KEYWORD [ CASESYM    ] := 'CASE      ' ;
  KEYWORD [ CASEVARSYM ] := 'CASE      ' ;
  KEYWORD [ OFSYM      ] := 'OF        ' ;
  KEYWORD [ FORSYM     ] := 'FOR       ' ;
  KEYWORD [ WHILESYM   ] := 'WHILE     ' ;
  KEYWORD [ WITHSYM    ] := 'WITH      ' ;
  KEYWORD [ DOSYM      ] := 'DO        ' ;
  KEYWORD [ IFSYM      ] := 'IF        ' ;
  KEYWORD [ THENSYM    ] := 'THEN      ' ;
  KEYWORD [ ELSESYM    ] := 'ELSE      ' ;
  KEYWORD [ ENDSYM     ] := 'END       ' ;
  KEYWORD [ UNTILSYM   ] := 'UNTIL     ' ;
  DBLCHARS := [ BECOMES, OPENCOMMENT ];
  DBLCHAR [ BECOMES     ]  := ':=' ;
  DBLCHAR [ OPENCOMMENT ]  := '(*' ;
  SGLCHAR [ SEMICOLON  ]   := ';' ;
  SGLCHAR [ COLON      ]   := ':' ;
  SGLCHAR [ EQUALS     ]   := '=' ;
  SGLCHAR [ OPENPAREN  ]   := '(' ;
  SGLCHAR [ CLOSEPAREN ]   := ')' ;
  SGLCHAR [ PERIOD     ]   := '.' ;
  RECORDSEEN := FALSE;
SAWCOMOPEN := FALSE;
SAWCOMCLOSE := FALSE;
INACOMMENT := FALSE;
SAWQUOTEDSTRING := FALSE;
  GETCHAR(
           (* UPDATING *)  NEXTCHAR,
           (* RETURNING *) CURRCHAR  );
  NEW(CURRSYM);
  NEW(NEXTSYM);
  GETSYMBOL(
             (* UPDATING *)  NEXTSYM,
             (* RETURNING *) CURRSYM  );
  WITH PPOPTION [ PROGSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ BLANKLINEBEFORE,
                               SPACEAFTER ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ FUNCSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ BLANKLINEBEFORE,
                               DINDENTONKEYS,
                               SPACEAFTER ];
        DINDENTSYMBOLS    := [ LABELSYM,
                               CONSTSYM,
                               TYPESYM,
                               VARSYM ];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ PROCSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ BLANKLINEBEFORE,
                               DINDENTONKEYS,
                               SPACEAFTER ];
        DINDENTSYMBOLS    := [ LABELSYM,
                               CONSTSYM,
                               TYPESYM,
                               VARSYM ];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ LABELSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ BLANKLINEBEFORE,
                               SPACEAFTER,
                               INDENTTOCLP,
                               CRAFTER ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ CONSTSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ BLANKLINEBEFORE,
                               DINDENTONKEYS,
                               SPACEAFTER,
                               INDENTTOCLP,
                               CRAFTER ];
        DINDENTSYMBOLS    := [ LABELSYM ];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ TYPESYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ BLANKLINEBEFORE,
                               DINDENTONKEYS,
                               SPACEAFTER,
                               INDENTTOCLP,
                               CRAFTER ];
        DINDENTSYMBOLS    := [ LABELSYM,
                               CONSTSYM ];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ VARSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ BLANKLINEBEFORE,
                               DINDENTONKEYS,
                               SPACEAFTER,
                               INDENTTOCLP,
                               CRAFTER  ];
        DINDENTSYMBOLS    := [ LABELSYM,
                               CONSTSYM,
                               TYPESYM ];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ BEGINSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ DINDENTONKEYS,
                               INDENTBYTAB,
                               CRAFTER ];
        DINDENTSYMBOLS    := [ LABELSYM,
                               CONSTSYM,
                               TYPESYM,
                               VARSYM ];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ REPEATSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ INDENTBYTAB,
                               CRAFTER ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ RECORDSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ INDENTBYTAB,
                               CRAFTER ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := []
     END;
  WITH PPOPTION [ CASESYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ SPACEAFTER,
                               INDENTBYTAB,
                               GOBBLESYMBOLS,
                               CRAFTER ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := [ OFSYM ]
     END;
  WITH PPOPTION [ CASEVARSYM ] DO
     BEGIN
        OPTIONSSELECTED   := [ SPACEAFTER,
                               INDENTBYTAB,
                               GOBBLESYMBOLS,
                               CRAFTER ];
        DINDENTSYMBOLS    := [];
        GOBBLETERMINATORS := [ OFSYM ]
     END;
INT2 ( TOPOFS
TACK, CURRLINEPOS, CURRMARGIN, KEYWORD, DBLCHARS, DBLCHAR,
SGLCHAR, RECORDSEEN, CURRCHAR, NEXTCHAR, CURRSYM, NEXTSYM, PPOPTION );
END;

     BLCHAR,
     SGLCHAR,
     RECORDSEEN,
     CURRCHAR,
     NEXTCHAR, CURRSYM, NEXTSYM, PPOPTION );
END;