diff --git a/src/jasinta.py b/src/jasinta.py --- a/src/jasinta.py +++ b/src/jasinta.py @@ -61,6 +61,19 @@ class MemberExpression: return prop +class AssignmentExpression: + def __init__(self, node): + self.node = node + + def eval(self, context): + left = evaluate(self.node["left"], context) + right = evaluate(self.node["right"], context) + if self.node["operator"] == "+=": + left.val += right.val + else: + raise NotImplementedError + + class BinaryExpression: def __init__(self, node): self.node = node @@ -124,8 +137,8 @@ class Literal: node_index = {cls.__name__: cls for cls in [ - Program, ExpressionStatement, CallExpression, MemberExpression, EmptyStatement, BinaryExpression, - VariableDeclaration, VariableDeclarator, Literal + Program, ExpressionStatement, CallExpression, MemberExpression, EmptyStatement, AssignmentExpression, + BinaryExpression, VariableDeclaration, VariableDeclarator, Literal ]} diff --git a/tests/test_jasinta.py b/tests/test_jasinta.py --- a/tests/test_jasinta.py +++ b/tests/test_jasinta.py @@ -16,3 +16,16 @@ document.write(c);""" interpret(parse(s)) mock_print.assert_called_with(4) + + +class TestAssignment(TestCase): + @patch("builtins.print") + def test_interpret(self, mock_print): + s = """var a=1; +var b=1; +a+=b; +b+=a; +document.write(b);""" + + interpret(parse(s)) + mock_print.assert_called_with(3)