From 64a63b38791947c5ae7c21fb355fc35d240dc47f Mon Sep 17 00:00:00 2001 From: DanielGavin Date: Sun, 3 Sep 2023 16:15:03 +0200 Subject: [PATCH] Add #reverse to `odin/parser`. --- core/odin/ast/ast.odin | 1 + core/odin/parser/parser.odin | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 58d977171..f2c3e029b 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -419,6 +419,7 @@ Range_Stmt :: struct { in_pos: tokenizer.Pos, expr: ^Expr, body: ^Stmt, + reverse: bool, } Inline_Range_Stmt :: struct { diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 122e73b9c..da6530911 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -1431,6 +1431,18 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt { return es case "unroll": return parse_unrolled_for_loop(p, tag) + case "reverse": + stmt := parse_for_stmt(p) + + if range, is_range := stmt.derived.(^ast.Range_Stmt); is_range { + if range.reverse { + error(p, range.pos, "#reverse already applied to a 'for in' statement") + } + range.reverse = true + } else { + error(p, range.pos, "#reverse can only be applied to a 'for in' statement") + } + return stmt case "include": error(p, tag.pos, "#include is not a valid import declaration kind. Did you meant 'import'?") return ast.new(ast.Bad_Stmt, tok.pos, end_pos(tag))