From f197c2c3d519d0d12f83462905f7db5a9abd2ce1 Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Fri, 24 Apr 2026 18:33:48 +0200 Subject: [PATCH] :goat: Step in for loop --- README.md | 10 ++ centvrion/ast_nodes.py | 39 ++++++-- centvrion/compiler/emit_expr.py | 19 +++- centvrion/lexer.py | 1 + centvrion/parser.py | 9 ++ language/main.tex | 7 +- snippets/donicvm_gradv.cent | 5 + snippets/donicvm_gradv.png | Bin 0 -> 24734 bytes snippets/syntaxes/centvrion.sublime-syntax | 2 +- tests.py | 86 ++++++++++++++++++ vscode-extension/snippets/cent.json | 1 + .../syntaxes/cent.tmLanguage.json | 2 +- 12 files changed, 167 insertions(+), 14 deletions(-) create mode 100644 snippets/donicvm_gradv.cent create mode 100644 snippets/donicvm_gradv.png diff --git a/README.md b/README.md index e9a76b3..a52a816 100644 --- a/README.md +++ b/README.md @@ -222,6 +222,16 @@ The keyword `ET` can be used as a boolean "and". The keyword `AVT` can be used a > LV ``` +An optional `GRADV` clause sets the stride. The step must be a nonzero +integer expression; positive values ascend, negative values descend, and +the endpoint is included only when the stride lands on it exactly. + +![DONICVM with GRADV](snippets/donicvm_gradv.png) + +``` +> XXV +``` + ### DVM loops ![DVM loop](snippets/dvm.png) diff --git a/centvrion/ast_nodes.py b/centvrion/ast_nodes.py index 76a1515..b7229c4 100644 --- a/centvrion/ast_nodes.py +++ b/centvrion/ast_nodes.py @@ -369,19 +369,28 @@ class DataArray(Node): class DataRangeArray(Node): - def __init__(self, from_value, to_value) -> None: + def __init__(self, from_value, to_value, step=None) -> None: self.from_value = from_value self.to_value = to_value + self.step = step def __eq__(self, other): - return type(self) == type(other) and self.from_value == other.from_value and self.to_value == other.to_value + return (type(self) == type(other) + and self.from_value == other.from_value + and self.to_value == other.to_value + and self.step == other.step) def __repr__(self) -> str: - content_string = rep_join([self.from_value, self.to_value]) - return f"RangeArray([{content_string}])" + parts = [self.from_value, self.to_value] + if self.step is not None: + parts.append(self.step) + return f"RangeArray([{rep_join(parts)}])" def print(self): - return f"[{self.from_value.print()} VSQVE {self.to_value.print()}]" + base = f"[{self.from_value.print()} VSQVE {self.to_value.print()}" + if self.step is not None: + base += f" GRADV {self.step.print()}" + return base + "]" def _eval(self, vtable): vtable, from_val = self.from_value.eval(vtable) @@ -390,7 +399,25 @@ class DataRangeArray(Node): raise CentvrionError("Range bounds must be numbers") from_int = from_val.value() or 0 to_int = to_val.value() or 0 - return vtable, ValList([ValInt(i) for i in range(from_int, to_int + 1)]) + if self.step is None: + return vtable, ValList([ValInt(i) for i in range(from_int, to_int + 1)]) + vtable, step_val = self.step.eval(vtable) + if not isinstance(step_val, ValInt): + raise CentvrionError("Range step must be a number") + step_int = step_val.value() + if step_int == 0: + raise CentvrionError("Range step cannot be zero") + items = [] + i = from_int + if step_int > 0: + while i <= to_int: + items.append(ValInt(i)) + i += step_int + else: + while i >= to_int: + items.append(ValInt(i)) + i += step_int + return vtable, ValList(items) class DataDict(Node): diff --git a/centvrion/compiler/emit_expr.py b/centvrion/compiler/emit_expr.py index 44ee431..c319727 100644 --- a/centvrion/compiler/emit_expr.py +++ b/centvrion/compiler/emit_expr.py @@ -166,10 +166,21 @@ def emit_expr(node, ctx): hi_lines, hi_var = emit_expr(node.to_value, ctx) tmp = ctx.fresh_tmp() i_var = ctx.fresh_tmp() - cap = f"({hi_var}.ival >= {lo_var}.ival ? (int)({hi_var}.ival - {lo_var}.ival + 1) : 0)" - lines = lo_lines + hi_lines + [ - f"CentValue {tmp} = cent_list_new({cap});", - f"for (long {i_var} = {lo_var}.ival; {i_var} <= {hi_var}.ival; {i_var}++) {{", + if node.step is None: + cap = f"({hi_var}.ival >= {lo_var}.ival ? (int)({hi_var}.ival - {lo_var}.ival + 1) : 0)" + lines = lo_lines + hi_lines + [ + f"CentValue {tmp} = cent_list_new({cap});", + f"for (long {i_var} = {lo_var}.ival; {i_var} <= {hi_var}.ival; {i_var}++) {{", + f" cent_list_push(&{tmp}, cent_int({i_var}));", + "}", + ] + return lines, tmp + step_lines, step_var = emit_expr(node.step, ctx) + lines = lo_lines + hi_lines + step_lines + [ + f'if ({step_var}.type != CENT_INT) cent_type_error("Range step must be a number");', + f'if ({step_var}.ival == 0) cent_runtime_error("Range step cannot be zero");', + f"CentValue {tmp} = cent_list_new(0);", + f"for (long {i_var} = {lo_var}.ival; ({step_var}.ival > 0 ? {i_var} <= {hi_var}.ival : {i_var} >= {hi_var}.ival); {i_var} += {step_var}.ival) {{", f" cent_list_push(&{tmp}, cent_int({i_var}));", "}", ] diff --git a/centvrion/lexer.py b/centvrion/lexer.py index 1370f44..207847e 100644 --- a/centvrion/lexer.py +++ b/centvrion/lexer.py @@ -21,6 +21,7 @@ keyword_tokens = [("KEYWORD_"+i, i) for i in [ "FAC", "FALSITAS", "FVNCTIO", + "GRADV", "HAVD_MINVS", "HAVD_PLVS", "INVOCA", diff --git a/centvrion/parser.py b/centvrion/parser.py index 673ba4a..5110886 100644 --- a/centvrion/parser.py +++ b/centvrion/parser.py @@ -276,6 +276,11 @@ class Parser(): range_array = ast_nodes.DataRangeArray(tokens[3], tokens[5]) return ast_nodes.PerStatement(range_array, tokens[1], tokens[8]) + @self.pg.production('donicum_statement : KEYWORD_DONICVM id KEYWORD_VT expression KEYWORD_VSQVE expression KEYWORD_GRADV expression KEYWORD_FAC SYMBOL_LCURL statements SYMBOL_RCURL') + def donicum_step(tokens): + range_array = ast_nodes.DataRangeArray(tokens[3], tokens[5], tokens[7]) + return ast_nodes.PerStatement(range_array, tokens[1], tokens[10]) + # expressions @self.pg.production('expressions : SYMBOL_LPARENS expression_list') def expressions(tokens): @@ -394,6 +399,10 @@ class Parser(): def range_array(tokens): return ast_nodes.DataRangeArray(tokens[1], tokens[3]) + @self.pg.production('expression : SYMBOL_LBRACKET expression KEYWORD_VSQVE expression KEYWORD_GRADV expression SYMBOL_RBRACKET') + def range_array_step(tokens): + return ast_nodes.DataRangeArray(tokens[1], tokens[3], tokens[5]) + @self.pg.production('expression : expression SYMBOL_LBRACKET expression SYMBOL_RBRACKET', precedence='INDEX') def array_index(tokens): return ast_nodes.ArrayIndex(tokens[0], tokens[2]) diff --git a/language/main.tex b/language/main.tex index 21bdc2d..d2051ec 100644 --- a/language/main.tex +++ b/language/main.tex @@ -41,7 +41,7 @@ \languageline{statement}{\texttt{AETERNVM} \texttt{FAC} \textit{scope}} \\ \languageline{statement}{\texttt{PER} \textbf{id} \texttt{IN} \textit{expression} \texttt{FAC} \textit{scope}} \\ \languageline{statement}{\texttt{PER} \textbf{id}\texttt{,} \textbf{id-list} \texttt{IN} \textit{expression} \texttt{FAC} \textit{scope}} \\ - \languageline{statement}{\texttt{DONICVM} \textbf{id} \texttt{VT} \textit{expression} \texttt{VSQVE} \textit{expression} \texttt{FAC} \textit{scope}} \\ + \languageline{statement}{\texttt{DONICVM} \textbf{id} \texttt{VT} \textit{expression} \texttt{VSQVE} \textit{expression} \textit{optional-step} \texttt{FAC} \textit{scope}} \\ \languageline{statement}{\texttt{REDI(} \textit{optional-expressions} \texttt{)}} \\ \languageline{statement}{\texttt{ERVMPE}} \\ \languageline{statement}{\texttt{CONTINVA}} \\ @@ -73,7 +73,7 @@ \languageline{literal}{\textbf{numeral}} \\ \languageline{literal}{\textbf{bool}} \\ \languageline{literal}{\texttt{[} \textit{optional-expressions} \texttt{]}} \\ - \languageline{literal}{\texttt{[} \textit{expression} \texttt{VSQVE} \textit{expression} \texttt{]} \textnormal{\small\ (inclusive on both ends)}} \\ + \languageline{literal}{\texttt{[} \textit{expression} \texttt{VSQVE} \textit{expression} \textit{optional-step} \texttt{]} \textnormal{\small\ (inclusive on both ends)}} \\ \languageline{literal}{\texttt{TABVLA} \texttt{\{} \textit{optional-dict-items} \texttt{\}}} \\ \hline \languageline{optional-dict-items}{\textit{dict-items}} \\ @@ -94,6 +94,9 @@ \languageline{expressions}{\textit{expression}, \textit{expressions}} \\ \languageline{expressions}{\textit{expression}} \\ \hline + + \languageline{optional-step}{\texttt{GRADV} \textit{expression}} \\ + \languageline{optional-step}{} \\ \hline \end{tabular} \end{center} \end{table} diff --git a/snippets/donicvm_gradv.cent b/snippets/donicvm_gradv.cent new file mode 100644 index 0000000..4136b57 --- /dev/null +++ b/snippets/donicvm_gradv.cent @@ -0,0 +1,5 @@ +DESIGNA s VT NVLLVS +DONICVM i VT I VSQVE X GRADV II FAC { + s AVGE i +} +DIC(s) diff --git a/snippets/donicvm_gradv.png b/snippets/donicvm_gradv.png new file mode 100644 index 0000000000000000000000000000000000000000..983db8f2cf9ef836c2f175e3cb83193ffc661759 GIT binary patch literal 24734 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/I*A>D1z!AJw-QD7tFpi6;Qtdv(p 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,T6L4`?tf^jcdC+@J)UQU;F? zZ9P+w2y9Q&sGGkQU9EEf9L7Ne&O#dJ>p&-JLT*z@{Rp7x4#s} zLG^vNnt+GPobP_MZTI=lt@nQx16NGg&iP*RIUG5Eg2%}JuRQ$J5?E(XUvs<`c!EO_ zaEaAY;7DfR-%Ij;bnQRiu0JVWd&IgRDSdK1?``1tPSNqWNoM9b?ELnT8jAl+>)w_B z?~4Cm+gb}w=*ij$B|%@7v^w^si78ckjgJYDV?sN|CcE`j*Dep?KG%`x+TEcrj9 z^iOB+d$Sm+oe{3E9p1huE55ovI{Re) z|D(b?KF$)h`E~F*a1T4ErUY$v^0s-DhA4Rc^@2_=)" }, "HAVD_PLVS": { "prefix": "HAVD_PLVS", "body": "HAVD_PLVS", "description": "less-or-equal (<=)" }, "IN": { "prefix": "IN", "body": "IN", "description": "PER-loop iterator separator" }, diff --git a/vscode-extension/syntaxes/cent.tmLanguage.json b/vscode-extension/syntaxes/cent.tmLanguage.json index 0a4bdac..eeea8c8 100644 --- a/vscode-extension/syntaxes/cent.tmLanguage.json +++ b/vscode-extension/syntaxes/cent.tmLanguage.json @@ -45,7 +45,7 @@ "patterns": [ { "name": "keyword.control.cent", - "match": "\\b(AETERNVM|ALIVD|AVGE|AVT|CAPE|CONTINVA|CVM|DEFINI|DESIGNA|DIVIDE|DONICVM|DVM|ERVMPE|ET|FAC|FVNCTIO|IN|INVOCA|MINVE|MVLTIPLICA|NON|PER|REDI|SI|TABVLA|TEMPTA|TVNC|VSQVE|VT)\\b" + "match": "\\b(AETERNVM|ALIVD|AVGE|AVT|CAPE|CONTINVA|CVM|DEFINI|DESIGNA|DIVIDE|DONICVM|DVM|ERVMPE|ET|FAC|FVNCTIO|GRADV|IN|INVOCA|MINVE|MVLTIPLICA|NON|PER|REDI|SI|TABVLA|TEMPTA|TVNC|VSQVE|VT)\\b" }, { "name": "keyword.operator.comparison.cent",