-- file MesaScanner.mesa
-- last edit by Russ Atkinson, February 9, 1982 10:42 am
DIRECTORY
Rope: TYPE
USING [ROPE];
MesaScanner: DEFINITIONS
= BEGIN OPEN Rope;
TokenKind: TYPE =
{tokenERROR, -- token.msg describes the scanning error
tokenID, -- an identifier or reserved word
tokenINT, -- an INT literal
tokenREAL, -- a REAL literal
tokenROPE, -- a ROPE literal
tokenCHAR, -- a CHAR literal
tokenATOM, -- an ATOM literal
tokenSINGLE, -- a single-character token
tokenDOUBLE, -- a double-character token
tokenCOMMENT, -- a comment
tokenEOF}; -- the end-of-file marker
Token: TYPE = RECORD
[start: INT, next: INT, kind: TokenKind, msg: ROPE];
-- start gives the 1st char pos of the token
-- next gives the char pos immediately after the token
-- (length = next - size)
-- msg # NIL only for kind = tokenERROR
GetProcType: TYPE = PROC [index: INT] RETURNS [CHAR];
-- type of user proc used to get characters
-- NUL should be returned to indicate fetch beyond end
-- ability to randomly access characters is assumed
GetToken: PROC
[get: GetProcType, index: INT]
RETURNS [token: Token];
-- gets a token given a character source and a starting position
-- the current errors (in token.msg) are:
-- "invalid escape code"
-- "invalid octal constant"
-- "invalid character code"
-- "end-of-file in string literal"
-- "invalid atom"
-- "invalid character"
RealFromToken: PROC
[get: GetProcType, token: Token] RETURNS [REAL];
-- takes a Token into a REAL (parses the literal)
-- signals WrongKind if token.kind # tokenREAL
-- other errors may be propagated from Real.ReadReal
IntFromToken: PROC
[get: GetProcType, token: Token] RETURNS [INT];
-- takes a Token into a INT (parses the literal)
-- error WrongKind if token.kind # tokenINT
-- error IntegerOverflow if decimal and number > LAST[INT]
-- error IntegerOverflow if octal and number > LAST[LONG CARDINAL]
CharFromToken: PROC
[get: GetProcType, token: Token] RETURNS [CHAR];
-- takes a Token into a CHAR (parses the literal)
-- signals WrongKind if token.kind # tokenCHAR
RopeFromToken: PROC
[get: GetProcType, token: Token] RETURNS [ROPE];
-- takes a Token into a ROPE (parses the literal)
-- signals WrongKind if token.kind # tokenROPE
AtomFromToken: PROC
[get: GetProcType, token: Token] RETURNS [ATOM];
-- takes a Token into a ATOM (parses the literal)
-- signals WrongKind if token.kind # tokenATOM
ContentsFromToken: PROC
[get: GetProcType, token: Token] RETURNS [ROPE];
-- gets the contents of the token as a ROPE
-- can be used on any token
WrongKind: ERROR;
-- raised when attempting to parse the wrong kind of literal
IntegerOverflow: ERROR;
-- raised when attempting to parse an excessive integer
END.