PROCEDURE GETSYM; VAR I,J,K:INTEGER; PROCEDURE GETCH; BEGIN END; (*GETCH*) BEGIN (*GETSYM*) WHILE CH=' ' OR CH='(' DO (*SKIP BLANKS & COMMENTS*) IF CH=' ' THEN GETCH ELSE BEGIN GETCH; IF CH='*' THEN BEGIN (*COMMENT*) GETCH; REPEAT VORCH:=CH; GETCH UNTIL VORCH='*' AND CH=')' END ELSE BEGIN B:=TRUE; CC:=CC-1 END END; (*BLANKS AND COMMENTS*) IF B=TRUE THEN CH:='('; IF CH>='A' AND CH<='Z' THEN BEGIN (*IDENTIFIER OR RESERVED WORD*) K:=0; ID:=' '; REPEAT IF K'Z') AND (CH<'0' OR CH>'9'); I:=1; J:=NORW; REPEAT K:=(I+J) DIV 2; IF ID>WORD[K] THEN I:=K+1 ELSE J:=K UNTIL I=J; IF ID=WORD[I] THEN SYM:=I+50 ELSE SYM:=1 END (*IDENTIFIER OR RESERVED WORD*) ELSE IF CH>='0' AND CH<='9' THEN BEGIN (*NUMBER*) INUM:=0; SYM:=2;K:=0;J:=0;I:=1; REPEAT K:=K+1; INUM:=INUM*10+ORD(CH)-ORD('0'); GETCH UNTIL CH<'0' OR CH>'9'; IF K>KMAX THEN BEGIN INUM:=0;ERROR END; K:=0; RNUM:=INUM; IF CH='.'THEN BEGIN GETCH; IF CH<>'.' THEN BEGIN SYM:=3; K:=0; REPEAT IF CH<'0' OR CH>'9' THEN ERROR ELSE BEGIN RNUM:=RNUM*10+ORD(CH)-ORD('0'); GETCH; K:=K+1 END UNTIL CH<'0' OR CH>'9' END ELSE CC:=CC-1 END; IF CH='E' THEN BEGIN SYM:=3; GETCH; IF CH='-' THEN BEGIN I:=-1; GETCH END ELSE IF CH='+' THEN GETCH; REPEAT IF CH<'0' OR CH>'9' THEN ERROR ELSE BEGIN J:=J*10+ORD(CH)-ORD('0'); GETCH END UNTIL CH<'0' OR CH>'9'; J:=J*I-K; IF J>EMAX OR J':BEGIN GETCH; IF CH='=' THEN BEGIN SYM:=15;GETCH END ELSE SYM:=14 END; '.':BEGIN GETCH; IF CH='.' THEN BEGIN SYM:=25;GETCH END ELSE SYM:=21 END; '''':BEGIN K:=0; B:=TRUE; SYM:=5; GETCH; REPEAT K:=K+1; IF K>LLENG THEN FATAL; IF K+SX>SMAX THEN FATAL; IF CH='''' THEN BEGIN GETCH; IF CH='''' THEN BEGIN STAB(K+SX):=CH; GETCH END ELSE B:=FALSE END ELSE BEGIN STAB(K+SX):=CH; GETCH END UNTIL B=FALSE; SLENG:=K-1; IF SLENG=0 THEN BEGIN ERROR; SYM:=65 END ELSE IF SLENG=1 THEN SYM:=4; INUM:=SX; SX:=SX+SLENG END;