100 lines
2.1 KiB
Modula-2
100 lines
2.1 KiB
Modula-2
DEFINITION MODULE Lexer;
|
|
|
|
FROM FIO IMPORT File;
|
|
|
|
FROM Common IMPORT Identifier;
|
|
|
|
TYPE
|
|
PLexerBuffer = POINTER TO CHAR;
|
|
Lexer = RECORD
|
|
Input: File;
|
|
Buffer: PLexerBuffer;
|
|
Size: CARDINAL;
|
|
Length: CARDINAL;
|
|
Start: PLexerBuffer;
|
|
Current: PLexerBuffer
|
|
END;
|
|
PLexer = POINTER TO Lexer;
|
|
LexerKind = (
|
|
lexerKindEof,
|
|
lexerKindIdentifier,
|
|
lexerKindIf,
|
|
lexerKindThen,
|
|
lexerKindElse,
|
|
lexerKindElsif,
|
|
lexerKindWhile,
|
|
lexerKindDo,
|
|
lexerKindProc,
|
|
lexerKindBegin,
|
|
lexerKindEnd,
|
|
lexerKindImplementation,
|
|
lexerKindConst,
|
|
lexerKindVar,
|
|
lexerKindCase,
|
|
lexerKindOf,
|
|
lexerKindType,
|
|
lexerKindRecord,
|
|
lexerKindUnion,
|
|
lexerKindPipe,
|
|
lexerKindTo,
|
|
lexerKindBoolean,
|
|
lexerKindNull,
|
|
lexerKindAnd,
|
|
lexerKindOr,
|
|
lexerKindNot,
|
|
lexerKindReturn,
|
|
lexerKindDefinition,
|
|
lexerKindRange,
|
|
lexerKindLeftParen,
|
|
lexerKindRightParen,
|
|
lexerKindLeftSquare,
|
|
lexerKindRightSquare,
|
|
lexerKindGreaterEqual,
|
|
lexerKindLessEqual,
|
|
lexerKindGreaterThan,
|
|
lexerKindLessThan,
|
|
lexerKindNotEqual,
|
|
lexerKindEqual,
|
|
lexerKindSemicolon,
|
|
lexerKindDot,
|
|
lexerKindComma,
|
|
lexerKindPlus,
|
|
lexerKindMinus,
|
|
lexerKindMultiplication,
|
|
lexerKindDivision,
|
|
lexerKindRemainder,
|
|
lexerKindAssignment,
|
|
lexerKindColon,
|
|
lexerKindHat,
|
|
lexerKindAt,
|
|
lexerKindComment,
|
|
lexerKindInteger,
|
|
lexerKindWord,
|
|
lexerKindCharacter,
|
|
lexerKindString,
|
|
lexerKindFrom,
|
|
lexerKindPointer,
|
|
lexerKindArray,
|
|
lexerKindArrow,
|
|
lexerKindProgram,
|
|
lexerKindModule,
|
|
lexerKindImport
|
|
);
|
|
LexerToken = RECORD
|
|
CASE kind: LexerKind OF
|
|
lexerKindBoolean: booleanKind: BOOLEAN |
|
|
lexerKindIdentifier: identifierKind: Identifier |
|
|
lexerKindInteger: integerKind: INTEGER
|
|
END
|
|
END;
|
|
PLexerToken = POINTER TO LexerToken;
|
|
|
|
PROCEDURE lexer_initialize(ALexer: PLexer; Input: File);
|
|
PROCEDURE lexer_destroy(ALexer: PLexer);
|
|
(* Returns the last read token. *)
|
|
PROCEDURE lexer_current(ALexer: PLexer): LexerToken;
|
|
(* Read and return the next token. *)
|
|
PROCEDURE lexer_lex(ALexer: PLexer): LexerToken;
|
|
|
|
END Lexer.
|