diff --git a/luaparser/builder.py b/luaparser/builder.py index 9f78a4c..8cab936 100644 --- a/luaparser/builder.py +++ b/luaparser/builder.py @@ -659,4 +659,9 @@ def visitString(self, ctx: LuaParser.StringContext): elif p.match(lua_str): lua_str = p.search(lua_str).group(1) + # Eval string to unescape: + try: + lua_str = ast.literal_eval(F'"{lua_str}"') + except: + pass return String(lua_str, delimiter) diff --git a/luaparser/tests/test_integration.py b/luaparser/tests/test_integration.py index 52e6f17..3f0b238 100644 --- a/luaparser/tests/test_integration.py +++ b/luaparser/tests/test_integration.py @@ -321,7 +321,9 @@ def test_cont_int_10(self): exp = Chunk( Block([ If( - test=AndLoOp(left=GreaterThanOp(left=ULengthOP(Name("setting")), right=Number(10)), right=EqToOp(left=Name("setting_name"), right=String("user", StringDelimiter.DOUBLE_QUOTE))), + test=AndLoOp(left=GreaterThanOp(left=ULengthOP(Name("setting")), right=Number(10)), + right=EqToOp(left=Name("setting_name"), + right=String("user", StringDelimiter.DOUBLE_QUOTE))), body=Block([ Return([Number(100)]) ]), @@ -330,3 +332,15 @@ def test_cont_int_10(self): ]) ) self.assertEqual(exp, tree) + + # Strings are not being parsed #43 + def test_cont_int_12(self): + tree = ast.parse(textwrap.dedent(""" + a='\\0\\n\\ta' + """)) + exp = Chunk( + Block([ + Assign([Name("a")], [String("\x00\n\ta", StringDelimiter.SINGLE_QUOTE)]) + ]) + ) + self.assertEqual(exp, tree) diff --git a/luaparser/tests/test_types_values.py b/luaparser/tests/test_types_values.py index 076c2dc..e952132 100644 --- a/luaparser/tests/test_types_values.py +++ b/luaparser/tests/test_types_values.py @@ -81,7 +81,7 @@ def test_string_escape(self): targets=[Name("b")], values=[ String( - r"one line\nnext line\n\"in quotes\", 'in quotes'", + "one line\nnext line\n\"in quotes\", 'in quotes'", StringDelimiter.DOUBLE_QUOTE, ) ],