PACKET io handling DEFINES error listing, err, message, errors, init errors,
text, kill, trunc, hash, no errors :
(* Autor : R. Keil, Version vom 22.07.83, Ă„nderung: C. Szymanski, 21.07.88 *)
LET errmax = 67,
max hash size = 300;
ROW errmax TEXT VAR error;
FILE VAR listfile; (* -> VERSION 3.2 *)
BOOL VAR list;
INT VAR errorno, i;
PROC init errors (TEXT CONST fname) :
FILE VAR errorfile := sequential file (input, fname);
TEXT VAR buffer;
FOR i FROM 1 UPTO errmax WHILE NOT eof (errorfile) REP
getline (errorfile, buffer);
error (i) := buffer
END REP
END PROC init errors;
PROC init errors :
errorno := 0
END PROC init errors;
PROC error listing (TEXT CONST listname) :
list := listname <> "nolist";
IF list
THEN kill (listname);
listfile := sequential file (output, listname)
FI
END PROC error listing;
INT PROC errors :
error no
END PROC errors;
PROC err (TEXT CONST s, INT CONST m, line no) :
message ("Fehler in Zeile " + text (line no) + " bei >>" + s + "<< : "
+ error (m));
errorno INCR 1
END PROC err;
BOOL PROC no errors :
IF errors = 0
THEN TRUE
ELSE display (text (error no) + " Fehler gefunden"13""10""); FALSE
FI
END PROC no errors;
PROC message (TEXT CONST m) :
IF list
THEN putline (list file, m);
FI;
note (m); (* C.S. 21.07.88 *)
note line;
display (m);
display (""13""10"")
END PROC message;
TEXT PROC text (BOOL CONST b) :
IF b
THEN "TRUE"
ELSE "FALSE"
FI
END PROC text;
PROC kill (TEXT CONST file name) :
command dialogue (FALSE);
forget (file name);
command dialogue (TRUE)
END PROC kill;
TEXT PROC trunc (TEXT CONST t) :
text (t, length (t) - 2)
END PROC trunc;
INT PROC hash (TEXT CONST word) :
INT VAR qs := 0;
FOR i FROM 1 UPTO length (word) REP
qs INCR code (word SUB i)
END REP;
(qs MOD max hash size) + 1.
END PROC hash
END PACKET io handling;
(************************* S C A N N E R **************************)
PACKET scan DEFINES next sym, scanner, scanpos :
LET bold = 1, (* Autor : R. Keil, T. Froehlich *)
number = 2, (* Version vom 04.07.83 *)
delimiter = 3,
eol = 4;
TEXT VAR main buf, sym;
INT VAR position, type, cc, begin pos;
PROC nextsym (TEXT CONST buf, TEXT VAR scan sym,
INT VAR scan type, pos) :
TEXT VAR char := buf SUB pos;
cc := code (char);
IF (cc >= 97 AND cc <= 122)
THEN process lower case
ELIF cc = 46 OR is int
THEN process real
ELIF (cc >= 65 AND cc <= 90)
THEN process upper case
ELSE process delimiter
FI.
process upper case :
scan type := bold;
scan sym := low;
next char;
WHILE (cc >= 65 AND cc <= 90) OR is int REP
scan sym CAT low;
next char
END REP.
process lower case :
scan type := bold;
begin pos := pos;
REP
next char
UNTIL lower case char AND NOT is int END REP;
scan sym := subtext (buf, begin pos, pos - 1).
lower case char :
cc < 97 OR cc > 122.
process real :
process base;
process exponent;
scan type := number.
process base :
IF cc = 46
THEN next char;
IF is int
THEN scan sym := "0.";
process int
ELSE scan type := delimiter;
scan sym := ".";
LEAVE process real
FI
ELSE scan sym := "";
process int;
IF cc = 46
THEN scan sym CAT char;
next char;
IF is int
THEN process int
ELSE scan sym CAT "0"
FI
ELSE scan sym CAT ".0"
FI
FI.
process exponent :
IF cc = 69 OR cc = 101
THEN scan sym CAT "e";
next char;
IF cc = 43 OR cc = 45
THEN scan sym CAT char; next char
FI;
IF is int
THEN process int
ELSE err (char, 63, 0)
FI
FI.
process int :
WHILE is int REP
scan sym CAT char;
next char
END REP.
is int :
cc >= 48 AND cc <= 57.
process delimiter :
IF cc = -1
THEN scan sym := "EOL"; scan type := eol
ELSE scan type := delimiter;
scan sym := char
FI;
pos INCR 1.
next char :
pos INCR 1; char := buf SUB pos; cc := code (char).
low :
IF cc >= 65 AND cc <= 90
THEN code (cc + 32)
ELSE char
FI.
END PROC next sym;
PROC scanner (TEXT CONST buf) :
main buf := buf; position := 1
END PROC scanner;
PROC next sym (TEXT VAR sym, INT VAR type) :
next sym (main buf, sym, type, position)
END PROC next sym;
INT PROC scanpos :
position
END PROC scanpos
END PACKET scan