DEFINITION MODULE Lexer; FROM FIO IMPORT File; 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: ARRAY[1..256] OF CHAR 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.