diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 63 |
1 files changed, 45 insertions, 18 deletions
@@ -132,6 +132,8 @@ expect(const Token *tok, TokenType type) static bool equal(const Token *tok, const char *op) { + if (tok == NULL) + return false; return memcmp(tok->loc, op, tok->len) == 0 && op[tok->len] == '\0'; } @@ -490,41 +492,61 @@ static Node * global(Token **rest, Token *tok) { tok = skip(tok, "global"); - Node *const node = new_word(tok); - node->type = NOD_GLOBAL; + expect(tok, TOK_WORD); - tok = tok->next; + Node head = {0}; + Node *node = &head; + while (tok->type != TOK_EOF && !equal(tok, ";")) { + Node *const cur = new_word(tok); + node = node->next = cur; + cur->type = NOD_GLOBAL; - if (equal(tok, "[")) { tok = tok->next; - node->lhs = expr(&tok, tok); - tok = skip(tok, "]"); - } - if (equal(tok, "=")) { - tok = tok->next; - node->val = get_number(tok); - tok = tok->next; + if (equal(tok, "[")) { + tok = tok->next; + cur->lhs = expr(&tok, tok); + tok = skip(tok, "]"); + } + + if (equal(tok, "=")) { + tok = tok->next; + cur->val = get_number(tok); + tok = tok->next; + } + + if (equal(tok, ",")) + tok = tok->next; } *rest = skip(tok, ";"); - return node; + return head.next; } static Node * local(Token **rest, Token *tok) { tok = skip(tok, "local"); - Node *const node = new_unary(NOD_LOCAL, tok, new_word(tok)); - tok = tok->next; + expect(tok, TOK_WORD); - if (equal(tok, "=")) { + Node head = {0}; + Node *node = &head; + while (tok->type != TOK_EOF && !equal(tok, ";")) { + Node *const cur = new_unary(NOD_LOCAL, tok, new_word(tok)); + node = node->next = cur; tok = tok->next; - node->rhs = expr(&tok, tok); + + if (equal(tok, "=")) { + tok = tok->next; + cur->rhs = expr(&tok, tok); + } + + if (equal(tok, ",")) + tok = tok->next; } *rest = skip(tok, ";"); - return node; + return head.next; } static Node * @@ -806,8 +828,11 @@ block_stmt(Token **rest, Token *tok) Node head = {0}; Node *cur = &head; - while (tok->type != TOK_EOF && equal(tok, "local")) + while (tok->type != TOK_EOF && equal(tok, "local")) { cur = cur->next = local(&tok, tok); + while (cur->next != NULL) + cur = cur->next; + } while (tok->type != TOK_EOF && !equal(tok, "}")) cur = cur->next = stmt(&tok, tok); node->lhs = head.next; @@ -1414,6 +1439,8 @@ parse(Token *tok) if (equal(tok, "global")) { cur = cur->next = global(&tok, tok); + while (cur->next != NULL) + cur = cur->next; continue; } |