diff options
Diffstat (limited to 'src/parser')
| -rw-r--r-- | src/parser/ast.c | 3 | ||||
| -rw-r--r-- | src/parser/ast.h | 2 | ||||
| -rw-r--r-- | src/parser/parser.c | 10 |
3 files changed, 11 insertions, 4 deletions
diff --git a/src/parser/ast.c b/src/parser/ast.c index f8bd9cc..788341b 100644 --- a/src/parser/ast.c +++ b/src/parser/ast.c @@ -44,6 +44,9 @@ static void free_statement(struct Statement* statement) free_expr(statement->call.args[i]); free(statement->call.args); break; + case STATEMENT_STACK: + free_expr(statement->stack.size); + break; default: break; } diff --git a/src/parser/ast.h b/src/parser/ast.h index b114fb1..c439747 100644 --- a/src/parser/ast.h +++ b/src/parser/ast.h @@ -148,7 +148,7 @@ struct CallStatement struct StackStatement { struct Token name; - struct Token size; + struct Expr* size; }; struct Statement diff --git a/src/parser/parser.c b/src/parser/parser.c index 682e193..3ed9fff 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -248,7 +248,8 @@ static struct Expr* parse_primary(struct Parser* parser) return deref; } - if (check(parser, TOKEN_IDENTIFIER) || check(parser, TOKEN_INTEGER) || check(parser, TOKEN_CHAR)) + if (check(parser, TOKEN_IDENTIFIER) || check(parser, TOKEN_INTEGER) + || check(parser, TOKEN_FLOAT) || check(parser, TOKEN_CHAR)) { advance_parser(parser); @@ -439,12 +440,15 @@ static bool parse_statement(struct Parser* parser, struct Statement* out) if (!consume(parser, TOKEN_LEFT_BRACKET, "expected '[' after buffer name")) return false; - if (!consume(parser, TOKEN_INTEGER, "expected buffer size")) + struct Expr* size = parse_expression(parser); + if (size == NULL) return false; - struct Token size = parser->previous; if (!consume(parser, TOKEN_RIGHT_BRACKET, "expected ']' after buffer size")) + { + free_expr(size); return false; + } out->kind = STATEMENT_STACK; out->stack.name = name; |
