🐐 Continue statement

This commit is contained in:
2026-04-10 13:37:15 +02:00
parent 4937a95f70
commit 633a8dedc8
7 changed files with 98 additions and 5 deletions

View File

@@ -494,6 +494,21 @@ class Erumpe(Node):
return vtable, ValNul()
class Continva(Node):
def __eq__(self, other):
return type(self) == type(other)
def __repr__(self) -> str:
return "Continva()"
def print(self):
return "CONTINVA"
def _eval(self, vtable):
vtable["#continue"] = True
return vtable, ValNul()
class Nullus(Node):
def __eq__(self, other):
return type(self) == type(other)
@@ -723,12 +738,16 @@ class DumStatement(Node):
while not cond:
for statement in self.statements:
vtable, val = statement.eval(vtable)
if vtable["#break"] or vtable["#return"] is not None:
if vtable["#break"] or vtable["#continue"] or vtable["#return"] is not None:
break
last_val = val
if vtable["#break"]:
vtable["#break"] = False
break
if vtable["#continue"]:
vtable["#continue"] = False
vtable, cond = self.test.eval(vtable)
continue
if vtable["#return"] is not None:
break
vtable, cond = self.test.eval(vtable)
@@ -765,12 +784,15 @@ class PerStatement(Node):
vtable[variable_name] = item
for statement in self.statements:
vtable, val = statement.eval(vtable)
if vtable["#break"] or vtable["#return"] is not None:
if vtable["#break"] or vtable["#continue"] or vtable["#return"] is not None:
break
last_val = val
if vtable["#break"]:
vtable["#break"] = False
break
if vtable["#continue"]:
vtable["#continue"] = False
continue
if vtable["#return"] is not None:
break
return vtable, last_val
@@ -904,6 +926,7 @@ class Program(BaseBox):
def eval(self, *_):
vtable = {
"#break": False,
"#continue": False,
"#return": None,
"#modules": [m.module_name for m in self.modules],
}

View File

@@ -1,6 +1,6 @@
from centvrion.ast_nodes import (
Designa, DesignaIndex, SiStatement, DumStatement, PerStatement,
Defini, Redi, Erumpe, ExpressionStatement, ID,
Defini, Redi, Erumpe, Continva, ExpressionStatement, ID,
)
from centvrion.compiler.emit_expr import emit_expr
@@ -92,6 +92,9 @@ def emit_stmt(node, ctx):
if isinstance(node, Erumpe):
return ["break;"]
if isinstance(node, Continva):
return ["continue;"]
if isinstance(node, ExpressionStatement):
lines, _ = emit_expr(node.expression, ctx)
return lines

View File

@@ -9,6 +9,7 @@ keyword_tokens = [("KEYWORD_"+i, i) for i in [
"DESIGNA",
"DONICVM",
"DVM",
"CONTINVA",
"ERVMPE",
"EST",
"ET",

View File

@@ -97,6 +97,10 @@ class Parser():
def erumpe(_):
return ast_nodes.Erumpe()
@self.pg.production('statement : KEYWORD_CONTINVA')
def continva(_):
return ast_nodes.Continva()
@self.pg.production('si_statement : KEYWORD_SI expression KEYWORD_TVNC SYMBOL_LCURL statements SYMBOL_RCURL')
@self.pg.production('si_statement : KEYWORD_SI expression KEYWORD_TVNC SYMBOL_LCURL statements SYMBOL_RCURL aluid_statement')
def si_statement(tokens):