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.