From b78f1697d1b2fcde47b93661161264b446dc0707 Mon Sep 17 00:00:00 2001 From: Eliott Dumeix Date: Sat, 11 Feb 2023 18:26:19 +0100 Subject: [PATCH] fix nested unary exprs, fix #27 --- luaparser/astnodes.py | 12 +++++++---- luaparser/builder.py | 5 +++-- luaparser/tests/test_expressions.py | 33 +++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/luaparser/astnodes.py b/luaparser/astnodes.py index 6f1f3f6..cd970f8 100644 --- a/luaparser/astnodes.py +++ b/luaparser/astnodes.py @@ -137,14 +137,14 @@ def __init__(self, s: str, is_multi_line: bool = False, **kwargs): self.is_multi_line: bool = is_multi_line -class Statement(Node): - """Base class for Lua statement.""" - - class Expression(Node): """Define a Lua expression.""" +class Statement(Expression): + """Base class for Lua statement.""" + + class Block(Node): """Define a Lua Block.""" @@ -164,6 +164,10 @@ def __init__(self, body: Block, **kwargs): super(Chunk, self).__init__("Chunk", **kwargs) self.body = body + def __repr__(self): + from luaparser.ast import to_pretty_str + return to_pretty_str(self) + """ Left Hand Side expression. diff --git a/luaparser/builder.py b/luaparser/builder.py index 6441d7d..f1410a4 100644 --- a/luaparser/builder.py +++ b/luaparser/builder.py @@ -1338,7 +1338,7 @@ def parse_unary_expr(self) -> Expression or bool: self.failure_save() if self.next_is_rc(Tokens.LENGTH): t: Token = self._LT - expr = self.parse_pow_expr() + expr = self.parse_expr() if expr: self.success() return ULengthOP(expr, first_token=t, last_token=t) @@ -1374,7 +1374,7 @@ def parse_pow_expr(self) -> Expression or bool: while True: self.save() if self.next_is_rc(Tokens.POW): - right = self.parse_atom() + right = self.parse_expr() if right: self.success() left = ExpoOp(left, right) @@ -1402,6 +1402,7 @@ def parse_atom(self) -> Expression or bool: if self.next_is(Tokens.VARARGS) and self.next_is_rc(Tokens.VARARGS): return Varargs() + if self.next_is(Tokens.NUMBER) and self.next_is_rc(Tokens.NUMBER): # TODO: optimize # using python number eval to parse lua number diff --git a/luaparser/tests/test_expressions.py b/luaparser/tests/test_expressions.py index 0bfe6cb..d883833 100644 --- a/luaparser/tests/test_expressions.py +++ b/luaparser/tests/test_expressions.py @@ -8,6 +8,8 @@ class ExpressionsTestCase(tests.TestCase): + maxDiff = None + """ 3.4.1 – Arithmetic Operators """ @@ -117,6 +119,34 @@ def test_exponentiation(self): ) self.assertEqual(exp, tree) + def test_exponentiation_minus(self): + tree = ast.parse(r"a = 1^-2") + exp = Chunk( + Block( + [ + Assign( + targets=[Name("a")], + values=[ExpoOp(left=Number(1), right=UMinusOp(Number(2)))], + ) + ] + ) + ) + self.assertEqual(exp, tree) + + def test_exponentiation_3(self): + tree = ast.parse(r"a = 10^-foo()") + exp = Chunk( + Block( + [ + Assign( + targets=[Name("a")], + values=[ExpoOp(left=Number(10), right=UMinusOp(Call(Name("foo"), [])))], + ) + ] + ) + ) + self.assertEqual(exp, tree) + """ 3.4.2 – Bitwise Operators """ @@ -361,6 +391,9 @@ def test_length_op(self): ) self.assertEqual(exp, tree) + def test_length_op_2(self): + ast.parse(r"""len = #{"a","b","c"}""") + """ ----------------------------------------------------------------------- """ """ 3.4.9 – Table Constructors """ """ ----------------------------------------------------------------------- """