annotate lexer/Lexer.d @ 36:ce17bea8e9bd new_gen

Switch statements support Can only switch on IntegerLit's but multiple values per case and the default are supported. An error is emitted if a value is used multiple times or if theres is more than one default block
author Anders Halager <halager@gmail.com>
date Sun, 20 Apr 2008 22:39:07 +0200
parents 41d23f2762c3
children f977aa28eb32
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1 module lexer.Lexer;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
2
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
3 import misc.Error,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
4 misc.DataSource;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
5
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
6 import lexer.Token,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
7 lexer.Keyword;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
8
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
9 import tango.io.Stdout;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
10
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
11 class Lexer
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
12 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
13 public:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
14 this (DataSource source)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
15 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
16 this.source = source;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
17 this.position = 0;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
18 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
19
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
20 Token next ()
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
21 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
22 switch (getNextChar)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
23 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
24 case CharType.EOF:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
25 Location l;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
26 return Token (Tok.EOF, l, 0);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
27
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
28 case CharType.Whitespace:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
29 position += 1;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
30 return this.next;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
31
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
32 case CharType.Symbol:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
33 return lexSymbol;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
34
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
35 case CharType.Letter:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
36 return lexLetter;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
37
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
38 case CharType.Number:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
39 return lexNumber;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
40 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
41 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
42
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
43 Token peek ( int skip = 0)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
44 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
45 int oldPosition = this.position;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
46 while(skip-- > 0)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
47 this.next;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
48 Token t = this.next;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
49 this.position = oldPosition;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
50 return t;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
51 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
52
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
53 public Error[] getErrors()
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
54 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
55 return this.errors;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
56 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
57 private:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
58
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
59 Token lexNumber ()
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
60 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
61 int i = 0;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
62 while(getNextChar(++i) == CharType.Number)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
63 {}
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
64
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
65 position += i;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
66
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
67 return Token(Tok.Integer, Location(position - i, this.source), i);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
68 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
69
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
70 Token lexSymbol ()
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
71 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
72 switch(source.data[position++])
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
73 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
74 case '(':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
75 return Token(Tok.OpenParentheses, Location(position - 1, this.source), 1);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
76 case ')':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
77 return Token(Tok.CloseParentheses, Location(position - 1, this.source), 1);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
78 case '{':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
79 return Token(Tok.OpenBrace, Location(position - 1, this.source), 1);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
80 case '}':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
81 return Token(Tok.CloseBrace, Location(position - 1, this.source), 1);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
82 case ';':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
83 return Token(Tok.Seperator, Location(position - 1, this.source), 1);
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 29
diff changeset
84 case ':':
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 29
diff changeset
85 return Token(Tok.Colon, Location(position - 1, this.source), 1);
28
69464d465284 Now supporting structs - both read and write. Still a few errors though, so watch out.
Anders Johnsen <skabet@gmail.com>
parents: 15
diff changeset
86 case '.':
69464d465284 Now supporting structs - both read and write. Still a few errors though, so watch out.
Anders Johnsen <skabet@gmail.com>
parents: 15
diff changeset
87 return Token(Tok.Dot, Location(position - 1, this.source), 1);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
88 case ',':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
89 return Token(Tok.Comma, Location(position - 1, this.source), 1);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
90 case '=':
6
606a57c90a0b Now lexing == as Equals
johnsen@johnsen-desktop
parents: 4
diff changeset
91 if(source.data[position] == '=')
8
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
92 return Token(Tok.Eq, Location(position++ - 1, this.source), 2);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
93 return Token(Tok.Assign, Location(position - 1, this.source), 1);
8
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
94 case '!':
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
95 if(source.data[position] == '=')
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
96 return Token(Tok.Ne, Location(position++ - 1, this.source), 2);
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
97 return Token(Tok.Not, Location(position - 1, this.source), 1);
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
98 case '<':
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
99 if(source.data[position] == '=')
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
100 return Token(Tok.Le, Location(position++ - 1, this.source), 2);
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
101 return Token(Tok.Lt, Location(position - 1, this.source), 1);
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
102 case '>':
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
103 if(source.data[position] == '=')
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
104 return Token(Tok.Ge, Location(position++ - 1, this.source), 2);
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
105 return Token(Tok.Gt, Location(position - 1, this.source), 1);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
106 case '+':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
107 return Token(Tok.Add, Location(position - 1, this.source), 1);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
108 case '-':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
109 return Token(Tok.Sub, Location(position - 1, this.source), 1);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
110 case '*':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
111 return Token(Tok.Mul, Location(position - 1, this.source), 1);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
112 case '/':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
113 switch(source.data[position])
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
114 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
115 case '/':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
116 while(getNextChar != CharType.EOF)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
117 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
118 if(source.data[position++] == '\n')
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
119 return this.next;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
120 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
121 return Token(Tok.EOF, Location(position, this.source), 0);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
122
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
123 case '*':
4
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
124 position += 2;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
125 while(getNextChar != CharType.EOF)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
126 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
127 ++position;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
128 if(source.data[position-2] == '*')
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
129 if(source.data[position-1] == '/')
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
130 return this.next;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
131 }
29
41d23f2762c3 Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
132 throw error(__LINE__, "Unexpected end of file. Unclosed comment block");
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
133
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
134 case '+':
4
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
135 position += 2;
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
136 int nesting = 1;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
137 while(getNextChar != CharType.EOF)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
138 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
139 ++position;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
140 if(source.data[position-2] == '+')
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
141 if(source.data[position-1] == '/')
4
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
142 {
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
143 position++;
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
144 nesting--;
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
145 }
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
146
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
147 if(source.data[position-2] == '/')
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
148 if(source.data[position-1] == '+')
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
149 {
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
150 nesting++;
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
151 position++;
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
152 }
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
153
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
154 if(nesting == 0)
c09464468e1d Updated lexer with comment handling to run Comments test at succes rate
johnsen@johnsen-desktop
parents: 2
diff changeset
155 return this.next;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
156 }
29
41d23f2762c3 Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
157 throw error(__LINE__, "Unexpected end of file. Unclosed comment block");
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
158
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
159 default:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
160 return Token(Tok.Div, Location(position - 1, this.source), 1);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
161 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
162 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
163 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
164
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
165 Token lexLetter ()
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
166 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
167 int i = 0;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
168 bool hasNumber = false;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
169 while (getNextChar(++i) == CharType.Letter ||
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
170 getNextChar(i) == CharType.Number)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
171 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
172 if (getNextChar(i) == CharType.Number)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
173 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
174 hasNumber = true;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
175 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
176 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
177
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
178 Token t = Token(Tok.Identifier, Location(position, source), i);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
179
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
180 if (!hasNumber)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
181 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
182 char[] str = source.data[position .. position + i];
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
183 if(str in keywords)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
184 t.type = keywords[str];
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
185 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
186
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
187 position += i;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
188
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
189 return t;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
190 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
191
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
192 CharType getNextChar(int offset = 0)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
193 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
194 if (position + offset >= this.source.data.length)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
195 return CharType.EOF;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
196
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
197 char current = source.data[position + offset];
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
198
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
199 if (current >= 'A' && current <= 'Z' ||
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
200 current >= 'a' && current <= 'z' || current > 127)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
201 return CharType.Letter;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
202
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
203 if (current >= '0' && current <= '9')
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
204 return CharType.Number;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
205
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
206 switch(current)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
207 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
208 case ' ':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
209 case '\n':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
210 return CharType.Whitespace;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
211
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
212 case '(':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
213 case ')':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
214 case '{':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
215 case '}':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
216 case ';':
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 29
diff changeset
217 case ':':
28
69464d465284 Now supporting structs - both read and write. Still a few errors though, so watch out.
Anders Johnsen <skabet@gmail.com>
parents: 15
diff changeset
218 case '.':
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
219 case ',':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
220 case '=':
8
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
221 case '!':
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
222 case '<':
2e1069ee21af Added Ne, Lt, Le, Gt, Ge and Not in lexer
johnsen@johnsen-desktop
parents: 6
diff changeset
223 case '>':
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
224 case '+':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
225 case '-':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
226 case '*':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
227 case '/':
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
228 return CharType.Symbol;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
229
6
606a57c90a0b Now lexing == as Equals
johnsen@johnsen-desktop
parents: 4
diff changeset
230 default:
29
41d23f2762c3 Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
231 throw error(__LINE__, "Read invalid symbol: '%0'").arg(current);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
232 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
233
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
234 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
235
29
41d23f2762c3 Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
236 Error error(uint line, char[] msg)
41d23f2762c3 Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
237 {
41d23f2762c3 Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
238 return (new Error(msg)).loc(Location(position, source));
41d23f2762c3 Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
239 }
41d23f2762c3 Merge, and updated Error class
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
240
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
241 DataSource source;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
242 int position;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
243 Error[] errors;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
244 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
245
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
246 enum CharType : ubyte
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
247 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
248 Letter,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
249 Number,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
250 Symbol,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
251 Whitespace,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
252
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
253 EOF
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
254 }