INTERFACEThis interface defines Juno conceptual token streams and a procedure to create a new token stream from a reader. To use this interface, callJunoLex ;
New() to create a new stream s, s.next to read tokens from the
stream, and Close() to close the stream (and its associated reader).
A stream is a monitor, so that concurrent operations on streams will appear atomic.
IMPORT Rd, JunoToken;
TYPE
Private <: ROOT;
Public = Private OBJECT lastPos := 0 METHODS
next(): JunoToken.T RAISES {Error, Rd.Failure};
END;
Stream <: Public;
The call s.next() returns the next token from stream s, first skipping
any whitespace, and sets s.lastPos to the index of the first character of
the token that it returns. This token will be overwritten on the next call to
s.next(), so you must copy the token's value if you want to preserve it
across such calls. It is a checked run-time error to attempt to get a token
from a closed stream.
ErrorKind = {
BadInitialChar, (* character found not starting any legal token *)
BadEscapeChar, (* bad character following '\' in text literal *)
BadReal, (* real literal has illegal syntax *)
UnclosedComment, (* comment started but not closed before EOF *)
UnclosedText }; (* text string started but not closed before EOF *)
ErrorRec = REF RECORD
kind: ErrorKind;
initialChars: TEXT
END;
EXCEPTION
Error(ErrorRec); (* the next token is not a legal Juno token *)
If the next token is not lexically valid, next raises the Error
exception, providing a value of type ErrorRec. The kind field
describes the kind of lexical error that occurred. The initialChars field
contains the characters read in the current token up to the point of
failure. The reader associated with the Stream points to the offending
character.
PROCEDURE New(rd: Rd.T): Stream RAISES {Rd.Failure};
Create and initialize a new, live stream to read tokens from rd. PROCEDURE Close(s: Stream): TEXT;
Close the stream s. Any future calls to s.next() will cause a checked
run-time error. This call does not close the underlying reader. It
returns any characters that have been read from the underlying reader,
but which have not yet been returned in a token. PROCEDURE ErrorText(e: ErrorKind): TEXT;
Return a text version of the error e. END JunoLex.