INTERFACEM3Lexer ; IMPORT M3ID, M3Scanner, Rd, Target; TYPE T <: T_; T_ = M3Scanner.Default OBJECT char : INTEGER; text : TEXT; int : Target.Int; float : Target.Float; id : M3ID.T; METHODS initFromRd (rd : Rd.T): T; initFromBuf (buf : Buf): T; END; Buf = M3Scanner.Buf; TYPE TK = [FIRST (M3Scanner.TK) .. TK_Fatal]; CONST (* additional Token classes returned by a "Lexer.T". *) TK_Inline = LAST (M3Scanner.TK) + 1; TK_External = LAST (M3Scanner.TK) + 2; TK_Assert = LAST (M3Scanner.TK) + 3; TK_Unused = LAST (M3Scanner.TK) + 4; TK_Obsolete = LAST (M3Scanner.TK) + 5; TK_Trace = LAST (M3Scanner.TK) + 6; TK_CallConv = LAST (M3Scanner.TK) + 7; TK_Fatal = LAST (M3Scanner.TK) + 8; END M3Lexer.
An M3Lexer.T
, or lexer, parses a stream of characters and
returns a stream of Modula-3 tokens. It is an enhancement
of a standard M3Scanner.Default
scanner with the following
additional properties:
Aside from the initial value, TK_Comment
tokens are discarded.
If s.token
is TK_Ident
, s.id
is set to the corresponding M3ID.T;
If s.token
is TK_Card_const
, s.int
is set to the corresponding value.
If s.token
is TK_Real_const
, TK_Longreal_const
, or TK_Extended_const
,
s.float
is set to the corresponding value.
If s.token
is TK_Char_const
, s.char
is set to the ORD
of the
corresponding character value.
If s.token
is TK_Text_const
, s.text
is set to the corresponding
TEXT value. Escaped characters in the input are converted to their
corresponding values in s.text
.
The <*INLINE*>
, <*EXTERNAL*>
, <*ASSERT*>
, <*UNUSED*>
,
<*OBSOLETE*>
, <*TRACE*>
, <*FATAL*>
, and calling convention
pragmas are recognized and returned as new token classes. The
preceding TK_Begin_pragma
token is discarded. The portion
of the pragma following the initial identifer is returned as separate
tokens ending with a TK_End_pragma
token.
The <*NOWARN*>
, <*PRAGMA*>
, and <*LINE*>
pragmas are recognized
and discarded.
All other pragmas are returned as streams of tokens beginning with
TK_Begin_pragma
and ending with TK_End_pragma
.
It is the responsibility of the M3Lexer
client to initialize
the Target
module.