From ea72c918706248c9e13adb8f855a4cf30db07285 Mon Sep 17 00:00:00 2001 From: NikolajDanger Date: Fri, 24 Apr 2026 16:26:17 +0200 Subject: [PATCH] :goat: More compound operators --- README.md | 4 +-- centvrion/lexer.py | 2 ++ centvrion/parser.py | 8 ++++++ language/main.tex | 2 ++ snippets/compound.cent | 3 +++ snippets/compound.png | Bin 10170 -> 19915 bytes snippets/syntaxes/centvrion.sublime-syntax | 2 +- tests.py | 24 ++++++++++++++++++ vscode-extension/snippets/cent.json | 2 ++ .../syntaxes/cent.tmLanguage.json | 2 +- 10 files changed, 45 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2faf99d..984097e 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Variable can consist of lower-case letters, numbers, as well as `_`. ### Compound assignment -`AVGE` (+=) and `MINVE` (-=) are shorthand for incrementing or decrementing a variable: +`AVGE` (+=), `MINVE` (-=), `MVLTIPLICA` (*=) and `DIVIDE` (/=) are shorthand for updating a variable with an arithmetic operation: ![Compound assignment](snippets/compound.png) @@ -32,7 +32,7 @@ Variable can consist of lower-case letters, numbers, as well as `_`. > VIII ``` -`x AVGE III` is equivalent to `DESIGNA x VT x + III`. +`x AVGE III` is equivalent to `DESIGNA x VT x + III`; `MINVE`, `MVLTIPLICA` and `DIVIDE` expand the same way with subtraction, multiplication and division. ### Destructuring diff --git a/centvrion/lexer.py b/centvrion/lexer.py index 61f2a52..9951af8 100644 --- a/centvrion/lexer.py +++ b/centvrion/lexer.py @@ -11,6 +11,7 @@ keyword_tokens = [("KEYWORD_"+i, i) for i in [ "DEFINI", "DESIGNA", "DISPAR", + "DIVIDE", "DONICVM", "DVM", "CONTINVA", @@ -26,6 +27,7 @@ keyword_tokens = [("KEYWORD_"+i, i) for i in [ "IN", "MINVE", "MINVS", + "MVLTIPLICA", "NON", "NVLLVS", "PER", diff --git a/centvrion/parser.py b/centvrion/parser.py index 9f741f4..673ba4a 100644 --- a/centvrion/parser.py +++ b/centvrion/parser.py @@ -198,6 +198,14 @@ class Parser(): def statement_minve(tokens): return ast_nodes.Designa(tokens[0], ast_nodes.BinOp(tokens[0], tokens[2], "SYMBOL_MINUS")) + @self.pg.production('statement : id KEYWORD_MVLTIPLICA expression') + def statement_mvltiplica(tokens): + return ast_nodes.Designa(tokens[0], ast_nodes.BinOp(tokens[0], tokens[2], "SYMBOL_TIMES")) + + @self.pg.production('statement : id KEYWORD_DIVIDE expression') + def statement_divide(tokens): + return ast_nodes.Designa(tokens[0], ast_nodes.BinOp(tokens[0], tokens[2], "SYMBOL_DIVIDE")) + @self.pg.production('statement : expression') def statement_expression(tokens): return ast_nodes.ExpressionStatement(tokens[0]) diff --git a/language/main.tex b/language/main.tex index b3d2e3d..21bdc2d 100644 --- a/language/main.tex +++ b/language/main.tex @@ -33,6 +33,8 @@ \languageline{statement}{\texttt{DESIGNA} \textbf{id} \texttt{,} \textit{ids} \texttt{VT} \textit{expression}} \\ \languageline{statement}{\textbf{id} \texttt{AVGE} \textit{expression}} \\ \languageline{statement}{\textbf{id} \texttt{MINVE} \textit{expression}} \\ + \languageline{statement}{\textbf{id} \texttt{MVLTIPLICA} \textit{expression}} \\ + \languageline{statement}{\textbf{id} \texttt{DIVIDE} \textit{expression}} \\ \languageline{statement}{\texttt{DEFINI} \textbf{id} \texttt{(} \textit{optional-ids} \texttt{)} \texttt{VT} \textit{scope}} \\ \languageline{statement}{\textit{if-statement}} \\ \languageline{statement}{\texttt{DVM} \textit{expression} \texttt{FAC} \textit{scope}} \\ diff --git a/snippets/compound.cent b/snippets/compound.cent index dabc868..09c2269 100644 --- a/snippets/compound.cent +++ b/snippets/compound.cent @@ -1,3 +1,6 @@ DESIGNA x VT V x AVGE III +x MINVE II +x MVLTIPLICA IV +x DIVIDE III DIC(x) diff --git a/snippets/compound.png b/snippets/compound.png index 1c29430bacc739cc68e1883e1018629f045ef917..09ec908fcc6445b77db74c77e675818a42a6428a 100644 GIT binary patch literal 19915 zcmdsfd011|+V4hG9I7dzQi~9)MXFZga1@b1YSmIpm0Go&IwTHNst93Fk}zZ|iioIj zMg@{qtJG3SsUjeO4FUo(ITQmjBqWf?lo80h_gyR6bIy0h-h0nK_dZWsEJBjK*IMuU zo8F!B#rl8=Xn<=4g;l*-@X6! z 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 diff --git a/snippets/syntaxes/centvrion.sublime-syntax b/snippets/syntaxes/centvrion.sublime-syntax index 9e71361..9c7c496 100644 --- a/snippets/syntaxes/centvrion.sublime-syntax +++ b/snippets/syntaxes/centvrion.sublime-syntax @@ -78,7 +78,7 @@ contexts: scope: support.class.module.centvrion keywords: - - match: '\b(HAVD_PLVS|HAVD_MINVS|AETERNVM|ALIVD|AVGE|AVT|CAPE|CONTINVA|DEFINI|DESIGNA|DISPAR|DONICVM|DVM|ERVMPE|EST|ET|FAC|FVNCTIO|INVOCA|IN|MINVE|MINVS|NON|PER|PLVS|REDI|RELIQVVM|SI|TABVLA|TEMPTA|TVNC|VSQVE|VT|CVM)\b' + - match: '\b(HAVD_PLVS|HAVD_MINVS|AETERNVM|ALIVD|AVGE|AVT|CAPE|CONTINVA|DEFINI|DESIGNA|DISPAR|DIVIDE|DONICVM|DVM|ERVMPE|EST|ET|FAC|FVNCTIO|INVOCA|IN|MINVE|MINVS|MVLTIPLICA|NON|PER|PLVS|REDI|RELIQVVM|SI|TABVLA|TEMPTA|TVNC|VSQVE|VT|CVM)\b' scope: keyword.control.centvrion operators: diff --git a/tests.py b/tests.py index 020ad4b..d155a2e 100644 --- a/tests.py +++ b/tests.py @@ -293,6 +293,30 @@ assignment_tests = [ [Designa(ID("s"), BinOp(ID("s"), ID("i"), "SYMBOL_PLUS"))]), ExpressionStatement(ID("s"))]), ValInt(6)), + # Compound assignment — MVLTIPLICA (*=) + ("DESIGNA x VT III\nx MVLTIPLICA II\nx", + Program([], [Designa(ID("x"), Numeral("III")), + Designa(ID("x"), BinOp(ID("x"), Numeral("II"), "SYMBOL_TIMES")), + ExpressionStatement(ID("x"))]), + ValInt(6)), + # Compound assignment — DIVIDE (/=) + ("DESIGNA x VT XII\nx DIVIDE III\nx", + Program([], [Designa(ID("x"), Numeral("XII")), + Designa(ID("x"), BinOp(ID("x"), Numeral("III"), "SYMBOL_DIVIDE")), + ExpressionStatement(ID("x"))]), + ValInt(4)), + # MVLTIPLICA with complex RHS — whole expression is captured before the op + ("DESIGNA x VT II\nx MVLTIPLICA II + I\nx", + Program([], [Designa(ID("x"), Numeral("II")), + Designa(ID("x"), BinOp(ID("x"), BinOp(Numeral("II"), Numeral("I"), "SYMBOL_PLUS"), "SYMBOL_TIMES")), + ExpressionStatement(ID("x"))]), + ValInt(6)), + # DIVIDE with complex RHS + ("DESIGNA x VT XX\nx DIVIDE II + II\nx", + Program([], [Designa(ID("x"), Numeral("XX")), + Designa(ID("x"), BinOp(ID("x"), BinOp(Numeral("II"), Numeral("II"), "SYMBOL_PLUS"), "SYMBOL_DIVIDE")), + ExpressionStatement(ID("x"))]), + ValInt(5)), ] class TestAssignment(unittest.TestCase): diff --git a/vscode-extension/snippets/cent.json b/vscode-extension/snippets/cent.json index 603f458..95ba2d0 100644 --- a/vscode-extension/snippets/cent.json +++ b/vscode-extension/snippets/cent.json @@ -34,6 +34,7 @@ "CVM": { "prefix": "CVM", "body": "CVM", "description": "include module" }, "DESIGNA": { "prefix": "DESIGNA", "body": "DESIGNA", "description": "declare and assign a variable" }, "DISPAR": { "prefix": "DISPAR", "body": "DISPAR", "description": "not-equal comparison (!=)" }, + "DIVIDE": { "prefix": "DIVIDE", "body": "DIVIDE", "description": "compound division assignment (/=)" }, "ERVMPE": { "prefix": "ERVMPE", "body": "ERVMPE", "description": "break out of loop" }, "EST": { "prefix": "EST", "body": "EST", "description": "equality comparison (==)" }, "ET": { "prefix": "ET", "body": "ET", "description": "logical and" }, @@ -46,6 +47,7 @@ "INVOCA": { "prefix": "INVOCA", "body": "INVOCA", "description": "invoke / call a function" }, "MINVE": { "prefix": "MINVE", "body": "MINVE", "description": "compound subtraction assignment (-=)" }, "MINVS": { "prefix": "MINVS", "body": "MINVS", "description": "less-than comparison (<)" }, + "MVLTIPLICA": { "prefix": "MVLTIPLICA", "body": "MVLTIPLICA", "description": "compound multiplication assignment (*=)" }, "NON": { "prefix": "NON", "body": "NON", "description": "logical not" }, "NVLLVS": { "prefix": "NVLLVS", "body": "NVLLVS", "description": "null value" }, "PLVS": { "prefix": "PLVS", "body": "PLVS", "description": "greater-than comparison (>)" }, diff --git a/vscode-extension/syntaxes/cent.tmLanguage.json b/vscode-extension/syntaxes/cent.tmLanguage.json index 96d8953..ee3bcd0 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|DONICVM|DVM|ERVMPE|ET|FAC|FVNCTIO|IN|INVOCA|MINVE|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|IN|INVOCA|MINVE|MVLTIPLICA|NON|PER|REDI|SI|TABVLA|TEMPTA|TVNC|VSQVE|VT)\\b" }, { "name": "keyword.operator.comparison.cent",