diff --git a/centvrion/ast_nodes.py b/centvrion/ast_nodes.py index 2439fe0..7e497f7 100644 --- a/centvrion/ast_nodes.py +++ b/centvrion/ast_nodes.py @@ -418,9 +418,14 @@ class BinOp(Node): 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) + magnvm = "MAGNVM" in vtable["#modules"] + svbnvlla = "SVBNVLLA" in vtable["#modules"] + def _coerce(v): + if v is None: return "" + if isinstance(v, bool): return "VERITAS" if v else "FALSITAS" + if isinstance(v, int): return int_to_num(v, magnvm, svbnvlla) + return v + return vtable, ValStr(_coerce(lv) + _coerce(rv)) case "SYMBOL_MINUS": return vtable, ValInt((lv or 0) - (rv or 0)) case "SYMBOL_TIMES": diff --git a/tests.py b/tests.py index 6605d6c..f51ff7e 100644 --- a/tests.py +++ b/tests.py @@ -611,6 +611,9 @@ string_concat_tests = [ ('NVLLVS : "hello"', Program([], [ExpressionStatement(BinOp(Nullus(), String("hello"), "SYMBOL_COLON"))]), ValStr("hello")), ('"hello" : NVLLVS', Program([], [ExpressionStatement(BinOp(String("hello"), Nullus(), "SYMBOL_COLON"))]), ValStr("hello")), ('NVLLVS : NVLLVS', Program([], [ExpressionStatement(BinOp(Nullus(), Nullus(), "SYMBOL_COLON"))]), ValStr("")), + # integers coerce to Roman numerals in string context + ('"value: " : V', Program([], [ExpressionStatement(BinOp(String("value: "), Numeral("V"), "SYMBOL_COLON"))]), ValStr("value: V")), + ('X : " items"', Program([], [ExpressionStatement(BinOp(Numeral("X"), String(" items"), "SYMBOL_COLON"))]), ValStr("X items")), ] class TestStringConcat(unittest.TestCase):