(* Copyright (C) 1992, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* Last modified on Tue Feb 11 17:00:40 PST 1992 by muller *) MODULE Lex; IMPORT Text, Rd, TextRd, Convert, Thread; <*FATAL Thread.Alerted, Rd.EndOfFile*> PROCEDURE Scan(rd: Rd.T; READONLY cs: SET OF CHAR := NonBlanks): TEXT RAISES {Rd.Failure} = CONST BufSize=256; VAR c: CHAR; i: INTEGER; t: TEXT; buf: ARRAY [0..BufSize-1] OF CHAR; BEGIN t := ""; i := 0; LOOP IF Rd.EOF(rd) THEN EXIT END; c := Rd.GetChar(rd); IF c IN cs THEN IF i=BufSize THEN t := t & Text.FromChars(buf); i := 0; END; buf[i] := c; INC(i); ELSE Rd.UnGetChar(rd); EXIT; END; END; RETURN t & Text.FromChars(SUBARRAY(buf, 0, i)); END Scan; PROCEDURE Skip(rd: Rd.T; READONLY cs: SET OF CHAR := Blanks) RAISES {Rd.Failure} = VAR c: CHAR; BEGIN LOOP IF Rd.EOF(rd) THEN EXIT END; c := Rd.GetChar(rd); IF NOT (c IN cs) THEN Rd.UnGetChar(rd); EXIT; END; END; END Skip; PROCEDURE Match(rd: Rd.T; t: TEXT) RAISES {Rd.Failure, Error} = VAR rd1: Rd.T; BEGIN rd1 := TextRd.New(t); LOOP IF Rd.EOF(rd1) THEN EXIT END; IF Rd.EOF(rd) THEN RAISE Error END; IF Rd.GetChar(rd) # Rd.GetChar(rd1) THEN RAISE Error END; END; END Match; PROCEDURE Bool(rd: Rd.T; READONLY cs: SET OF CHAR := NonBlanks): BOOLEAN RAISES {Rd.Failure, Error} = CONST BufSize=6 (* Max(Length("true"),Length("false"))+1 *); VAR c: CHAR; i: INTEGER; buf: ARRAY [0..BufSize-1] OF CHAR; BEGIN i := 0; LOOP IF Rd.EOF(rd) THEN EXIT END; c := Rd.GetChar(rd); IF c IN cs THEN IF i