diff options
author | Bad Diode <bd@badd10de.dev> | 2022-02-12 19:06:09 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-02-12 19:06:09 +0100 |
commit | fa32ad3224b3e362e5f79eee8785334f4bebdbc8 (patch) | |
tree | 4c5cb46baa8dc010921d755f157d6e23db9ce5d0 /src/lexer.c | |
parent | c4765a539ee01625dd310a02f0be16ec9a64e2e4 (diff) | |
download | bdl-fa32ad3224b3e362e5f79eee8785334f4bebdbc8.tar.gz bdl-fa32ad3224b3e362e5f79eee8785334f4bebdbc8.zip |
Add boilerplate for parser
Diffstat (limited to 'src/lexer.c')
-rw-r--r-- | src/lexer.c | 62 |
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 | ||
144 | size_t | ||
145 | scan_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 | |||
205 | TokenType | 144 | TokenType |
206 | find_token_type(const StringView value) { | 145 | find_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))) { |