feat: add range-based for loops

- Parse range expressions in expressions (0..5, 0..=5)
- Add ekRange AST node, hRange HIR node
- Lower for-range to while loop with alloca counter
- Add hBlock.isScope flag for C scope emission
- Update C backend to emit scope blocks only when isScope is set
This commit is contained in:
2026-05-31 02:13:30 +03:00
parent 92c5cd59f5
commit b177e8fbce
4 changed files with 87 additions and 13 deletions
+13 -2
View File
@@ -326,6 +326,7 @@ proc parseAdd(p: var Parser): Expr
proc parseShift(p: var Parser): Expr
proc parseCast(p: var Parser): Expr
proc parseComparison(p: var Parser): Expr
proc parseRange(p: var Parser): Expr
proc parseEquality(p: var Parser): Expr
proc parseBitAnd(p: var Parser): Expr
proc parseBitXor(p: var Parser): Expr
@@ -583,12 +584,22 @@ proc parseComparison(p: var Parser): Expr =
left = newBinaryExpr(op, left, right, loc)
return left
proc parseEquality(p: var Parser): Expr =
proc parseRange(p: var Parser): Expr =
let loc = p.currentLoc
var left = p.parseComparison()
if p.check(tkDotDot) or p.check(tkDotDotEqual):
let inclusive = p.check(tkDotDotEqual)
discard p.advance()
let right = p.parseComparison()
return Expr(kind: ekRange, loc: loc, exprRangeLo: left, exprRangeHi: right, exprRangeInclusive: inclusive)
return left
proc parseEquality(p: var Parser): Expr =
let loc = p.currentLoc
var left = p.parseRange()
while p.checkAny([tkEq, tkNe]):
let op = p.advance().kind
let right = p.parseComparison()
let right = p.parseRange()
left = newBinaryExpr(op, left, right, loc)
return left