From 70a5e310147fa5ee894ce65dae8270f0ff07bb06 Mon Sep 17 00:00:00 2001 From: sulyi Date: Thu, 8 Dec 2016 08:29:12 +0100 Subject: [PATCH] [jsinterp] Parentheses fix (test and parser) --- test/test_jsinterp_parser.py | 84 ++++++++++++++++++++++++--------- youtube_dl/jsinterp/jsinterp.py | 2 +- 2 files changed, 62 insertions(+), 24 deletions(-) diff --git a/test/test_jsinterp_parser.py b/test/test_jsinterp_parser.py index d4b70126c..649bc34df 100644 --- a/test/test_jsinterp_parser.py +++ b/test/test_jsinterp_parser.py @@ -209,33 +209,71 @@ class TestJSInterpreterParser(unittest.TestCase): ] self.assertEqual(list(jsi.statements()), ast) - @unittest.skip('Expression parsed as call argument!') def test_parens(self): - jsi = JSInterpreter('return (1) + (2) * ((( (( (((((3)))))) )) ));') - ast = [(Token.RETURN, (Token.EXPR, [ - (Token.ASSIGN, None, - (Token.OPEXPR, [ - (Token.EXPR, [ - (Token.ASSIGN, None, (Token.OPEXPR, [(Token.MEMBER, (Token.INT, 1), None, None)]), None) - ]), - (Token.EXPR, [ - (Token.ASSIGN, None, (Token.OPEXPR, [(Token.MEMBER, (Token.INT, 2), None, None)]), None) - ]), - (Token.EXPR, [(Token.EXPR, [(Token.EXPR, [ - (Token.EXPR, [(Token.EXPR, [ - (Token.EXPR, [(Token.EXPR, [(Token.EXPR, [(Token.EXPR, [(Token.EXPR, [ - (Token.ASSIGN, None, (Token.OPEXPR, [(Token.MEMBER, (Token.INT, 3), None, None)]), None) - ])])])])]) - ])]) - ])])]) - ]), None) - ])) - + jsi = JSInterpreter('return (1 + 2) * 3;') + ast = [ + (Token.RETURN, (Token.EXPR, [ + (Token.ASSIGN, None, + (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [ + (Token.ASSIGN, None, + (Token.OPEXPR, [ + (Token.MEMBER, (Token.INT, 1), None, None), + (Token.MEMBER, (Token.INT, 2), None, None), + (Token.OP, _OPERATORS['+'][1]) + ]), None) + ]), None, None), + (Token.MEMBER, (Token.INT, 3), None, None), + (Token.OP, _OPERATORS['*'][1]) + ]), None) + ])) ] self.assertEqual(list(jsi.statements()), ast) - jsi = JSInterpreter('return (1 + 2) * 3;') - ast = [] + jsi = JSInterpreter('return (1) + (2) * ((( (( (((((3)))))) )) ));') + ast = [ + (Token.RETURN, (Token.EXPR, [ + (Token.ASSIGN, None, + (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.INT, 1), None, None) + ]), None),]), None, None), + + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.INT, 2), None, None) + ]), None)]), None, None), + + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.INT, 3), None, None) + ]), None)]), None, None) + ]), None)]), None, None) + ]), None)]), None, None) + ]), None)]), None, None) + ]), None)]), None, None) + + ]), None)]), None, None) + ]), None)]), None, None) + + ]), None)]), None, None) + ]), None)]), None, None) + ]), None)]), None, None), + + (Token.OP, _OPERATORS['*'][1]), + (Token.OP, _OPERATORS['+'][1]) + ]), None) + ])) + ] self.assertEqual(list(jsi.statements()), ast) @unittest.skip('Incomplete test case') diff --git a/youtube_dl/jsinterp/jsinterp.py b/youtube_dl/jsinterp/jsinterp.py index 05784d99d..e84573211 100644 --- a/youtube_dl/jsinterp/jsinterp.py +++ b/youtube_dl/jsinterp/jsinterp.py @@ -257,7 +257,7 @@ class JSInterpreter(object): if peek_id is not Token.PCLOSE: raise ExtractorError('Unbalanced parentheses at %d' % open_pos) token_stream.pop() - return (Token.EXPR, expr) + return expr # empty (probably) else: return None