From 927e70d4a44c752b312b917177f751536bd9c09b Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Thu, 4 Jun 2015 20:58:18 +0100 Subject: [PATCH] parser: fix reporting of errors and parsing of decimals with leading zeros --- notes.txt | 2 - parser/grammar.y | 12 +- parser/grammar_data_test.go | 574 ++++++++++++++++++------------------ parser/grammar_test.go | 32 +- parser/lexer.go | 35 ++- parser/lexer_test.go | 27 +- parser/make_grammar_test.py | 32 +- parser/y.go | 12 +- 8 files changed, 408 insertions(+), 318 deletions(-) diff --git a/notes.txt b/notes.txt index 8c2c7e0c..9ba019ea 100644 --- a/notes.txt +++ b/notes.txt @@ -9,8 +9,6 @@ Limitations * string keys only in dictionaries * ints only 64 bit -FIXME parsing 00007 works fine whereas it should be throwing an error - FIXME interesting crash with compiling `int("42"), sausage=11)` Compile error: SystemError: [interface conversion: *ast.Call is not ast.SetCtxer: missing method SetCtx] diff --git a/parser/grammar.y b/parser/grammar.y index a2c6701f..07a5b682 100644 --- a/parser/grammar.y +++ b/parser/grammar.y @@ -1335,7 +1335,7 @@ comp_op: | LTGT { // panic("FIXME no coverage") - yylex.Error("Invalid syntax") + yylex.(*yyLex).SyntaxError("Invalid syntax") } | PLINGEQ { @@ -1495,14 +1495,14 @@ strings: case py.String: $$ = a + b default: - yylex.Error("SyntaxError: cannot mix string and nonstring literals") + yylex.(*yyLex).SyntaxError("cannot mix string and nonstring literals") } case py.Bytes: switch b := $2.(type) { case py.Bytes: $$ = append(a, b...) default: - yylex.Error("SyntaxError: cannot mix bytes and nonbytes literals") + yylex.(*yyLex).SyntaxError("cannot mix bytes and nonbytes literals") } } } @@ -1823,7 +1823,7 @@ arglist: call := $1 call.Starargs = $3 if len($4.Args) != 0 { - yylex.Error("SyntaxError: only named arguments may follow *expression") + yylex.(*yyLex).SyntaxError("only named arguments may follow *expression") } call.Keywords = append(call.Keywords, $4.Keywords...) $$ = call @@ -1834,7 +1834,7 @@ arglist: call.Starargs = $3 call.Kwargs = $7 if len($4.Args) != 0 { - yylex.Error("SyntaxError: only named arguments may follow *expression") + yylex.(*yyLex).SyntaxError("only named arguments may follow *expression") } call.Keywords = append(call.Keywords, $4.Keywords...) $$ = call @@ -1868,7 +1868,7 @@ argument: if name, ok := test.(*ast.Name); ok { $$.Keywords = []*ast.Keyword{&ast.Keyword{Pos: name.Pos, Arg: name.Id, Value: $3}} } else { - yylex.Error("SyntaxError: keyword can't be an expression") + yylex.(*yyLex).SyntaxError("keyword can't be an expression") } } diff --git a/parser/grammar_data_test.go b/parser/grammar_data_test.go index 075bb5da..0be92885 100644 --- a/parser/grammar_data_test.go +++ b/parser/grammar_data_test.go @@ -2,288 +2,298 @@ package parser +import ( + "github.com/ncw/gpython/py" +) + var grammarTestData = []struct { - in string - mode string - out string + in string + mode string + out string + exceptionType *py.Type + errString string }{ - {"", "exec", "Module(body=[])"}, - {"\n", "exec", "Module(body=[])"}, - {"()", "eval", "Expression(body=Tuple(elts=[], ctx=Load()))"}, - {"()", "exec", "Module(body=[Expr(value=Tuple(elts=[], ctx=Load()))])"}, - {"[ ]", "exec", "Module(body=[Expr(value=List(elts=[], ctx=Load()))])"}, - {"True\n", "eval", "Expression(body=NameConstant(value=True))"}, - {"False\n", "eval", "Expression(body=NameConstant(value=False))"}, - {"None\n", "eval", "Expression(body=NameConstant(value=None))"}, - {"...", "eval", "Expression(body=Ellipsis())"}, - {"abc123", "eval", "Expression(body=Name(id='abc123', ctx=Load()))"}, - {"\"abc\"", "eval", "Expression(body=Str(s='abc'))"}, - {"\"abc\" \"\"\"123\"\"\"", "eval", "Expression(body=Str(s='abc123'))"}, - {"b'abc'", "eval", "Expression(body=Bytes(s=b'abc'))"}, - {"b'abc' b'''123'''", "eval", "Expression(body=Bytes(s=b'abc123'))"}, - {"1234", "eval", "Expression(body=Num(n=1234))"}, - {"0x1234", "eval", "Expression(body=Num(n=4660))"}, - {"12.34", "eval", "Expression(body=Num(n=12.34))"}, - {"1,", "eval", "Expression(body=Tuple(elts=[Num(n=1)], ctx=Load()))"}, - {"1,2", "eval", "Expression(body=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))"}, - {"1,2,", "eval", "Expression(body=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))"}, - {"{ }", "eval", "Expression(body=Dict(keys=[], values=[]))"}, - {"{1}", "eval", "Expression(body=Set(elts=[Num(n=1)]))"}, - {"{1,}", "eval", "Expression(body=Set(elts=[Num(n=1)]))"}, - {"{1,2}", "eval", "Expression(body=Set(elts=[Num(n=1), Num(n=2)]))"}, - {"{1,2,3,}", "eval", "Expression(body=Set(elts=[Num(n=1), Num(n=2), Num(n=3)]))"}, - {"{ 'a':1 }", "eval", "Expression(body=Dict(keys=[Str(s='a')], values=[Num(n=1)]))"}, - {"{ 'a':1, 'b':2 }", "eval", "Expression(body=Dict(keys=[Str(s='a'), Str(s='b')], values=[Num(n=1), Num(n=2)]))"}, - {"{ 'a':{'aa':11, 'bb':{'aa':11, 'bb':22}}, 'b':{'aa':11, 'bb':22} }", "eval", "Expression(body=Dict(keys=[Str(s='a'), Str(s='b')], values=[Dict(keys=[Str(s='aa'), Str(s='bb')], values=[Num(n=11), Dict(keys=[Str(s='aa'), Str(s='bb')], values=[Num(n=11), Num(n=22)])]), Dict(keys=[Str(s='aa'), Str(s='bb')], values=[Num(n=11), Num(n=22)])]))"}, - {"(1)", "eval", "Expression(body=Num(n=1))"}, - {"(1,)", "eval", "Expression(body=Tuple(elts=[Num(n=1)], ctx=Load()))"}, - {"(1,2)", "eval", "Expression(body=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))"}, - {"(1,2,)", "eval", "Expression(body=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))"}, - {"{(1,2)}", "eval", "Expression(body=Set(elts=[Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load())]))"}, - {"(((((1,),(2,),),(2,),),((1,),(2,),),),((1,),(2,),))", "eval", "Expression(body=Tuple(elts=[Tuple(elts=[Tuple(elts=[Tuple(elts=[Tuple(elts=[Num(n=1)], ctx=Load()), Tuple(elts=[Num(n=2)], ctx=Load())], ctx=Load()), Tuple(elts=[Num(n=2)], ctx=Load())], ctx=Load()), Tuple(elts=[Tuple(elts=[Num(n=1)], ctx=Load()), Tuple(elts=[Num(n=2)], ctx=Load())], ctx=Load())], ctx=Load()), Tuple(elts=[Tuple(elts=[Num(n=1)], ctx=Load()), Tuple(elts=[Num(n=2)], ctx=Load())], ctx=Load())], ctx=Load()))"}, - {"(((1)))", "eval", "Expression(body=Num(n=1))"}, - {"[1]", "eval", "Expression(body=List(elts=[Num(n=1)], ctx=Load()))"}, - {"[1,]", "eval", "Expression(body=List(elts=[Num(n=1)], ctx=Load()))"}, - {"[1,2]", "eval", "Expression(body=List(elts=[Num(n=1), Num(n=2)], ctx=Load()))"}, - {"[1,2,]", "eval", "Expression(body=List(elts=[Num(n=1), Num(n=2)], ctx=Load()))"}, - {"( a for a in ab )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"( a for a, in ab )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"( a for a, b in ab )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"( a for a in ab if a )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load())])]))"}, - {"( a for a in ab if a if b if c )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))"}, - {"( a for a in ab for A in AB )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[])]))"}, - {"( a for a in ab if a if b for A in AB if c )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[Name(id='c', ctx=Load())])]))"}, - {"( a for a in ab if lambda: None )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=NameConstant(value=None))])]))"}, - {"( a for a in ab if lambda x,y: x+y )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Lambda(args=arguments(args=[arg(arg='x', annotation=None), arg(arg='y', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=BinOp(left=Name(id='x', ctx=Load()), op=Add(), right=Name(id='y', ctx=Load())))])]))"}, - {"[ a for a in ab ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"[ a for a, in ab ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"[ a for a, b in ab ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"[ a for a in ab if a ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load())])]))"}, - {"[ a for a in ab if a if b if c ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))"}, - {"[ a for a in ab for A in AB ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[])]))"}, - {"[ a for a in ab if a if b for A in AB if c ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[Name(id='c', ctx=Load())])]))"}, - {"{ a for a in ab }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"{ a for a, in ab }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"{ a for a, b in ab }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"{ a for a in ab if a }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load())])]))"}, - {"{ a for a in ab if a if b if c }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))"}, - {"{ a for a in ab for A in AB }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[])]))"}, - {"{ a for a in ab if a if b for A in AB if c }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[Name(id='c', ctx=Load())])]))"}, - {"{ a:b for a in ab }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"{ a:b for a, in ab }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"{ a:b for a, b in ab }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))"}, - {"{ a:b for a in ab if a }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load())])]))"}, - {"{ a:b for a in ab if a if b if c }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))"}, - {"{ a:b for a in ab for A in AB }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[])]))"}, - {"{ a:b for a in ab if a if b for A in AB if c }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[Name(id='c', ctx=Load())])]))"}, - {"a|b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=BitOr(), right=Name(id='b', ctx=Load())))"}, - {"a^b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=BitXor(), right=Name(id='b', ctx=Load())))"}, - {"a&b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=BitAnd(), right=Name(id='b', ctx=Load())))"}, - {"a<>b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=RShift(), right=Name(id='b', ctx=Load())))"}, - {"a+b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())))"}, - {"a-b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Sub(), right=Name(id='b', ctx=Load())))"}, - {"a*b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Mult(), right=Name(id='b', ctx=Load())))"}, - {"a/b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Div(), right=Name(id='b', ctx=Load())))"}, - {"a//b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=FloorDiv(), right=Name(id='b', ctx=Load())))"}, - {"a**b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Pow(), right=Name(id='b', ctx=Load())))"}, - {"not a", "eval", "Expression(body=UnaryOp(op=Not(), operand=Name(id='a', ctx=Load())))"}, - {"+a", "eval", "Expression(body=UnaryOp(op=UAdd(), operand=Name(id='a', ctx=Load())))"}, - {"-a", "eval", "Expression(body=UnaryOp(op=USub(), operand=Name(id='a', ctx=Load())))"}, - {"~a", "eval", "Expression(body=UnaryOp(op=Invert(), operand=Name(id='a', ctx=Load())))"}, - {"a and b", "eval", "Expression(body=BoolOp(op=And(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]))"}, - {"a or b", "eval", "Expression(body=BoolOp(op=Or(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]))"}, - {"a or b or c", "eval", "Expression(body=BoolOp(op=Or(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())]))"}, - {"(a or b) or c", "eval", "Expression(body=BoolOp(op=Or(), values=[BoolOp(op=Or(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), Name(id='c', ctx=Load())]))"}, - {"a or (b or c)", "eval", "Expression(body=BoolOp(op=Or(), values=[Name(id='a', ctx=Load()), BoolOp(op=Or(), values=[Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))"}, - {"a and b and c", "eval", "Expression(body=BoolOp(op=And(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())]))"}, - {"(a and b) and c", "eval", "Expression(body=BoolOp(op=And(), values=[BoolOp(op=And(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), Name(id='c', ctx=Load())]))"}, - {"a and (b and c)", "eval", "Expression(body=BoolOp(op=And(), values=[Name(id='a', ctx=Load()), BoolOp(op=And(), values=[Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))"}, - {"a+b-c/d", "eval", "Expression(body=BinOp(left=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())), op=Sub(), right=BinOp(left=Name(id='c', ctx=Load()), op=Div(), right=Name(id='d', ctx=Load()))))"}, - {"a+b-c/d//e", "eval", "Expression(body=BinOp(left=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())), op=Sub(), right=BinOp(left=BinOp(left=Name(id='c', ctx=Load()), op=Div(), right=Name(id='d', ctx=Load())), op=FloorDiv(), right=Name(id='e', ctx=Load()))))"}, - {"a+b-c/d//e%f", "eval", "Expression(body=BinOp(left=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())), op=Sub(), right=BinOp(left=BinOp(left=BinOp(left=Name(id='c', ctx=Load()), op=Div(), right=Name(id='d', ctx=Load())), op=FloorDiv(), right=Name(id='e', ctx=Load())), op=Mod(), right=Name(id='f', ctx=Load()))))"}, - {"a+b-c/d//e%f**g", "eval", "Expression(body=BinOp(left=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())), op=Sub(), right=BinOp(left=BinOp(left=BinOp(left=Name(id='c', ctx=Load()), op=Div(), right=Name(id='d', ctx=Load())), op=FloorDiv(), right=Name(id='e', ctx=Load())), op=Mod(), right=BinOp(left=Name(id='f', ctx=Load()), op=Pow(), right=Name(id='g', ctx=Load())))))"}, - {"a+b-c/d//e%f**g|h&i^k<>m", "eval", "Expression(body=BinOp(left=BinOp(left=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())), op=Sub(), right=BinOp(left=BinOp(left=BinOp(left=Name(id='c', ctx=Load()), op=Div(), right=Name(id='d', ctx=Load())), op=FloorDiv(), right=Name(id='e', ctx=Load())), op=Mod(), right=BinOp(left=Name(id='f', ctx=Load()), op=Pow(), right=Name(id='g', ctx=Load())))), op=BitOr(), right=BinOp(left=BinOp(left=Name(id='h', ctx=Load()), op=BitAnd(), right=Name(id='i', ctx=Load())), op=BitXor(), right=BinOp(left=BinOp(left=Name(id='k', ctx=Load()), op=LShift(), right=Name(id='l', ctx=Load())), op=RShift(), right=Name(id='m', ctx=Load())))))"}, - {"a if b else c", "eval", "Expression(body=IfExp(test=Name(id='b', ctx=Load()), body=Name(id='a', ctx=Load()), orelse=Name(id='c', ctx=Load())))"}, - {"a==b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[Eq()], comparators=[Name(id='b', ctx=Load())]))"}, - {"a!=b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[NotEq()], comparators=[Name(id='b', ctx=Load())]))"}, - {"ab", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[Gt()], comparators=[Name(id='b', ctx=Load())]))"}, - {"a>=b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[GtE()], comparators=[Name(id='b', ctx=Load())]))"}, - {"a is b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[Is()], comparators=[Name(id='b', ctx=Load())]))"}, - {"a is not b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[IsNot()], comparators=[Name(id='b', ctx=Load())]))"}, - {"a in b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[In()], comparators=[Name(id='b', ctx=Load())]))"}, - {"a not in b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[NotIn()], comparators=[Name(id='b', ctx=Load())]))"}, - {"ad", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[Eq(), Lt(), Gt()], comparators=[Name(id='b', ctx=Load()), Name(id='c', ctx=Load()), Name(id='d', ctx=Load())]))"}, - {"(a==b)d)>e", "eval", "Expression(body=Compare(left=Compare(left=Name(id='a', ctx=Load()), ops=[Eq()], comparators=[Name(id='b', ctx=Load())]), ops=[Lt(), Gt()], comparators=[Compare(left=Name(id='c', ctx=Load()), ops=[Gt()], comparators=[Name(id='d', ctx=Load())]), Name(id='e', ctx=Load())]))"}, - {"a()", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None))"}, - {"a(b)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load())], keywords=[], starargs=None, kwargs=None))"}, - {"a(b,)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load())], keywords=[], starargs=None, kwargs=None))"}, - {"a(b,c)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load()), Name(id='c', ctx=Load())], keywords=[], starargs=None, kwargs=None))"}, - {"a(b,*c)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load())], keywords=[], starargs=Name(id='c', ctx=Load()), kwargs=None))"}, - {"a(*b)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[], keywords=[], starargs=Name(id='b', ctx=Load()), kwargs=None))"}, - {"a(b,*c,**d)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load())], keywords=[], starargs=Name(id='c', ctx=Load()), kwargs=Name(id='d', ctx=Load())))"}, - {"a(b,**c)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load())], keywords=[], starargs=None, kwargs=Name(id='c', ctx=Load())))"}, - {"a(a=b)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[], keywords=[keyword(arg='a', value=Name(id='b', ctx=Load()))], starargs=None, kwargs=None))"}, - {"a(a,a=b,*args,**kwargs)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[keyword(arg='a', value=Name(id='b', ctx=Load()))], starargs=Name(id='args', ctx=Load()), kwargs=Name(id='kwargs', ctx=Load())))"}, - {"a(a,a=b,*args,e=f,**kwargs)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[keyword(arg='a', value=Name(id='b', ctx=Load())), keyword(arg='e', value=Name(id='f', ctx=Load()))], starargs=Name(id='args', ctx=Load()), kwargs=Name(id='kwargs', ctx=Load())))"}, - {"a(b for c in d)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[GeneratorExp(elt=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='c', ctx=Store()), iter=Name(id='d', ctx=Load()), ifs=[])])], keywords=[], starargs=None, kwargs=None))"}, - {"a.b", "eval", "Expression(body=Attribute(value=Name(id='a', ctx=Load()), attr='b', ctx=Load()))"}, - {"a.b.c.d", "eval", "Expression(body=Attribute(value=Attribute(value=Attribute(value=Name(id='a', ctx=Load()), attr='b', ctx=Load()), attr='c', ctx=Load()), attr='d', ctx=Load()))"}, - {"a.b().c.d()()", "eval", "Expression(body=Call(func=Call(func=Attribute(value=Attribute(value=Call(func=Attribute(value=Name(id='a', ctx=Load()), attr='b', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None), attr='c', ctx=Load()), attr='d', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None), args=[], keywords=[], starargs=None, kwargs=None))"}, - {"x[a]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Index(value=Name(id='a', ctx=Load())), ctx=Load()))"}, - {"x[a,]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Index(value=Tuple(elts=[Name(id='a', ctx=Load())], ctx=Load())), ctx=Load()))"}, - {"x[a:b]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=Name(id='a', ctx=Load()), upper=Name(id='b', ctx=Load()), step=None), ctx=Load()))"}, - {"x[:b]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=Name(id='b', ctx=Load()), step=None), ctx=Load()))"}, - {"x[b:]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=Name(id='b', ctx=Load()), upper=None, step=None), ctx=Load()))"}, - {"x[:]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=None, step=None), ctx=Load()))"}, - {"x[a:b:c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=Name(id='a', ctx=Load()), upper=Name(id='b', ctx=Load()), step=Name(id='c', ctx=Load())), ctx=Load()))"}, - {"x[:b:c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=Name(id='b', ctx=Load()), step=Name(id='c', ctx=Load())), ctx=Load()))"}, - {"x[a::c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=Name(id='a', ctx=Load()), upper=None, step=Name(id='c', ctx=Load())), ctx=Load()))"}, - {"x[a:b:]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=Name(id='a', ctx=Load()), upper=Name(id='b', ctx=Load()), step=None), ctx=Load()))"}, - {"x[::c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=None, step=Name(id='c', ctx=Load())), ctx=Load()))"}, - {"x[:b:]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=Name(id='b', ctx=Load()), step=None), ctx=Load()))"}, - {"x[::c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=None, step=Name(id='c', ctx=Load())), ctx=Load()))"}, - {"x[::]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=None, step=None), ctx=Load()))"}, - {"x[a,p]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Index(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='p', ctx=Load())], ctx=Load())), ctx=Load()))"}, - {"x[a, b]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Index(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], ctx=Load())), ctx=Load()))"}, - {"x[a, b, c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Index(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())], ctx=Load())), ctx=Load()))"}, - {"x[a, b:c, ::d]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=ExtSlice(dims=[Index(value=Name(id='a', ctx=Load())), Slice(lower=Name(id='b', ctx=Load()), upper=Name(id='c', ctx=Load()), step=None), Slice(lower=None, upper=None, step=Name(id='d', ctx=Load()))]), ctx=Load()))"}, - {"x[a, b:c, ::d]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=ExtSlice(dims=[Index(value=Name(id='a', ctx=Load())), Slice(lower=Name(id='b', ctx=Load()), upper=Name(id='c', ctx=Load()), step=None), Slice(lower=None, upper=None, step=Name(id='d', ctx=Load()))]), ctx=Load()))"}, - {"x[0, 1:2, ::5, ...]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=ExtSlice(dims=[Index(value=Num(n=0)), Slice(lower=Num(n=1), upper=Num(n=2), step=None), Slice(lower=None, upper=None, step=Num(n=5)), Index(value=Ellipsis())]), ctx=Load()))"}, - {"(yield a,b)", "eval", "Expression(body=Yield(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], ctx=Load())))"}, - {"(yield from a)", "eval", "Expression(body=YieldFrom(value=Name(id='a', ctx=Load())))"}, - {"del a,b", "exec", "Module(body=[Delete(targets=[Name(id='a', ctx=Del()), Name(id='b', ctx=Del())])])"}, - {"del *a,*b", "exec", "Module(body=[Delete(targets=[Starred(value=Name(id='a', ctx=Del()), ctx=Del()), Starred(value=Name(id='b', ctx=Del()), ctx=Del())])])"}, - {"pass", "exec", "Module(body=[Pass()])"}, - {"break", "exec", "Module(body=[Break()])"}, - {"continue", "exec", "Module(body=[Continue()])"}, - {"return", "exec", "Module(body=[Return(value=None)])"}, - {"return a", "exec", "Module(body=[Return(value=Name(id='a', ctx=Load()))])"}, - {"return a,", "exec", "Module(body=[Return(value=Tuple(elts=[Name(id='a', ctx=Load())], ctx=Load()))])"}, - {"return a,b", "exec", "Module(body=[Return(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], ctx=Load()))])"}, - {"raise", "exec", "Module(body=[Raise(exc=None, cause=None)])"}, - {"raise a", "exec", "Module(body=[Raise(exc=Name(id='a', ctx=Load()), cause=None)])"}, - {"raise a from b", "exec", "Module(body=[Raise(exc=Name(id='a', ctx=Load()), cause=Name(id='b', ctx=Load()))])"}, - {"yield", "exec", "Module(body=[Expr(value=Yield(value=None))])"}, - {"yield a", "exec", "Module(body=[Expr(value=Yield(value=Name(id='a', ctx=Load())))])"}, - {"yield a, b", "exec", "Module(body=[Expr(value=Yield(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], ctx=Load())))])"}, - {"import a", "exec", "Module(body=[Import(names=[alias(name='a', asname=None)])])"}, - {"import a as b, c as d", "exec", "Module(body=[Import(names=[alias(name='a', asname='b'), alias(name='c', asname='d')])])"}, - {"import a . b,c .d.e", "exec", "Module(body=[Import(names=[alias(name='a.b', asname=None), alias(name='c.d.e', asname=None)])])"}, - {"from a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=0)])"}, - {"from a import b as c, d as e", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname='c'), alias(name='d', asname='e')], level=0)])"}, - {"from a import b, c", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None), alias(name='c', asname=None)], level=0)])"}, - {"from a import (b, c)", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None), alias(name='c', asname=None)], level=0)])"}, - {"from a import *", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='*', asname=None)], level=0)])"}, - {"from . import b", "exec", "Module(body=[ImportFrom(module=None, names=[alias(name='b', asname=None)], level=1)])"}, - {"from .. import b", "exec", "Module(body=[ImportFrom(module=None, names=[alias(name='b', asname=None)], level=2)])"}, - {"from .a import (b, c,)", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None), alias(name='c', asname=None)], level=1)])"}, - {"from ..a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=2)])"}, - {"from ...a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=3)])"}, - {"from ....a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=4)])"}, - {"from .....a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=5)])"}, - {"from ......a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=6)])"}, - {"global a", "exec", "Module(body=[Global(names=['a'])])"}, - {"global a, b", "exec", "Module(body=[Global(names=['a', 'b'])])"}, - {"global a, b, c", "exec", "Module(body=[Global(names=['a', 'b', 'c'])])"}, - {"nonlocal a", "exec", "Module(body=[Nonlocal(names=['a'])])"}, - {"nonlocal a, b", "exec", "Module(body=[Nonlocal(names=['a', 'b'])])"}, - {"nonlocal a, b, c", "exec", "Module(body=[Nonlocal(names=['a', 'b', 'c'])])"}, - {"assert True", "exec", "Module(body=[Assert(test=NameConstant(value=True), msg=None)])"}, - {"assert True, 'Bang'", "exec", "Module(body=[Assert(test=NameConstant(value=True), msg=Str(s='Bang'))])"}, - {"assert a == b, 'Bang'", "exec", "Module(body=[Assert(test=Compare(left=Name(id='a', ctx=Load()), ops=[Eq()], comparators=[Name(id='b', ctx=Load())]), msg=Str(s='Bang'))])"}, - {"pass ; break ; continue", "exec", "Module(body=[Pass(), Break(), Continue()])"}, - {"while True: pass", "exec", "Module(body=[While(test=NameConstant(value=True), body=[Pass()], orelse=[])])"}, - {"while True:\n pass\n", "exec", "Module(body=[While(test=NameConstant(value=True), body=[Pass()], orelse=[])])"}, - {"while True:\n pass\nelse:\n return\n", "exec", "Module(body=[While(test=NameConstant(value=True), body=[Pass()], orelse=[Return(value=None)])])"}, - {"if True: pass", "exec", "Module(body=[If(test=NameConstant(value=True), body=[Pass()], orelse=[])])"}, - {"if True:\n pass\n", "exec", "Module(body=[If(test=NameConstant(value=True), body=[Pass()], orelse=[])])"}, - {"if True:\n pass\n\n", "exec", "Module(body=[If(test=NameConstant(value=True), body=[Pass()], orelse=[])])"}, - {"if True:\n pass\n continue\nelse:\n break\n pass\n", "exec", "Module(body=[If(test=NameConstant(value=True), body=[Pass(), Continue()], orelse=[Break(), Pass()])])"}, - {"if a:\n continue\nelif b:\n break\nelif c:\n pass\nelif c:\n continue\n pass\n", "exec", "Module(body=[If(test=Name(id='a', ctx=Load()), body=[Continue()], orelse=[If(test=Name(id='b', ctx=Load()), body=[Break()], orelse=[If(test=Name(id='c', ctx=Load()), body=[Pass()], orelse=[If(test=Name(id='c', ctx=Load()), body=[Continue(), Pass()], orelse=[])])])])])"}, - {"if a:\n continue\nelif b:\n break\nelse:\n continue\n pass\n", "exec", "Module(body=[If(test=Name(id='a', ctx=Load()), body=[Continue()], orelse=[If(test=Name(id='b', ctx=Load()), body=[Break()], orelse=[Continue(), Pass()])])])"}, - {"if a:\n continue\nelif b:\n break\nelif c:\n pass\nelse:\n continue\n pass\n", "exec", "Module(body=[If(test=Name(id='a', ctx=Load()), body=[Continue()], orelse=[If(test=Name(id='b', ctx=Load()), body=[Break()], orelse=[If(test=Name(id='c', ctx=Load()), body=[Pass()], orelse=[Continue(), Pass()])])])])"}, - {"if lambda: None:\n pass\n", "exec", "Module(body=[If(test=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=NameConstant(value=None)), body=[Pass()], orelse=[])])"}, - {"for a in b: pass", "exec", "Module(body=[For(target=Name(id='a', ctx=Store()), iter=Name(id='b', ctx=Load()), body=[Pass()], orelse=[])])"}, - {"for a, b in b: pass", "exec", "Module(body=[For(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='b', ctx=Load()), body=[Pass()], orelse=[])])"}, - {"for a, b in b:\n pass\nelse: break\n", "exec", "Module(body=[For(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='b', ctx=Load()), body=[Pass()], orelse=[Break()])])"}, - {"try:\n pass\nexcept:\n break\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=None, name=None, body=[Break()])], orelse=[], finalbody=[])])"}, - {"try:\n pass\nexcept a:\n break\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=Name(id='a', ctx=Load()), name=None, body=[Break()])], orelse=[], finalbody=[])])"}, - {"try:\n pass\nexcept a as b:\n break\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=Name(id='a', ctx=Load()), name='b', body=[Break()])], orelse=[], finalbody=[])])"}, - {"try:\n pass\nexcept a:\n break\nexcept:\n continue\nexcept b as c:\n break\nelse:\n pass\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=Name(id='a', ctx=Load()), name=None, body=[Break()]), ExceptHandler(type=None, name=None, body=[Continue()]), ExceptHandler(type=Name(id='b', ctx=Load()), name='c', body=[Break()])], orelse=[Pass()], finalbody=[])])"}, - {"try:\n pass\nexcept:\n continue\nfinally:\n pass\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=None, name=None, body=[Continue()])], orelse=[], finalbody=[Pass()])])"}, - {"try:\n pass\nexcept:\n continue\nelse:\n break\nfinally:\n pass\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=None, name=None, body=[Continue()])], orelse=[Break()], finalbody=[Pass()])])"}, - {"with x:\n pass\n", "exec", "Module(body=[With(items=[withitem(context_expr=Name(id='x', ctx=Load()), optional_vars=None)], body=[Pass()])])"}, - {"with x as y:\n pass\n", "exec", "Module(body=[With(items=[withitem(context_expr=Name(id='x', ctx=Load()), optional_vars=Name(id='y', ctx=Store()))], body=[Pass()])])"}, - {"with x as y, a as b, c, d as e:\n pass\n continue\n", "exec", "Module(body=[With(items=[withitem(context_expr=Name(id='x', ctx=Load()), optional_vars=Name(id='y', ctx=Store())), withitem(context_expr=Name(id='a', ctx=Load()), optional_vars=Name(id='b', ctx=Store())), withitem(context_expr=Name(id='c', ctx=Load()), optional_vars=None), withitem(context_expr=Name(id='d', ctx=Load()), optional_vars=Name(id='e', ctx=Store()))], body=[Pass(), Continue()])])"}, - {"a += b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Add(), value=Name(id='b', ctx=Load()))])"}, - {"a -= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Sub(), value=Name(id='b', ctx=Load()))])"}, - {"a *= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Mult(), value=Name(id='b', ctx=Load()))])"}, - {"a /= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Div(), value=Name(id='b', ctx=Load()))])"}, - {"a -= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Sub(), value=Name(id='b', ctx=Load()))])"}, - {"a %= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Mod(), value=Name(id='b', ctx=Load()))])"}, - {"a &= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=BitAnd(), value=Name(id='b', ctx=Load()))])"}, - {"a |= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=BitOr(), value=Name(id='b', ctx=Load()))])"}, - {"a ^= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=BitXor(), value=Name(id='b', ctx=Load()))])"}, - {"a <<= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=LShift(), value=Name(id='b', ctx=Load()))])"}, - {"a >>= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=RShift(), value=Name(id='b', ctx=Load()))])"}, - {"a **= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Pow(), value=Name(id='b', ctx=Load()))])"}, - {"a //= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=FloorDiv(), value=Name(id='b', ctx=Load()))])"}, - {"a //= yield b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=FloorDiv(), value=Yield(value=Name(id='b', ctx=Load())))])"}, - {"a.b += 1", "exec", "Module(body=[AugAssign(target=Attribute(value=Name(id='a', ctx=Load()), attr='b', ctx=Store()), op=Add(), value=Num(n=1))])"}, - {"a = b", "exec", "Module(body=[Assign(targets=[Name(id='a', ctx=Store())], value=Name(id='b', ctx=Load()))])"}, - {"a = b = c", "exec", "Module(body=[Assign(targets=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], value=Name(id='c', ctx=Load()))])"}, - {"a, b = 1, 2", "exec", "Module(body=[Assign(targets=[Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store())], value=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))])"}, - {"a, b = c, d = 1, 2", "exec", "Module(body=[Assign(targets=[Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), Tuple(elts=[Name(id='c', ctx=Store()), Name(id='d', ctx=Store())], ctx=Store())], value=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))])"}, - {"a, b = *a", "exec", "Module(body=[Assign(targets=[Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store())], value=Starred(value=Name(id='a', ctx=Load()), ctx=Load()))])"}, - {"a = yield a", "exec", "Module(body=[Assign(targets=[Name(id='a', ctx=Store())], value=Yield(value=Name(id='a', ctx=Load())))])"}, - {"a.b = 1", "exec", "Module(body=[Assign(targets=[Attribute(value=Name(id='a', ctx=Load()), attr='b', ctx=Store())], value=Num(n=1))])"}, - {"lambda: a", "eval", "Expression(body=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))"}, - {"lambda: lambda: a", "eval", "Expression(body=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load()))))"}, - {"lambda a: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))"}, - {"lambda a, b: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))"}, - {"lambda a, b,: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))"}, - {"lambda a = b: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[Name(id='b', ctx=Load())]), body=Name(id='a', ctx=Load())))"}, - {"lambda a, b=c: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[Name(id='c', ctx=Load())]), body=Name(id='a', ctx=Load())))"}, - {"lambda a, *b: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))"}, - {"lambda a, *b, c=d: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))"}, - {"lambda a, *, c=d: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))"}, - {"lambda a, *b, c=d, **kws: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=Name(id='a', ctx=Load())))"}, - {"lambda a, c=d, **kws: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None), arg(arg='c', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kws', annotation=None), defaults=[Name(id='d', ctx=Load())]), body=Name(id='a', ctx=Load())))"}, - {"lambda *args, c=d: a", "eval", "Expression(body=Lambda(args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))"}, - {"lambda *args, c=d, **kws: a", "eval", "Expression(body=Lambda(args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=Name(id='a', ctx=Load())))"}, - {"lambda **kws: a", "eval", "Expression(body=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=Name(id='a', ctx=Load())))"}, - {"def fn(): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(a): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(a, b): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(a, b,): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(a = b): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[Name(id='b', ctx=Load())]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(a, b=c): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[Name(id='c', ctx=Load())]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(a, *b): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(a, *b, c=d): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(a, *b, c=d, **kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(a, c=d, **kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None), arg(arg='c', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kws', annotation=None), defaults=[Name(id='d', ctx=Load())]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(*args, c=d): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(a, *, c=d): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(*args, c=d, **kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn(**kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=[Pass()], decorator_list=[], returns=None)])"}, - {"def fn() -> None: pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=NameConstant(value=None))])"}, - {"def fn(a:'potato') -> 'sausage': pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=Str(s='potato'))], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=Str(s='sausage'))])"}, - {"class A: pass", "exec", "Module(body=[ClassDef(name='A', bases=[], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"}, - {"class A(): pass", "exec", "Module(body=[ClassDef(name='A', bases=[], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"}, - {"class A(B): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load())], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"}, - {"class A(B,C): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"}, - {"class A(B,C,D=F): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[keyword(arg='D', value=Name(id='F', ctx=Load()))], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])"}, - {"class A(B,C,D=F,*AS,**KWS): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[keyword(arg='D', value=Name(id='F', ctx=Load()))], starargs=Name(id='AS', ctx=Load()), kwargs=Name(id='KWS', ctx=Load()), body=[Pass()], decorator_list=[])])"}, - {"@dec\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Name(id='dec', ctx=Load())], returns=None)])"}, - {"@dec()\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Call(func=Name(id='dec', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None)], returns=None)])"}, - {"@dec(a,b,c=d,*args,**kwargs)\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Call(func=Name(id='dec', ctx=Load()), args=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], keywords=[keyword(arg='c', value=Name(id='d', ctx=Load()))], starargs=Name(id='args', ctx=Load()), kwargs=Name(id='kwargs', ctx=Load()))], returns=None)])"}, - {"@dec1\n@dec2()\n@dec3(a)\n@dec4(a,b)\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Name(id='dec1', ctx=Load()), Call(func=Name(id='dec2', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='dec3', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='dec4', ctx=Load()), args=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], keywords=[], starargs=None, kwargs=None)], returns=None)])"}, - {"@dec1\n@dec2()\n@dec3(a)\n@dec4(a,b)\nclass A(B):\n pass\n", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load())], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[Name(id='dec1', ctx=Load()), Call(func=Name(id='dec2', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='dec3', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='dec4', ctx=Load()), args=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], keywords=[], starargs=None, kwargs=None)])])"}, - {"pass\n", "single", "Interactive(body=[Pass()])"}, + {"", "exec", "Module(body=[])", nil, ""}, + {"\n", "exec", "Module(body=[])", nil, ""}, + {"()", "eval", "Expression(body=Tuple(elts=[], ctx=Load()))", nil, ""}, + {"()", "exec", "Module(body=[Expr(value=Tuple(elts=[], ctx=Load()))])", nil, ""}, + {"[ ]", "exec", "Module(body=[Expr(value=List(elts=[], ctx=Load()))])", nil, ""}, + {"True\n", "eval", "Expression(body=NameConstant(value=True))", nil, ""}, + {"False\n", "eval", "Expression(body=NameConstant(value=False))", nil, ""}, + {"None\n", "eval", "Expression(body=NameConstant(value=None))", nil, ""}, + {"...", "eval", "Expression(body=Ellipsis())", nil, ""}, + {"abc123", "eval", "Expression(body=Name(id='abc123', ctx=Load()))", nil, ""}, + {"\"abc\"", "eval", "Expression(body=Str(s='abc'))", nil, ""}, + {"\"abc\" \"\"\"123\"\"\"", "eval", "Expression(body=Str(s='abc123'))", nil, ""}, + {"b'abc'", "eval", "Expression(body=Bytes(s=b'abc'))", nil, ""}, + {"b'abc' b'''123'''", "eval", "Expression(body=Bytes(s=b'abc123'))", nil, ""}, + {"1234", "eval", "Expression(body=Num(n=1234))", nil, ""}, + {"01234", "eval", "", py.SyntaxError, "illegal decimal with leading zero"}, + {"1234d", "eval", "", py.SyntaxError, "invalid syntax"}, + {"1234d", "exec", "", py.SyntaxError, "invalid syntax"}, + {"0x1234", "eval", "Expression(body=Num(n=4660))", nil, ""}, + {"12.34", "eval", "Expression(body=Num(n=12.34))", nil, ""}, + {"1,", "eval", "Expression(body=Tuple(elts=[Num(n=1)], ctx=Load()))", nil, ""}, + {"1,2", "eval", "Expression(body=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))", nil, ""}, + {"1,2,", "eval", "Expression(body=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))", nil, ""}, + {"{ }", "eval", "Expression(body=Dict(keys=[], values=[]))", nil, ""}, + {"{1}", "eval", "Expression(body=Set(elts=[Num(n=1)]))", nil, ""}, + {"{1,}", "eval", "Expression(body=Set(elts=[Num(n=1)]))", nil, ""}, + {"{1,2}", "eval", "Expression(body=Set(elts=[Num(n=1), Num(n=2)]))", nil, ""}, + {"{1,2,3,}", "eval", "Expression(body=Set(elts=[Num(n=1), Num(n=2), Num(n=3)]))", nil, ""}, + {"{ 'a':1 }", "eval", "Expression(body=Dict(keys=[Str(s='a')], values=[Num(n=1)]))", nil, ""}, + {"{ 'a':1, 'b':2 }", "eval", "Expression(body=Dict(keys=[Str(s='a'), Str(s='b')], values=[Num(n=1), Num(n=2)]))", nil, ""}, + {"{ 'a':{'aa':11, 'bb':{'aa':11, 'bb':22}}, 'b':{'aa':11, 'bb':22} }", "eval", "Expression(body=Dict(keys=[Str(s='a'), Str(s='b')], values=[Dict(keys=[Str(s='aa'), Str(s='bb')], values=[Num(n=11), Dict(keys=[Str(s='aa'), Str(s='bb')], values=[Num(n=11), Num(n=22)])]), Dict(keys=[Str(s='aa'), Str(s='bb')], values=[Num(n=11), Num(n=22)])]))", nil, ""}, + {"(1)", "eval", "Expression(body=Num(n=1))", nil, ""}, + {"(1,)", "eval", "Expression(body=Tuple(elts=[Num(n=1)], ctx=Load()))", nil, ""}, + {"(1,2)", "eval", "Expression(body=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))", nil, ""}, + {"(1,2,)", "eval", "Expression(body=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))", nil, ""}, + {"{(1,2)}", "eval", "Expression(body=Set(elts=[Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load())]))", nil, ""}, + {"(((((1,),(2,),),(2,),),((1,),(2,),),),((1,),(2,),))", "eval", "Expression(body=Tuple(elts=[Tuple(elts=[Tuple(elts=[Tuple(elts=[Tuple(elts=[Num(n=1)], ctx=Load()), Tuple(elts=[Num(n=2)], ctx=Load())], ctx=Load()), Tuple(elts=[Num(n=2)], ctx=Load())], ctx=Load()), Tuple(elts=[Tuple(elts=[Num(n=1)], ctx=Load()), Tuple(elts=[Num(n=2)], ctx=Load())], ctx=Load())], ctx=Load()), Tuple(elts=[Tuple(elts=[Num(n=1)], ctx=Load()), Tuple(elts=[Num(n=2)], ctx=Load())], ctx=Load())], ctx=Load()))", nil, ""}, + {"(((1)))", "eval", "Expression(body=Num(n=1))", nil, ""}, + {"[1]", "eval", "Expression(body=List(elts=[Num(n=1)], ctx=Load()))", nil, ""}, + {"[1,]", "eval", "Expression(body=List(elts=[Num(n=1)], ctx=Load()))", nil, ""}, + {"[1,2]", "eval", "Expression(body=List(elts=[Num(n=1), Num(n=2)], ctx=Load()))", nil, ""}, + {"[1,2,]", "eval", "Expression(body=List(elts=[Num(n=1), Num(n=2)], ctx=Load()))", nil, ""}, + {"( a for a in ab )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"( a for a, in ab )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"( a for a, b in ab )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"( a for a in ab if a )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load())])]))", nil, ""}, + {"( a for a in ab if a if b if c )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))", nil, ""}, + {"( a for a in ab for A in AB )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[])]))", nil, ""}, + {"( a for a in ab if a if b for A in AB if c )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[Name(id='c', ctx=Load())])]))", nil, ""}, + {"( a for a in ab if lambda: None )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=NameConstant(value=None))])]))", nil, ""}, + {"( a for a in ab if lambda x,y: x+y )", "eval", "Expression(body=GeneratorExp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Lambda(args=arguments(args=[arg(arg='x', annotation=None), arg(arg='y', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=BinOp(left=Name(id='x', ctx=Load()), op=Add(), right=Name(id='y', ctx=Load())))])]))", nil, ""}, + {"[ a for a in ab ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"[ a for a, in ab ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"[ a for a, b in ab ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"[ a for a in ab if a ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load())])]))", nil, ""}, + {"[ a for a in ab if a if b if c ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))", nil, ""}, + {"[ a for a in ab for A in AB ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[])]))", nil, ""}, + {"[ a for a in ab if a if b for A in AB if c ]", "eval", "Expression(body=ListComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[Name(id='c', ctx=Load())])]))", nil, ""}, + {"{ a for a in ab }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"{ a for a, in ab }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"{ a for a, b in ab }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"{ a for a in ab if a }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load())])]))", nil, ""}, + {"{ a for a in ab if a if b if c }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))", nil, ""}, + {"{ a for a in ab for A in AB }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[])]))", nil, ""}, + {"{ a for a in ab if a if b for A in AB if c }", "eval", "Expression(body=SetComp(elt=Name(id='a', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[Name(id='c', ctx=Load())])]))", nil, ""}, + {"{ a:b for a in ab }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"{ a:b for a, in ab }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"{ a:b for a, b in ab }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[])]))", nil, ""}, + {"{ a:b for a in ab if a }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load())])]))", nil, ""}, + {"{ a:b for a in ab if a if b if c }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))", nil, ""}, + {"{ a:b for a in ab for A in AB }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[])]))", nil, ""}, + {"{ a:b for a in ab if a if b for A in AB if c }", "eval", "Expression(body=DictComp(key=Name(id='a', ctx=Load()), value=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='a', ctx=Store()), iter=Name(id='ab', ctx=Load()), ifs=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), comprehension(target=Name(id='A', ctx=Store()), iter=Name(id='AB', ctx=Load()), ifs=[Name(id='c', ctx=Load())])]))", nil, ""}, + {"a|b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=BitOr(), right=Name(id='b', ctx=Load())))", nil, ""}, + {"a^b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=BitXor(), right=Name(id='b', ctx=Load())))", nil, ""}, + {"a&b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=BitAnd(), right=Name(id='b', ctx=Load())))", nil, ""}, + {"a<>b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=RShift(), right=Name(id='b', ctx=Load())))", nil, ""}, + {"a+b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())))", nil, ""}, + {"a-b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Sub(), right=Name(id='b', ctx=Load())))", nil, ""}, + {"a*b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Mult(), right=Name(id='b', ctx=Load())))", nil, ""}, + {"a/b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Div(), right=Name(id='b', ctx=Load())))", nil, ""}, + {"a//b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=FloorDiv(), right=Name(id='b', ctx=Load())))", nil, ""}, + {"a**b", "eval", "Expression(body=BinOp(left=Name(id='a', ctx=Load()), op=Pow(), right=Name(id='b', ctx=Load())))", nil, ""}, + {"not a", "eval", "Expression(body=UnaryOp(op=Not(), operand=Name(id='a', ctx=Load())))", nil, ""}, + {"+a", "eval", "Expression(body=UnaryOp(op=UAdd(), operand=Name(id='a', ctx=Load())))", nil, ""}, + {"-a", "eval", "Expression(body=UnaryOp(op=USub(), operand=Name(id='a', ctx=Load())))", nil, ""}, + {"~a", "eval", "Expression(body=UnaryOp(op=Invert(), operand=Name(id='a', ctx=Load())))", nil, ""}, + {"a and b", "eval", "Expression(body=BoolOp(op=And(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]))", nil, ""}, + {"a or b", "eval", "Expression(body=BoolOp(op=Or(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]))", nil, ""}, + {"a or b or c", "eval", "Expression(body=BoolOp(op=Or(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())]))", nil, ""}, + {"(a or b) or c", "eval", "Expression(body=BoolOp(op=Or(), values=[BoolOp(op=Or(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), Name(id='c', ctx=Load())]))", nil, ""}, + {"a or (b or c)", "eval", "Expression(body=BoolOp(op=Or(), values=[Name(id='a', ctx=Load()), BoolOp(op=Or(), values=[Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))", nil, ""}, + {"a and b and c", "eval", "Expression(body=BoolOp(op=And(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())]))", nil, ""}, + {"(a and b) and c", "eval", "Expression(body=BoolOp(op=And(), values=[BoolOp(op=And(), values=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())]), Name(id='c', ctx=Load())]))", nil, ""}, + {"a and (b and c)", "eval", "Expression(body=BoolOp(op=And(), values=[Name(id='a', ctx=Load()), BoolOp(op=And(), values=[Name(id='b', ctx=Load()), Name(id='c', ctx=Load())])]))", nil, ""}, + {"a+b-c/d", "eval", "Expression(body=BinOp(left=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())), op=Sub(), right=BinOp(left=Name(id='c', ctx=Load()), op=Div(), right=Name(id='d', ctx=Load()))))", nil, ""}, + {"a+b-c/d//e", "eval", "Expression(body=BinOp(left=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())), op=Sub(), right=BinOp(left=BinOp(left=Name(id='c', ctx=Load()), op=Div(), right=Name(id='d', ctx=Load())), op=FloorDiv(), right=Name(id='e', ctx=Load()))))", nil, ""}, + {"a+b-c/d//e%f", "eval", "Expression(body=BinOp(left=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())), op=Sub(), right=BinOp(left=BinOp(left=BinOp(left=Name(id='c', ctx=Load()), op=Div(), right=Name(id='d', ctx=Load())), op=FloorDiv(), right=Name(id='e', ctx=Load())), op=Mod(), right=Name(id='f', ctx=Load()))))", nil, ""}, + {"a+b-c/d//e%f**g", "eval", "Expression(body=BinOp(left=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())), op=Sub(), right=BinOp(left=BinOp(left=BinOp(left=Name(id='c', ctx=Load()), op=Div(), right=Name(id='d', ctx=Load())), op=FloorDiv(), right=Name(id='e', ctx=Load())), op=Mod(), right=BinOp(left=Name(id='f', ctx=Load()), op=Pow(), right=Name(id='g', ctx=Load())))))", nil, ""}, + {"a+b-c/d//e%f**g|h&i^k<>m", "eval", "Expression(body=BinOp(left=BinOp(left=BinOp(left=Name(id='a', ctx=Load()), op=Add(), right=Name(id='b', ctx=Load())), op=Sub(), right=BinOp(left=BinOp(left=BinOp(left=Name(id='c', ctx=Load()), op=Div(), right=Name(id='d', ctx=Load())), op=FloorDiv(), right=Name(id='e', ctx=Load())), op=Mod(), right=BinOp(left=Name(id='f', ctx=Load()), op=Pow(), right=Name(id='g', ctx=Load())))), op=BitOr(), right=BinOp(left=BinOp(left=Name(id='h', ctx=Load()), op=BitAnd(), right=Name(id='i', ctx=Load())), op=BitXor(), right=BinOp(left=BinOp(left=Name(id='k', ctx=Load()), op=LShift(), right=Name(id='l', ctx=Load())), op=RShift(), right=Name(id='m', ctx=Load())))))", nil, ""}, + {"a if b else c", "eval", "Expression(body=IfExp(test=Name(id='b', ctx=Load()), body=Name(id='a', ctx=Load()), orelse=Name(id='c', ctx=Load())))", nil, ""}, + {"a==b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[Eq()], comparators=[Name(id='b', ctx=Load())]))", nil, ""}, + {"a!=b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[NotEq()], comparators=[Name(id='b', ctx=Load())]))", nil, ""}, + {"ab", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[Gt()], comparators=[Name(id='b', ctx=Load())]))", nil, ""}, + {"a>=b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[GtE()], comparators=[Name(id='b', ctx=Load())]))", nil, ""}, + {"a is b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[Is()], comparators=[Name(id='b', ctx=Load())]))", nil, ""}, + {"a is not b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[IsNot()], comparators=[Name(id='b', ctx=Load())]))", nil, ""}, + {"a in b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[In()], comparators=[Name(id='b', ctx=Load())]))", nil, ""}, + {"a not in b", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[NotIn()], comparators=[Name(id='b', ctx=Load())]))", nil, ""}, + {"ad", "eval", "Expression(body=Compare(left=Name(id='a', ctx=Load()), ops=[Eq(), Lt(), Gt()], comparators=[Name(id='b', ctx=Load()), Name(id='c', ctx=Load()), Name(id='d', ctx=Load())]))", nil, ""}, + {"(a==b)d)>e", "eval", "Expression(body=Compare(left=Compare(left=Name(id='a', ctx=Load()), ops=[Eq()], comparators=[Name(id='b', ctx=Load())]), ops=[Lt(), Gt()], comparators=[Compare(left=Name(id='c', ctx=Load()), ops=[Gt()], comparators=[Name(id='d', ctx=Load())]), Name(id='e', ctx=Load())]))", nil, ""}, + {"a()", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None))", nil, ""}, + {"a(b)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load())], keywords=[], starargs=None, kwargs=None))", nil, ""}, + {"a(b,)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load())], keywords=[], starargs=None, kwargs=None))", nil, ""}, + {"a(b,c)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load()), Name(id='c', ctx=Load())], keywords=[], starargs=None, kwargs=None))", nil, ""}, + {"a(b,*c)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load())], keywords=[], starargs=Name(id='c', ctx=Load()), kwargs=None))", nil, ""}, + {"a(*b)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[], keywords=[], starargs=Name(id='b', ctx=Load()), kwargs=None))", nil, ""}, + {"a(b,*c,**d)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load())], keywords=[], starargs=Name(id='c', ctx=Load()), kwargs=Name(id='d', ctx=Load())))", nil, ""}, + {"a(b,**c)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='b', ctx=Load())], keywords=[], starargs=None, kwargs=Name(id='c', ctx=Load())))", nil, ""}, + {"a(a=b)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[], keywords=[keyword(arg='a', value=Name(id='b', ctx=Load()))], starargs=None, kwargs=None))", nil, ""}, + {"a(a,a=b,*args,**kwargs)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[keyword(arg='a', value=Name(id='b', ctx=Load()))], starargs=Name(id='args', ctx=Load()), kwargs=Name(id='kwargs', ctx=Load())))", nil, ""}, + {"a(a,a=b,*args,e=f,**kwargs)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[keyword(arg='a', value=Name(id='b', ctx=Load())), keyword(arg='e', value=Name(id='f', ctx=Load()))], starargs=Name(id='args', ctx=Load()), kwargs=Name(id='kwargs', ctx=Load())))", nil, ""}, + {"a(b for c in d)", "eval", "Expression(body=Call(func=Name(id='a', ctx=Load()), args=[GeneratorExp(elt=Name(id='b', ctx=Load()), generators=[comprehension(target=Name(id='c', ctx=Store()), iter=Name(id='d', ctx=Load()), ifs=[])])], keywords=[], starargs=None, kwargs=None))", nil, ""}, + {"a.b", "eval", "Expression(body=Attribute(value=Name(id='a', ctx=Load()), attr='b', ctx=Load()))", nil, ""}, + {"a.b.c.d", "eval", "Expression(body=Attribute(value=Attribute(value=Attribute(value=Name(id='a', ctx=Load()), attr='b', ctx=Load()), attr='c', ctx=Load()), attr='d', ctx=Load()))", nil, ""}, + {"a.b().c.d()()", "eval", "Expression(body=Call(func=Call(func=Attribute(value=Attribute(value=Call(func=Attribute(value=Name(id='a', ctx=Load()), attr='b', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None), attr='c', ctx=Load()), attr='d', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None), args=[], keywords=[], starargs=None, kwargs=None))", nil, ""}, + {"x[a]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Index(value=Name(id='a', ctx=Load())), ctx=Load()))", nil, ""}, + {"x[a,]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Index(value=Tuple(elts=[Name(id='a', ctx=Load())], ctx=Load())), ctx=Load()))", nil, ""}, + {"x[a:b]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=Name(id='a', ctx=Load()), upper=Name(id='b', ctx=Load()), step=None), ctx=Load()))", nil, ""}, + {"x[:b]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=Name(id='b', ctx=Load()), step=None), ctx=Load()))", nil, ""}, + {"x[b:]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=Name(id='b', ctx=Load()), upper=None, step=None), ctx=Load()))", nil, ""}, + {"x[:]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=None, step=None), ctx=Load()))", nil, ""}, + {"x[a:b:c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=Name(id='a', ctx=Load()), upper=Name(id='b', ctx=Load()), step=Name(id='c', ctx=Load())), ctx=Load()))", nil, ""}, + {"x[:b:c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=Name(id='b', ctx=Load()), step=Name(id='c', ctx=Load())), ctx=Load()))", nil, ""}, + {"x[a::c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=Name(id='a', ctx=Load()), upper=None, step=Name(id='c', ctx=Load())), ctx=Load()))", nil, ""}, + {"x[a:b:]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=Name(id='a', ctx=Load()), upper=Name(id='b', ctx=Load()), step=None), ctx=Load()))", nil, ""}, + {"x[::c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=None, step=Name(id='c', ctx=Load())), ctx=Load()))", nil, ""}, + {"x[:b:]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=Name(id='b', ctx=Load()), step=None), ctx=Load()))", nil, ""}, + {"x[::c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=None, step=Name(id='c', ctx=Load())), ctx=Load()))", nil, ""}, + {"x[::]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Slice(lower=None, upper=None, step=None), ctx=Load()))", nil, ""}, + {"x[a,p]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Index(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='p', ctx=Load())], ctx=Load())), ctx=Load()))", nil, ""}, + {"x[a, b]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Index(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], ctx=Load())), ctx=Load()))", nil, ""}, + {"x[a, b, c]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=Index(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load()), Name(id='c', ctx=Load())], ctx=Load())), ctx=Load()))", nil, ""}, + {"x[a, b:c, ::d]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=ExtSlice(dims=[Index(value=Name(id='a', ctx=Load())), Slice(lower=Name(id='b', ctx=Load()), upper=Name(id='c', ctx=Load()), step=None), Slice(lower=None, upper=None, step=Name(id='d', ctx=Load()))]), ctx=Load()))", nil, ""}, + {"x[a, b:c, ::d]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=ExtSlice(dims=[Index(value=Name(id='a', ctx=Load())), Slice(lower=Name(id='b', ctx=Load()), upper=Name(id='c', ctx=Load()), step=None), Slice(lower=None, upper=None, step=Name(id='d', ctx=Load()))]), ctx=Load()))", nil, ""}, + {"x[0, 1:2, ::5, ...]", "eval", "Expression(body=Subscript(value=Name(id='x', ctx=Load()), slice=ExtSlice(dims=[Index(value=Num(n=0)), Slice(lower=Num(n=1), upper=Num(n=2), step=None), Slice(lower=None, upper=None, step=Num(n=5)), Index(value=Ellipsis())]), ctx=Load()))", nil, ""}, + {"(yield a,b)", "eval", "Expression(body=Yield(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], ctx=Load())))", nil, ""}, + {"(yield from a)", "eval", "Expression(body=YieldFrom(value=Name(id='a', ctx=Load())))", nil, ""}, + {"del a,b", "exec", "Module(body=[Delete(targets=[Name(id='a', ctx=Del()), Name(id='b', ctx=Del())])])", nil, ""}, + {"del *a,*b", "exec", "Module(body=[Delete(targets=[Starred(value=Name(id='a', ctx=Del()), ctx=Del()), Starred(value=Name(id='b', ctx=Del()), ctx=Del())])])", nil, ""}, + {"pass", "exec", "Module(body=[Pass()])", nil, ""}, + {"break", "exec", "Module(body=[Break()])", nil, ""}, + {"continue", "exec", "Module(body=[Continue()])", nil, ""}, + {"return", "exec", "Module(body=[Return(value=None)])", nil, ""}, + {"return a", "exec", "Module(body=[Return(value=Name(id='a', ctx=Load()))])", nil, ""}, + {"return a,", "exec", "Module(body=[Return(value=Tuple(elts=[Name(id='a', ctx=Load())], ctx=Load()))])", nil, ""}, + {"return a,b", "exec", "Module(body=[Return(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], ctx=Load()))])", nil, ""}, + {"raise", "exec", "Module(body=[Raise(exc=None, cause=None)])", nil, ""}, + {"raise a", "exec", "Module(body=[Raise(exc=Name(id='a', ctx=Load()), cause=None)])", nil, ""}, + {"raise a from b", "exec", "Module(body=[Raise(exc=Name(id='a', ctx=Load()), cause=Name(id='b', ctx=Load()))])", nil, ""}, + {"yield", "exec", "Module(body=[Expr(value=Yield(value=None))])", nil, ""}, + {"yield a", "exec", "Module(body=[Expr(value=Yield(value=Name(id='a', ctx=Load())))])", nil, ""}, + {"yield a, b", "exec", "Module(body=[Expr(value=Yield(value=Tuple(elts=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], ctx=Load())))])", nil, ""}, + {"import a", "exec", "Module(body=[Import(names=[alias(name='a', asname=None)])])", nil, ""}, + {"import a as b, c as d", "exec", "Module(body=[Import(names=[alias(name='a', asname='b'), alias(name='c', asname='d')])])", nil, ""}, + {"import a . b,c .d.e", "exec", "Module(body=[Import(names=[alias(name='a.b', asname=None), alias(name='c.d.e', asname=None)])])", nil, ""}, + {"from a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=0)])", nil, ""}, + {"from a import b as c, d as e", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname='c'), alias(name='d', asname='e')], level=0)])", nil, ""}, + {"from a import b, c", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None), alias(name='c', asname=None)], level=0)])", nil, ""}, + {"from a import (b, c)", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None), alias(name='c', asname=None)], level=0)])", nil, ""}, + {"from a import *", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='*', asname=None)], level=0)])", nil, ""}, + {"from . import b", "exec", "Module(body=[ImportFrom(module=None, names=[alias(name='b', asname=None)], level=1)])", nil, ""}, + {"from .. import b", "exec", "Module(body=[ImportFrom(module=None, names=[alias(name='b', asname=None)], level=2)])", nil, ""}, + {"from .a import (b, c,)", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None), alias(name='c', asname=None)], level=1)])", nil, ""}, + {"from ..a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=2)])", nil, ""}, + {"from ...a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=3)])", nil, ""}, + {"from ....a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=4)])", nil, ""}, + {"from .....a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=5)])", nil, ""}, + {"from ......a import b", "exec", "Module(body=[ImportFrom(module='a', names=[alias(name='b', asname=None)], level=6)])", nil, ""}, + {"global a", "exec", "Module(body=[Global(names=['a'])])", nil, ""}, + {"global a, b", "exec", "Module(body=[Global(names=['a', 'b'])])", nil, ""}, + {"global a, b, c", "exec", "Module(body=[Global(names=['a', 'b', 'c'])])", nil, ""}, + {"nonlocal a", "exec", "Module(body=[Nonlocal(names=['a'])])", nil, ""}, + {"nonlocal a, b", "exec", "Module(body=[Nonlocal(names=['a', 'b'])])", nil, ""}, + {"nonlocal a, b, c", "exec", "Module(body=[Nonlocal(names=['a', 'b', 'c'])])", nil, ""}, + {"assert True", "exec", "Module(body=[Assert(test=NameConstant(value=True), msg=None)])", nil, ""}, + {"assert True, 'Bang'", "exec", "Module(body=[Assert(test=NameConstant(value=True), msg=Str(s='Bang'))])", nil, ""}, + {"assert a == b, 'Bang'", "exec", "Module(body=[Assert(test=Compare(left=Name(id='a', ctx=Load()), ops=[Eq()], comparators=[Name(id='b', ctx=Load())]), msg=Str(s='Bang'))])", nil, ""}, + {"pass ; break ; continue", "exec", "Module(body=[Pass(), Break(), Continue()])", nil, ""}, + {"while True: pass", "exec", "Module(body=[While(test=NameConstant(value=True), body=[Pass()], orelse=[])])", nil, ""}, + {"while True:\n pass\n", "exec", "Module(body=[While(test=NameConstant(value=True), body=[Pass()], orelse=[])])", nil, ""}, + {"while True:\n pass\nelse:\n return\n", "exec", "Module(body=[While(test=NameConstant(value=True), body=[Pass()], orelse=[Return(value=None)])])", nil, ""}, + {"if True: pass", "exec", "Module(body=[If(test=NameConstant(value=True), body=[Pass()], orelse=[])])", nil, ""}, + {"if True:\n pass\n", "exec", "Module(body=[If(test=NameConstant(value=True), body=[Pass()], orelse=[])])", nil, ""}, + {"if True:\n pass\n\n", "exec", "Module(body=[If(test=NameConstant(value=True), body=[Pass()], orelse=[])])", nil, ""}, + {"if True:\n pass\n continue\nelse:\n break\n pass\n", "exec", "Module(body=[If(test=NameConstant(value=True), body=[Pass(), Continue()], orelse=[Break(), Pass()])])", nil, ""}, + {"if a:\n continue\nelif b:\n break\nelif c:\n pass\nelif c:\n continue\n pass\n", "exec", "Module(body=[If(test=Name(id='a', ctx=Load()), body=[Continue()], orelse=[If(test=Name(id='b', ctx=Load()), body=[Break()], orelse=[If(test=Name(id='c', ctx=Load()), body=[Pass()], orelse=[If(test=Name(id='c', ctx=Load()), body=[Continue(), Pass()], orelse=[])])])])])", nil, ""}, + {"if a:\n continue\nelif b:\n break\nelse:\n continue\n pass\n", "exec", "Module(body=[If(test=Name(id='a', ctx=Load()), body=[Continue()], orelse=[If(test=Name(id='b', ctx=Load()), body=[Break()], orelse=[Continue(), Pass()])])])", nil, ""}, + {"if a:\n continue\nelif b:\n break\nelif c:\n pass\nelse:\n continue\n pass\n", "exec", "Module(body=[If(test=Name(id='a', ctx=Load()), body=[Continue()], orelse=[If(test=Name(id='b', ctx=Load()), body=[Break()], orelse=[If(test=Name(id='c', ctx=Load()), body=[Pass()], orelse=[Continue(), Pass()])])])])", nil, ""}, + {"if lambda: None:\n pass\n", "exec", "Module(body=[If(test=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=NameConstant(value=None)), body=[Pass()], orelse=[])])", nil, ""}, + {"for a in b: pass", "exec", "Module(body=[For(target=Name(id='a', ctx=Store()), iter=Name(id='b', ctx=Load()), body=[Pass()], orelse=[])])", nil, ""}, + {"for a, b in b: pass", "exec", "Module(body=[For(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='b', ctx=Load()), body=[Pass()], orelse=[])])", nil, ""}, + {"for a, b in b:\n pass\nelse: break\n", "exec", "Module(body=[For(target=Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), iter=Name(id='b', ctx=Load()), body=[Pass()], orelse=[Break()])])", nil, ""}, + {"try:\n pass\nexcept:\n break\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=None, name=None, body=[Break()])], orelse=[], finalbody=[])])", nil, ""}, + {"try:\n pass\nexcept a:\n break\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=Name(id='a', ctx=Load()), name=None, body=[Break()])], orelse=[], finalbody=[])])", nil, ""}, + {"try:\n pass\nexcept a as b:\n break\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=Name(id='a', ctx=Load()), name='b', body=[Break()])], orelse=[], finalbody=[])])", nil, ""}, + {"try:\n pass\nexcept a:\n break\nexcept:\n continue\nexcept b as c:\n break\nelse:\n pass\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=Name(id='a', ctx=Load()), name=None, body=[Break()]), ExceptHandler(type=None, name=None, body=[Continue()]), ExceptHandler(type=Name(id='b', ctx=Load()), name='c', body=[Break()])], orelse=[Pass()], finalbody=[])])", nil, ""}, + {"try:\n pass\nexcept:\n continue\nfinally:\n pass\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=None, name=None, body=[Continue()])], orelse=[], finalbody=[Pass()])])", nil, ""}, + {"try:\n pass\nexcept:\n continue\nelse:\n break\nfinally:\n pass\n", "exec", "Module(body=[Try(body=[Pass()], handlers=[ExceptHandler(type=None, name=None, body=[Continue()])], orelse=[Break()], finalbody=[Pass()])])", nil, ""}, + {"with x:\n pass\n", "exec", "Module(body=[With(items=[withitem(context_expr=Name(id='x', ctx=Load()), optional_vars=None)], body=[Pass()])])", nil, ""}, + {"with x as y:\n pass\n", "exec", "Module(body=[With(items=[withitem(context_expr=Name(id='x', ctx=Load()), optional_vars=Name(id='y', ctx=Store()))], body=[Pass()])])", nil, ""}, + {"with x as y, a as b, c, d as e:\n pass\n continue\n", "exec", "Module(body=[With(items=[withitem(context_expr=Name(id='x', ctx=Load()), optional_vars=Name(id='y', ctx=Store())), withitem(context_expr=Name(id='a', ctx=Load()), optional_vars=Name(id='b', ctx=Store())), withitem(context_expr=Name(id='c', ctx=Load()), optional_vars=None), withitem(context_expr=Name(id='d', ctx=Load()), optional_vars=Name(id='e', ctx=Store()))], body=[Pass(), Continue()])])", nil, ""}, + {"a += b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Add(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a -= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Sub(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a *= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Mult(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a /= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Div(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a -= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Sub(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a %= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Mod(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a &= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=BitAnd(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a |= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=BitOr(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a ^= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=BitXor(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a <<= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=LShift(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a >>= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=RShift(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a **= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=Pow(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a //= b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=FloorDiv(), value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a //= yield b", "exec", "Module(body=[AugAssign(target=Name(id='a', ctx=Store()), op=FloorDiv(), value=Yield(value=Name(id='b', ctx=Load())))])", nil, ""}, + {"a.b += 1", "exec", "Module(body=[AugAssign(target=Attribute(value=Name(id='a', ctx=Load()), attr='b', ctx=Store()), op=Add(), value=Num(n=1))])", nil, ""}, + {"a = b", "exec", "Module(body=[Assign(targets=[Name(id='a', ctx=Store())], value=Name(id='b', ctx=Load()))])", nil, ""}, + {"a = 007", "exec", "", py.SyntaxError, "illegal decimal with leading zero"}, + {"a = b = c", "exec", "Module(body=[Assign(targets=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], value=Name(id='c', ctx=Load()))])", nil, ""}, + {"a, b = 1, 2", "exec", "Module(body=[Assign(targets=[Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store())], value=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))])", nil, ""}, + {"a, b = c, d = 1, 2", "exec", "Module(body=[Assign(targets=[Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store()), Tuple(elts=[Name(id='c', ctx=Store()), Name(id='d', ctx=Store())], ctx=Store())], value=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load()))])", nil, ""}, + {"a, b = *a", "exec", "Module(body=[Assign(targets=[Tuple(elts=[Name(id='a', ctx=Store()), Name(id='b', ctx=Store())], ctx=Store())], value=Starred(value=Name(id='a', ctx=Load()), ctx=Load()))])", nil, ""}, + {"a = yield a", "exec", "Module(body=[Assign(targets=[Name(id='a', ctx=Store())], value=Yield(value=Name(id='a', ctx=Load())))])", nil, ""}, + {"a.b = 1", "exec", "Module(body=[Assign(targets=[Attribute(value=Name(id='a', ctx=Load()), attr='b', ctx=Store())], value=Num(n=1))])", nil, ""}, + {"lambda: a", "eval", "Expression(body=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda: lambda: a", "eval", "Expression(body=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load()))))", nil, ""}, + {"lambda a: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda a, b: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda a, b,: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda a = b: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[Name(id='b', ctx=Load())]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda a, b=c: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[Name(id='c', ctx=Load())]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda a, *b: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda a, *b, c=d: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda a, *, c=d: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda a, *b, c=d, **kws: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda a, c=d, **kws: a", "eval", "Expression(body=Lambda(args=arguments(args=[arg(arg='a', annotation=None), arg(arg='c', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kws', annotation=None), defaults=[Name(id='d', ctx=Load())]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda *args, c=d: a", "eval", "Expression(body=Lambda(args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda *args, c=d, **kws: a", "eval", "Expression(body=Lambda(args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"lambda **kws: a", "eval", "Expression(body=Lambda(args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=Name(id='a', ctx=Load())))", nil, ""}, + {"def fn(): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(a): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(a, b): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(a, b,): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(a = b): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[Name(id='b', ctx=Load())]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(a, b=c): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None), arg(arg='b', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[Name(id='c', ctx=Load())]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(a, *b): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(a, *b, c=d): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(a, *b, c=d, **kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=arg(arg='b', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(a, c=d, **kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None), arg(arg='c', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kws', annotation=None), defaults=[Name(id='d', ctx=Load())]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(*args, c=d): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(a, *, c=d): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=None)], vararg=None, kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(*args, c=d, **kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=arg(arg='args', annotation=None), kwonlyargs=[arg(arg='c', annotation=None)], kw_defaults=[Name(id='d', ctx=Load())], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn(**kws): pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=arg(arg='kws', annotation=None), defaults=[]), body=[Pass()], decorator_list=[], returns=None)])", nil, ""}, + {"def fn() -> None: pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=NameConstant(value=None))])", nil, ""}, + {"def fn(a:'potato') -> 'sausage': pass", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[arg(arg='a', annotation=Str(s='potato'))], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[], returns=Str(s='sausage'))])", nil, ""}, + {"class A: pass", "exec", "Module(body=[ClassDef(name='A', bases=[], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])", nil, ""}, + {"class A(): pass", "exec", "Module(body=[ClassDef(name='A', bases=[], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])", nil, ""}, + {"class A(B): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load())], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])", nil, ""}, + {"class A(B,C): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])", nil, ""}, + {"class A(B,C,D=F): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[keyword(arg='D', value=Name(id='F', ctx=Load()))], starargs=None, kwargs=None, body=[Pass()], decorator_list=[])])", nil, ""}, + {"class A(B,C,D=F,*AS,**KWS): pass", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load()), Name(id='C', ctx=Load())], keywords=[keyword(arg='D', value=Name(id='F', ctx=Load()))], starargs=Name(id='AS', ctx=Load()), kwargs=Name(id='KWS', ctx=Load()), body=[Pass()], decorator_list=[])])", nil, ""}, + {"@dec\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Name(id='dec', ctx=Load())], returns=None)])", nil, ""}, + {"@dec()\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Call(func=Name(id='dec', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None)], returns=None)])", nil, ""}, + {"@dec(a,b,c=d,*args,**kwargs)\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Call(func=Name(id='dec', ctx=Load()), args=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], keywords=[keyword(arg='c', value=Name(id='d', ctx=Load()))], starargs=Name(id='args', ctx=Load()), kwargs=Name(id='kwargs', ctx=Load()))], returns=None)])", nil, ""}, + {"@dec1\n@dec2()\n@dec3(a)\n@dec4(a,b)\ndef fn():\n pass\n", "exec", "Module(body=[FunctionDef(name='fn', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Pass()], decorator_list=[Name(id='dec1', ctx=Load()), Call(func=Name(id='dec2', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='dec3', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='dec4', ctx=Load()), args=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], keywords=[], starargs=None, kwargs=None)], returns=None)])", nil, ""}, + {"@dec1\n@dec2()\n@dec3(a)\n@dec4(a,b)\nclass A(B):\n pass\n", "exec", "Module(body=[ClassDef(name='A', bases=[Name(id='B', ctx=Load())], keywords=[], starargs=None, kwargs=None, body=[Pass()], decorator_list=[Name(id='dec1', ctx=Load()), Call(func=Name(id='dec2', ctx=Load()), args=[], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='dec3', ctx=Load()), args=[Name(id='a', ctx=Load())], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='dec4', ctx=Load()), args=[Name(id='a', ctx=Load()), Name(id='b', ctx=Load())], keywords=[], starargs=None, kwargs=None)])])", nil, ""}, + {"pass\n", "single", "Interactive(body=[Pass()])", nil, ""}, } diff --git a/parser/grammar_test.go b/parser/grammar_test.go index fcb7ad25..57d93db3 100644 --- a/parser/grammar_test.go +++ b/parser/grammar_test.go @@ -7,24 +7,44 @@ import ( "testing" "github.com/ncw/gpython/ast" + "github.com/ncw/gpython/py" ) var debugLevel = flag.Int("debugLevel", 0, "Debug level 0-4") // FIXME test pos is correct -// FIXME add tests to test the error cases - func TestGrammar(t *testing.T) { SetDebug(*debugLevel) for _, test := range grammarTestData { Ast, err := ParseString(test.in, test.mode) if err != nil { - t.Errorf("Parse(%q) returned error: %v", test.in, err) + if test.exceptionType == nil { + t.Errorf("%s: Got exception %v when not expecting one", test.in, err) + return + } else if exc, ok := err.(*py.Exception); !ok { + t.Errorf("%s: Got non python exception %T %v", test.in, err, err) + return + } else if exc.Type() != test.exceptionType { + t.Errorf("%s: want exception type %v got %v", test.in, test.exceptionType, exc.Type()) + return + } else if exc.Type() != test.exceptionType { + t.Errorf("%s: want exception type %v got %v", test.in, test.exceptionType, exc.Type()) + return + } else { + msg := string(exc.Args.(py.Tuple)[0].(py.String)) + if msg != test.errString { + t.Errorf("%s: want exception text %q got %q", test.in, test.errString, msg) + } + } } else { - out := ast.Dump(Ast) - if out != test.out { - t.Errorf("Parse(%q)\nwant> %q\n got> %q\n", test.in, test.out, out) + if test.exceptionType != nil { + t.Errorf("%s: expecting exception %q", test.in, test.errString) + } else { + out := ast.Dump(Ast) + if out != test.out { + t.Errorf("Parse(%q)\nwant> %q\n got> %q\n", test.in, test.out, out) + } } } } diff --git a/parser/lexer.go b/parser/lexer.go index 21ae9e34..eafed47a 100644 --- a/parser/lexer.go +++ b/parser/lexer.go @@ -90,7 +90,7 @@ func (x *yyLex) refill() { x.eof = true default: x.eof = true - x.Errorf("Error reading input: %v", err) + x.SyntaxErrorf("Error reading input: %v", err) } // If this is exec input, add a newline to the end of the // string if there isn't one already. @@ -129,7 +129,7 @@ func countIndent(s string) int { // a b indent += tabSize - (indent & (tabSize - 1)) default: - panic("bad indent") + panic(py.ExceptionNewf(py.IndentationError, "unexpected indent")) } } @@ -399,7 +399,7 @@ func (x *yyLex) Lex(yylval *yySymType) (ret int) { goto foundIndent } } - x.Error("Inconsistent indent") + x.SyntaxError("Inconsistent indent") return eof foundIndent: x.indentStack = x.indentStack[:len(x.indentStack)-1] @@ -489,7 +489,7 @@ func (x *yyLex) Lex(yylval *yySymType) (ret int) { } // Nothing we recognise found - x.Error("invalid syntax") + x.SyntaxError("invalid syntax") return eof case checkEof: if x.eof { @@ -683,8 +683,9 @@ isNumber: value = py.Complex(complex(0, f)) } else { // Discard numbers with leading 0 except all 0s - if illegalDecimalInteger.FindString(x.line) != "" { - x.Error("illegal decimal with leading zero") + if illegalDecimalInteger.FindString(s) != "" { + // FIXME where is this error going in the grammar? + x.SyntaxError("illegal decimal with leading zero") return eofError, nil } value, err = py.IntFromString(s, 10) @@ -806,12 +807,12 @@ found: } } if !multiLineString { - x.Errorf("Unterminated %sx%s string", stringEnd, stringEnd) + x.SyntaxErrorf("Unterminated %sx%s string", stringEnd, stringEnd) return eofError, nil } readMore: if x.eof { - x.Errorf("Unterminated %sx%s string", stringEnd, stringEnd) + x.SyntaxErrorf("Unterminated %sx%s string", stringEnd, stringEnd) return eofError, nil } x.refill() @@ -821,7 +822,7 @@ foundEndOfString: var err error buf, err = DecodeEscape(buf, byteString) if err != nil { - x.Errorf("Decode error: %v", err) + x.SyntaxErrorf("Decode error: %v", err) return eofError, nil } } @@ -834,7 +835,6 @@ foundEndOfString: // The parser calls this method on a parse error. func (x *yyLex) Error(s string) { x.error = true - x.errorString = s if yyDebug >= 1 { log.Printf("Parse error: %s", s) log.Printf("Parse buffer %q", x.line) @@ -842,15 +842,24 @@ func (x *yyLex) Error(s string) { } } +// The parser calls this method on a parse error. +func (x *yyLex) SyntaxError(s string) { + x.errorString = s + x.Error(s) +} + // Call this to write formatted errors -func (x *yyLex) Errorf(format string, a ...interface{}) { - x.Error(fmt.Sprintf(format, a...)) +func (x *yyLex) SyntaxErrorf(format string, a ...interface{}) { + x.SyntaxError(fmt.Sprintf(format, a...)) } // Returns an python error for the current yyLex func (x *yyLex) ErrorReturn() error { if x.error { - return py.ExceptionNewf(py.SyntaxError, "Syntax Error: %s", x.errorString) + if x.errorString == "" { + x.errorString = "invalid syntax" + } + return py.ExceptionNewf(py.SyntaxError, "%s", x.errorString) } return nil } diff --git a/parser/lexer_test.go b/parser/lexer_test.go index 022ffa22..428f452f 100644 --- a/parser/lexer_test.go +++ b/parser/lexer_test.go @@ -233,6 +233,31 @@ func TestLex(t *testing.T) { {DEDENT, nil}, {ENDMARKER, nil}, }}, + {"1", "", "eval", LexTokens{ + {EVAL_INPUT, nil}, + {NUMBER, py.Int(1)}, + {ENDMARKER, nil}, + }}, + {"01", "illegal decimal with leading zero", "eval", LexTokens{ + {EVAL_INPUT, nil}, + }}, + {"1", "", "exec", LexTokens{ + {FILE_INPUT, nil}, + {NUMBER, py.Int(1)}, + {NEWLINE, nil}, + {ENDMARKER, nil}, + }}, + {"1 2 3", "", "exec", LexTokens{ + {FILE_INPUT, nil}, + {NUMBER, py.Int(1)}, + {NUMBER, py.Int(2)}, + {NUMBER, py.Int(3)}, + {NEWLINE, nil}, + {ENDMARKER, nil}, + }}, + {"01", "illegal decimal with leading zero", "exec", LexTokens{ + {FILE_INPUT, nil}, + }}, {"1\n 2\n 3\n4\n", "", "exec", LexTokens{ {FILE_INPUT, nil}, {NUMBER, py.Int(1)}, @@ -343,7 +368,7 @@ func TestLex(t *testing.T) { errString = err.Error() } if test.errString != "" { - test.errString = "SyntaxError: [Syntax Error: " + test.errString + "]" + test.errString = "SyntaxError: [" + test.errString + "]" } if errString != test.errString || !lts.Eq(test.lts) { t.Errorf("Lex(%q) expecting (%v, %q) got (%v, %q)", test.in, test.lts, test.errString, lts, errString) diff --git a/parser/make_grammar_test.py b/parser/make_grammar_test.py index b3a04725..cac9a872 100755 --- a/parser/make_grammar_test.py +++ b/parser/make_grammar_test.py @@ -24,6 +24,9 @@ ("b'abc'", "eval"), ("b'abc' b'''123'''", "eval"), ("1234", "eval"), + ("01234", "eval", SyntaxError, "illegal decimal with leading zero"), + ("1234d", "eval", SyntaxError, "invalid syntax"), + ("1234d", "exec", SyntaxError), ("0x1234", "eval"), ("12.34", "eval"), ("1,", "eval"), @@ -359,6 +362,7 @@ # Assign ("a = b", "exec"), + ("a = 007", "exec", SyntaxError, "illegal decimal with leading zero"), ("a = b = c", "exec"), ("a, b = 1, 2", "exec"), ("a, b = c, d = 1, 2", "exec"), @@ -466,13 +470,37 @@ def main(): package parser +import ( +"github.com/ncw/gpython/py" +) + var grammarTestData = []struct { in string mode string out string +exceptionType *py.Type +errString string }{"""] - for source, mode in inp: - out.append('{"%s", "%s", "%s"},' % (escape(source), mode, escape(dump(source, mode)))) + for x in inp: + source, mode = x[:2] + if len(x) > 2: + exc = x[2] + errString = (x[3] if len(x) > 3 else "") + try: + dump(source, mode) + except exc as e: + error = e.msg + else: + raise ValueError("Expecting exception %s" % exc) + if errString != "": + error = errString # override error string + dmp = "" + exc_name = "py.%s" % exc.__name__ + else: + dmp = dump(source, mode) + exc_name = "nil" + error = "" + out.append('{"%s", "%s", "%s", %s, "%s"},' % (escape(source), mode, escape(dmp), exc_name, escape(error))) out.append("}") print("Writing %s" % path) with open(path, "w") as f: diff --git a/parser/y.go b/parser/y.go index 82a0b8bf..2d9ccc03 100644 --- a/parser/y.go +++ b/parser/y.go @@ -2063,7 +2063,7 @@ yydefault: //line grammar.y:1336 { // panic("FIXME no coverage") - yylex.Error("Invalid syntax") + yylex.(*yyLex).SyntaxError("Invalid syntax") } case 209: //line grammar.y:1341 @@ -2234,14 +2234,14 @@ yydefault: case py.String: yyVAL.obj = a + b default: - yylex.Error("SyntaxError: cannot mix string and nonstring literals") + yylex.(*yyLex).SyntaxError("cannot mix string and nonstring literals") } case py.Bytes: switch b := yyS[yypt-0].obj.(type) { case py.Bytes: yyVAL.obj = append(a, b...) default: - yylex.Error("SyntaxError: cannot mix bytes and nonbytes literals") + yylex.(*yyLex).SyntaxError("cannot mix bytes and nonbytes literals") } } } @@ -2582,7 +2582,7 @@ yydefault: call := yyS[yypt-3].call call.Starargs = yyS[yypt-1].expr if len(yyS[yypt-0].call.Args) != 0 { - yylex.Error("SyntaxError: only named arguments may follow *expression") + yylex.(*yyLex).SyntaxError("only named arguments may follow *expression") } call.Keywords = append(call.Keywords, yyS[yypt-0].call.Keywords...) yyVAL.call = call @@ -2594,7 +2594,7 @@ yydefault: call.Starargs = yyS[yypt-4].expr call.Kwargs = yyS[yypt-0].expr if len(yyS[yypt-3].call.Args) != 0 { - yylex.Error("SyntaxError: only named arguments may follow *expression") + yylex.(*yyLex).SyntaxError("only named arguments may follow *expression") } call.Keywords = append(call.Keywords, yyS[yypt-3].call.Keywords...) yyVAL.call = call @@ -2628,7 +2628,7 @@ yydefault: if name, ok := test.(*ast.Name); ok { yyVAL.call.Keywords = []*ast.Keyword{&ast.Keyword{Pos: name.Pos, Arg: name.Id, Value: yyS[yypt-0].expr}} } else { - yylex.Error("SyntaxError: keyword can't be an expression") + yylex.(*yyLex).SyntaxError("keyword can't be an expression") } } case 303: