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;