🐐 Continue statement
This commit is contained in:
@@ -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],
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -9,6 +9,7 @@ keyword_tokens = [("KEYWORD_"+i, i) for i in [
|
||||
"DESIGNA",
|
||||
"DONICVM",
|
||||
"DVM",
|
||||
"CONTINVA",
|
||||
"ERVMPE",
|
||||
"EST",
|
||||
"ET",
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user