commit 67645c1dff4b1482e6730c6e00001072e5c695af
parent 6e5fb6c210e7fe49dba0d27f12d737fed4f2f218
Author: Nihal Jere <nihal@nihaljere.xyz>
Date: Sat, 4 Dec 2021 19:07:30 -0600
add ADVANCE macro to advance slice when lexing
Diffstat:
M | main.c | | | 66 | ++++++++++++++++++++++++++---------------------------------------- |
1 file changed, 26 insertions(+), 40 deletions(-)
diff --git a/main.c b/main.c
@@ -20,6 +20,10 @@
struct decls decls;
struct exprs exprs;
+#define ADVANCE(n) \
+ start.ptr += (n) ; \
+ start.len -= (n) ;
+
struct token *
lex(struct slice start)
{
@@ -31,89 +35,69 @@ lex(struct slice start)
while (start.len) {
if (slice_cmplit(&start, "if") == 0) {
cur->type = TOK_IF;
- start.ptr += 2;
- start.len -= 2;
+ ADVANCE(2);
} else if (slice_cmplit(&start, "else") == 0) {
cur->type = TOK_ELSE;
- start.ptr += 4;
- start.len -= 4;
+ ADVANCE(4);
} else if (isblank(*start.ptr)) {
- start.ptr += 1;
- start.len -= 1;
+ ADVANCE(1);
continue;
} else if (*start.ptr == '>') {
cur->type = TOK_GREATER;
- start.ptr += 1;
- start.len -= 1;
+ ADVANCE(1);
} else if (*start.ptr == ',') {
cur->type = TOK_COMMA;
- start.ptr += 1;
- start.len -= 1;
+ ADVANCE(1);
} else if (*start.ptr == '(') {
cur->type = TOK_LPAREN;
- start.ptr += 1;
- start.len -= 1;
+ ADVANCE(1);
} else if (*start.ptr == ')') {
cur->type = TOK_RPAREN;
- start.ptr += 1;
- start.len -= 1;
+ ADVANCE(1);
} else if (*start.ptr == '{') {
cur->type = TOK_LCURLY;
- start.ptr += 1;
- start.len -= 1;
+ ADVANCE(1);
} else if (*start.ptr == '}') {
cur->type = TOK_RCURLY;
- start.ptr += 1;
- start.len -= 1;
+ ADVANCE(1);
} else if (isdigit(*start.ptr)) {
cur->slice.ptr = start.ptr;
cur->slice.len = 1;
- start.ptr++;
- start.len--;
+ ADVANCE(1);
cur->type = TOK_NUM;
while (isdigit(*start.ptr)) {
- start.ptr++;
- start.len--;
+ ADVANCE(1);
cur->slice.len++;
}
} else if (*start.ptr == '"') {
- start.ptr++;
- start.len--;
+ ADVANCE(1);
cur->slice.ptr = start.ptr;
cur->type = TOK_STRING;
while (*start.ptr != '"') {
- start.ptr++;
- start.len--;
+ ADVANCE(1);
cur->slice.len++;
}
- start.ptr++;
- start.len--;
+ ADVANCE(1);
} else if (*start.ptr == '\n') {
- start.ptr++;
- start.len--;
+ ADVANCE(1);
continue;
} else if (*start.ptr == '+') {
cur->type = TOK_PLUS;
- start.ptr++;
- start.len--;
+ ADVANCE(1);
} else if (*start.ptr == '-') {
cur->type = TOK_MINUS;
- start.ptr++;
- start.len--;
+ ADVANCE(1);
} else if (*start.ptr == '=') {
cur->type = TOK_EQUAL;
- start.ptr++;
- start.len--;
+ ADVANCE(1);
} else if (isalpha(*start.ptr)) {
cur->type = TOK_NAME;
cur->slice.ptr = start.ptr;
cur->slice.len = 1;
- start.ptr++;
- start.len--;
+ ADVANCE(1);
while (isalnum(*start.ptr)) {
- start.ptr++;
- start.len--;
+ ADVANCE(1);
cur->slice.len++;
}
} else {
@@ -132,6 +116,8 @@ lex(struct slice start)
return head;
}
+#undef ADVANCE
+
struct data data_seg;
void