aboutsummaryrefslogtreecommitdiff
path: root/src/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser')
-rw-r--r--src/parser/ast.c3
-rw-r--r--src/parser/ast.h2
-rw-r--r--src/parser/parser.c10
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;