aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/parser.c b/src/parser.c
index ddaee72..ae7c1b3 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -552,6 +552,14 @@ static bool parse_if(struct Parser* parser, struct Statement* out)
static bool parse_while(struct Parser* parser, struct Statement* out)
{
+ // an optional .name makes the loop's asm labels readable (.name / .name_end)
+ struct Token name = { 0 };
+ bool named = match_token(parser, TOKEN_DOT);
+ if (named && !consume(parser, TOKEN_IDENTIFIER, "expected a loop name after '.'"))
+ return false;
+ if (named)
+ name = parser->previous;
+
struct Expr* left;
struct Token comparison;
struct Expr* right;
@@ -568,6 +576,8 @@ static bool parse_while(struct Parser* parser, struct Statement* out)
}
out->kind = STATEMENT_WHILE;
+ out->loop.named = named;
+ out->loop.name = name;
out->loop.left = left;
out->loop.comparison = comparison;
out->loop.right = right;