🐐 NVLLVS and string concatenation

This commit is contained in:
2026-04-01 12:40:39 +02:00
parent 16e785e8fa
commit 83c9a56821
6 changed files with 57 additions and 9 deletions

View File

@@ -34,6 +34,7 @@ def rep_join(l):
OP_STR = {
"SYMBOL_PLUS": "+", "SYMBOL_MINUS": "-",
"SYMBOL_TIMES": "*", "SYMBOL_DIVIDE": "/",
"SYMBOL_COLON": ":",
"KEYWORD_EST": "EST", "KEYWORD_MINVS": "MINVS",
"KEYWORD_PLVS": "PLVS", "KEYWORD_ET": "ET", "KEYWORD_AVT": "AVT",
}
@@ -411,24 +412,32 @@ class BinOp(Node):
lv, rv = left.value(), right.value()
match self.op:
case "SYMBOL_PLUS":
return vtable, ValInt(lv + rv)
if isinstance(lv, str) or isinstance(rv, str):
raise TypeError("Use : for string concatenation, not +")
if lv is None and rv is None:
return vtable, ValNul()
return vtable, ValInt((lv or 0) + (rv or 0))
case "SYMBOL_COLON":
lv = lv if lv is not None else ""
rv = rv if rv is not None else ""
return vtable, ValStr(lv + rv)
case "SYMBOL_MINUS":
return vtable, ValInt(lv - rv)
return vtable, ValInt((lv or 0) - (rv or 0))
case "SYMBOL_TIMES":
return vtable, ValInt(lv * rv)
return vtable, ValInt((lv or 0) * (rv or 0))
case "SYMBOL_DIVIDE":
# TODO: Fractio
return vtable, ValInt(lv // rv)
return vtable, ValInt((lv or 0) // (rv or 0))
case "KEYWORD_MINVS":
return vtable, ValBool(lv < rv)
return vtable, ValBool((lv or 0) < (rv or 0))
case "KEYWORD_PLVS":
return vtable, ValBool(lv > rv)
return vtable, ValBool((lv or 0) > (rv or 0))
case "KEYWORD_EST":
return vtable, ValBool(lv == rv)
case "KEYWORD_ET":
return vtable, ValBool(bool(lv) and bool(rv))
return vtable, ValBool(bool(left) and bool(right))
case "KEYWORD_AVT":
return vtable, ValBool(bool(lv) or bool(rv))
return vtable, ValBool(bool(left) or bool(right))
case _:
raise Exception(self.op)

View File

@@ -61,6 +61,7 @@ symbol_tokens = [
("SYMBOL_MINUS", r"\-"),
("SYMBOL_TIMES", r"\*"),
("SYMBOL_DIVIDE", r"\/"),
("SYMBOL_COLON", r":"),
("SYMBOL_COMMA", r",")
]

View File

@@ -13,7 +13,7 @@ class Parser():
('left', ["KEYWORD_AVT"]),
('left', ["KEYWORD_ET"]),
('left', ["KEYWORD_PLVS", "KEYWORD_MINVS", "KEYWORD_EST"]),
('left', ["SYMBOL_PLUS", "SYMBOL_MINUS"]),
('left', ["SYMBOL_COLON", "SYMBOL_PLUS", "SYMBOL_MINUS"]),
('left', ["SYMBOL_TIMES", "SYMBOL_DIVIDE"]),
('right', ["UMINUS"]),
('left', ["INDEX"]),
@@ -174,6 +174,7 @@ class Parser():
def expression_nullus(_):
return ast_nodes.Nullus()
@self.pg.production('expression : expression SYMBOL_COLON expression')
@self.pg.production('expression : expression SYMBOL_MINUS expression')
@self.pg.production('expression : expression SYMBOL_PLUS expression')
@self.pg.production('expression : expression SYMBOL_TIMES expression')