aboutsummaryrefslogtreecommitdiffstats
path: root/src/lexer.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-02-12 19:06:09 +0100
committerBad Diode <bd@badd10de.dev>2022-02-12 19:06:09 +0100
commitfa32ad3224b3e362e5f79eee8785334f4bebdbc8 (patch)
tree4c5cb46baa8dc010921d755f157d6e23db9ce5d0 /src/lexer.c
parentc4765a539ee01625dd310a02f0be16ec9a64e2e4 (diff)
downloadbdl-fa32ad3224b3e362e5f79eee8785334f4bebdbc8.tar.gz
bdl-fa32ad3224b3e362e5f79eee8785334f4bebdbc8.zip
Add boilerplate for parser
Diffstat (limited to 'src/lexer.c')
-rw-r--r--src/lexer.c62
1 files changed, 1 insertions, 61 deletions
diff --git a/src/lexer.c b/src/lexer.c
index 5175b1c..f63ff4f 100644
--- a/src/lexer.c
+++ b/src/lexer.c
@@ -141,67 +141,6 @@ is_delimiter(char c) {
141 return false; 141 return false;
142} 142}
143 143
144size_t
145scan_number_token(Scanner *scanner) {
146 // TODO: This looks like more a parsing problem than lexer,
147 // consider moving it there. If starts with `-` and there is no
148 // delimiter after, or if it starts with a number, it is
149 // TOKEN_NUMBER.
150 char first = scan_next(scanner);
151 char second = scan_peek(scanner);
152 size_t n = 1;
153 if (first == '0' && !is_delimiter(second)) {
154 if (second == 'x') {
155 // Hex constant.
156 scan_next(scanner);
157 n++;
158 if (is_delimiter(scan_peek(scanner))) {
159 return 0;
160 }
161 while (!is_delimiter(scan_peek(scanner))) {
162 char c = scan_next(scanner);
163 if (!(c >= '0' && c <= '9') &&
164 !(c >= 'a' && c <= 'f') &&
165 !(c >= 'A' && c <= 'F')) {
166 return 0;
167 }
168 n++;
169 }
170 return n;
171 } else if (second == 'b') {
172 // Binary constant.
173 scan_next(scanner);
174 n++;
175 if (is_delimiter(scan_peek(scanner))) {
176 return 0;
177 }
178 while (!is_delimiter(scan_peek(scanner))) {
179 char c = scan_next(scanner);
180 if (!(c == '0' || c == '1')) {
181 return 0;
182 }
183 n++;
184 }
185 }
186 }
187
188 // Decimal number or floating point.
189 bool has_dot = false;
190 while (!is_delimiter(scan_peek(scanner))) {
191 char c = scan_next(scanner);
192 if (c == '.') {
193 if (has_dot) {
194 return 0;
195 }
196 has_dot = true;
197 } else if (!(c >= '0' && c <= '9')) {
198 return 0;
199 }
200 n++;
201 }
202 return n;
203}
204
205TokenType 144TokenType
206find_token_type(const StringView value) { 145find_token_type(const StringView value) {
207 for (size_t i = 0; i < sizeof(keywords) / sizeof(Keyword); i++) { 146 for (size_t i = 0; i < sizeof(keywords) / sizeof(Keyword); i++) {
@@ -285,6 +224,7 @@ tokenize(const StringView *sv) {
285 } 224 }
286 size_t n = 1; 225 size_t n = 1;
287 bool is_number = c == '-' && !is_delimiter(scan_peek(&scanner)); 226 bool is_number = c == '-' && !is_delimiter(scan_peek(&scanner));
227 is_number = c == '+' && !is_delimiter(scan_peek(&scanner));
288 is_number = is_number || (c >= '0' && c <= '9'); 228 is_number = is_number || (c >= '0' && c <= '9');
289 if (is_number) { 229 if (is_number) {
290 while (!is_delimiter(scan_peek(&scanner))) { 230 while (!is_delimiter(scan_peek(&scanner))) {