🐐 NVLLVS and string concatenation
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@ symbol_tokens = [
|
||||
("SYMBOL_MINUS", r"\-"),
|
||||
("SYMBOL_TIMES", r"\*"),
|
||||
("SYMBOL_DIVIDE", r"\/"),
|
||||
("SYMBOL_COLON", r":"),
|
||||
("SYMBOL_COMMA", r",")
|
||||
]
|
||||
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user