BEGINN [HAUPTPROGRAMM PASCAL-S PARSER VERSION:5-JUN-1980] FUER I:=1 BIS NORW MACH LIES#:WORD(I); SCHREIB "PASCAL-S PARSER"; SCHREIB"*OUTLLENG DANN FUEHRE SCHREIB; LC:=0 AUS BIS SYM=21 UND VORSYM=60 [D.H. BIS SYMBOL PUNKT GEFUNDEN] ENDE;[HAUPTPROGRAMM] DATEN "AND","ARRAY","BEGIN","CASE","CONST","DIV","DOWNTO"; DATEN "DO","ELSE","END","FOR","FUNCTION","IF","MOD","NIL","NOT"; DATEN "OF","OR","OTHERS","PROCEDURE","PROGRAM","RECORD","REPEAT"; DATEN "THEN","TO","TYPE","UNTIL","VAR","WHILE"; @GETCH:[GET CHARACTER] BEGINN WENN CC=LL DANN FUEHRE SCHREIB; LC:=0; WENN ED#1 DANN SCHREIB "PROGRAMM UNVOLLSTAENDIG" SONST FUEHRE CC:=0; SCHREIB" "!; LIES#1:Z$;SCHREIB Z$;LL:=LEN(Z$) AUS AUS; CC:=CC+1;CH:=SEG$(Z$,CC,CC) ENDE; @GETSYM: BEGINN B:=0; SOLANGE CH = " " ODER CH="(" FUEHRE WENN CH=" " DANN @GETCH; WENN CH="(" DANN FUEHRE @GETCH; WENN CH<>"*" DANN FUEHRE B:=1; CC:=CC-1 AUS SONST FUEHRE WIEDERHOLE VORCH:=CH; @GETCH BIS VORCH = "*" UND CH=")";@GETCH AUS AUS AUS; WENN B=1 DANN CH:="("; WENN CH>="A" UND CH<="Z" DANN FUEHRE K:=0; ID:=""; WIEDERHOLE WENN K"Z" DANN WENN CH<"0" ODER CH>"9" DANN B:=1 BIS B=1; SCHREIB ID " "!; LC:=LC+12; I:=1; J:=NORW; WIEDERHOLE K:=INT((I+J)/2); WENN ID>WORD(K) DANN I:=K+1 SONST J:=K BIS I=J; WENN ID=WORD(I) DANN SYM:=I+50 SONST SYM:=1 AUS SONST WENN CH >="0" UND CH<="9" DANN FUEHRE K:=0; INUM:=0; SYM:=2; WIEDERHOLE INUM:=INUM*10+VAL(CH); K:=K+1; @GETCH BIS CH<"0" ODER CH>"9"; WENN K>KMAX ODER INUM>NMAX DANN FUEHRE FEHLER:=21; @ERROR; INUM:=0; K:=0 AUS; RNUM:=INUM; [ ] WENN CH="." DANN FUEHRE @GETCH; WENN CH="." DANN CC:=CC-1 SONST FUEHRE SYM:=3; K:=0; SOLANGE CH>="0" UND CH<="9" FUEHRE K:=K-1; RNUM:=10*RNUM+VAL(CH); @GETCH AUS AUS AUS; WENN CH = "E" DANN FUEHRE SYM:=3; @GETCH; WENN CH="+" DANN @GETCH SONST WENN CH="-" DANN FUEHRE @GETCH; I:=-1 AUS; SOLANGE CH>="0" UND CH <="9" FUEHRE J:=J*10+VAL(CH); @GETCH AUS; J:=J*I+K; WENN J>EMAX ODER J":FUEHRE @GETCH; WENN CH = "=" DANN FUEHRE SYM := 15; @GETCH AUS SONST SYM:=14 AUS; ".":FUEHRE @GETCH; WENN CH="." DANN FUEHRE SYM:=25; @GETCH AUS SONST SYM:=21 AUS; "'":FUEHRE K:=0; B:=1; SYM:=5; @GETCH; WIEDERHOLE K:=K+1; WENN K>LLENG DANN FUEHRE FEHLER:=8; @FATAL AUS; WENN K+SX>SMAX DANN FUEHRE FEHLER:=7; @FATAL AUS; WENN CH="'" DANN FUEHRE @GETCH; WENN CH="'" DANN FUEHRE STAB(K+SX):=CH; @GETCH AUS SONST B:=0 AUS SONST FUEHRE STAB(K+SX):=CH; @GETCH AUS BIS B=0; SLENG:=K-1; WENN SLENG=0 DANN FUEHRE FEHLER:=3654; @ERROR; SYM:=65 AUS SONST WENN SLENG=1 DANN SYM:=4; INUM:=SX; SX:=SX+SLENG AUS; "+":FUEHRE SYM:=6; @GETCH AUS; "-":FUEHRE SYM:=7; @GETCH AUS; "*":FUEHRE SYM:=8; @GETCH AUS; "/":FUEHRE SYM:=9; @GETCH AUS; "=":FUEHRE SYM:=10; @GETCH AUS; "(":FUEHRE SYM:=16; @GETCH AUS; ")":FUEHRE SYM:=17; @GETCH AUS; "[":FUEHRE SYM:=18; @GETCH AUS; "]":FUEHRE SYM:=19; @GETCH AUS; KOMMA:FUEHRE SYM:=22; @GETCH AUS ENDE ENDE; [GETSYM] [ ] @ERROR: BEGINN SCHREIB "EINFACHER FEHLER NR " ! FEHLER; ERR:=ERR+1 ENDE; @FATAL: BEGINN SCHREIB "FATALER FEHLER NR " ! FEHLER; STOP ENDE