summaryrefslogtreecommitdiff
path: root/source/Lexer.def
blob: 883c604af949f496e1b2ac5e9cd5a700a7c4785b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
DEFINITION MODULE Lexer;

FROM FIO IMPORT File;

FROM Common IMPORT Identifier, ShortString, TextLocation;

TYPE
  PLexerBuffer = POINTER TO CHAR;
  BufferPosition = RECORD
    iterator: PLexerBuffer;
    location: TextLocation
  END;
  PBufferPosition = POINTER TO BufferPosition;
  Lexer = RECORD
    input: File;
    buffer: PLexerBuffer;
    size: CARDINAL;
    length: CARDINAL;
    start: BufferPosition;
    current: BufferPosition
  END;
  PLexer = POINTER TO Lexer;
  LexerKind = (
    lexerKindEof,
    lexerKindIdentifier,
    lexerKindIf,
    lexerKindThen,
    lexerKindElse,
    lexerKindElsif,
    lexerKindWhile,
    lexerKindDo,
    lexerKindProc,
    lexerKindBegin,
    lexerKindEnd,
    lexerKindXor,
    lexerKindConst,
    lexerKindVar,
    lexerKindCase,
    lexerKindOf,
    lexerKindType,
    lexerKindRecord,
    lexerKindUnion,
    lexerKindPipe,
    lexerKindTo,
    lexerKindBoolean,
    lexerKindNull,
    lexerKindAnd,
    lexerKindOr,
    lexerKindTilde,
    lexerKindReturn,
    lexerKindDefer,
    lexerKindRange,
    lexerKindLeftParen,
    lexerKindRightParen,
    lexerKindLeftSquare,
    lexerKindRightSquare,
    lexerKindGreaterEqual,
    lexerKindLessEqual,
    lexerKindGreaterThan,
    lexerKindLessThan,
    lexerKindNotEqual,
    lexerKindEqual,
    lexerKindSemicolon,
    lexerKindDot,
    lexerKindComma,
    lexerKindPlus,
    lexerKindMinus,
    lexerKindAsterisk,
    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 |
      lexerKindString: stringKind: ShortString
    END;
    start_location: TextLocation;
    end_location: TextLocation
  END;
  PLexerToken = POINTER TO LexerToken;

PROCEDURE lexer_initialize(lexer: PLexer; input: File);
PROCEDURE lexer_destroy(lexer: PLexer);
(* Returns the last read token. *)
PROCEDURE lexer_current(lexer: PLexer): LexerToken;
(* Read and return the next token. *)
PROCEDURE lexer_lex(lexer: PLexer): LexerToken;

END Lexer.