aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.c5
-rw-r--r--src/parser/ast.h8
-rw-r--r--src/parser/parser.c22
3 files changed, 35 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
index e33734d..9a31f83 100644
--- a/src/main.c
+++ b/src/main.c
@@ -67,6 +67,11 @@ static void print_statement(struct Statement* statement, const char* indent)
}
printf(")\n");
break;
+ case STATEMENT_STACK:
+ printf("%sstack %.*s[%.*s]\n", indent,
+ (int)statement->stack.name.length, statement->stack.name.start,
+ (int)statement->stack.size.length, statement->stack.size.start);
+ break;
}
}
diff --git a/src/parser/ast.h b/src/parser/ast.h
index 3fa80da..8281085 100644
--- a/src/parser/ast.h
+++ b/src/parser/ast.h
@@ -67,6 +67,7 @@ enum StatementKind
STATEMENT_SYSCALL,
STATEMENT_IF,
STATEMENT_CALL,
+ STATEMENT_STACK,
};
struct AssignStatement
@@ -103,6 +104,12 @@ struct CallStatement
size_t arg_capacity;
};
+struct StackStatement
+{
+ struct Token name;
+ struct Token size;
+};
+
struct Statement
{
enum StatementKind kind;
@@ -113,6 +120,7 @@ struct Statement
struct GotoStatement jump;
struct IfStatement branch;
struct CallStatement call;
+ struct StackStatement stack;
};
};
diff --git a/src/parser/parser.c b/src/parser/parser.c
index 55203ca..d2a7285 100644
--- a/src/parser/parser.c
+++ b/src/parser/parser.c
@@ -310,6 +310,28 @@ static bool parse_statement(struct Parser* parser, struct Statement* out)
return true;
}
+ if (match_token(parser, TOKEN_STACK))
+ {
+ if (!consume(parser, TOKEN_IDENTIFIER, "expected buffer name after 'stack'"))
+ return false;
+ struct Token name = parser->previous;
+
+ if (!consume(parser, TOKEN_LEFT_BRACKET, "expected '[' after buffer name"))
+ return false;
+
+ if (!consume(parser, TOKEN_INTEGER, "expected buffer size"))
+ return false;
+ struct Token size = parser->previous;
+
+ if (!consume(parser, TOKEN_RIGHT_BRACKET, "expected ']' after buffer size"))
+ return false;
+
+ out->kind = STATEMENT_STACK;
+ out->stack.name = name;
+ out->stack.size = size;
+ return true;
+ }
+
if (match_token(parser, TOKEN_GOTO))
{
if (!consume(parser, TOKEN_IDENTIFIER, "expected label after 'goto'"))