# Operator precedence a + b * c - d**3 a or b > 2 and c or d == None a + b | c & d ==> Script( ExpressionStatement(BinaryExpression(BinaryExpression(VariableName, ArithOp, BinaryExpression(VariableName, ArithOp, VariableName)), ArithOp, BinaryExpression(VariableName, ArithOp, Number))), ExpressionStatement(BinaryExpression(BinaryExpression(VariableName, or, BinaryExpression(BinaryExpression(VariableName, CompareOp, Number), and, VariableName)), or, BinaryExpression(VariableName, CompareOp, None))), ExpressionStatement(BinaryExpression(BinaryExpression(VariableName, ArithOp, VariableName), BitOp, BinaryExpression(VariableName, BitOp, VariableName)))) # Strings 'foo' "bar" b'baz' '''long string on two lines''' """also with double quotes""" ==> Script(ExpressionStatement(ContinuedString(String, String)), ExpressionStatement(String), ExpressionStatement(String), ExpressionStatement(String)) # Bracketed continued string print('00300:' '03630:') ==> Script(ExpressionStatement(CallExpression(VariableName, ArgList(ContinuedString(String, String))))) # Format strings f'hello{22} abc\' {{ }} {d-1}' f"double\" {quoted !s}" f"""big long format {string :foo}""" f'''well {{ \x }} {2 :{bar}}''' f"""one"{two}"three""" f'{user=!s} {delta.days=:,d}' ==> Script(ExpressionStatement(FormatString(FormatReplacement(Number),Escape, FormatReplacement(BinaryExpression(VariableName, ArithOp, Number)))), ExpressionStatement(FormatString(Escape,FormatReplacement(VariableName, FormatConversion))), ExpressionStatement(FormatString(FormatReplacement(VariableName, FormatSpec))), ExpressionStatement(FormatString(Escape,FormatReplacement(Number, FormatSpec(FormatReplacement(VariableName))))), ExpressionStatement(FormatString(FormatReplacement(VariableName))), ExpressionStatement(FormatString( FormatReplacement(VariableName,FormatSelfDoc,FormatConversion), FormatReplacement(MemberExpression(VariableName,PropertyName),FormatSelfDoc,FormatSpec)))) # Nested quote types f"a{'b'}c" ==> Script(ExpressionStatement(FormatString(FormatReplacement(String)))) # Lambda something.map(lambda x: x + 1) foo = lambda a, b = 0: a ^ b ==> Script( ExpressionStatement(CallExpression(MemberExpression(VariableName, PropertyName), ArgList( LambdaExpression(lambda, ParamList(VariableName), BinaryExpression(VariableName, ArithOp, Number))))), AssignStatement(VariableName, AssignOp, LambdaExpression(lambda, ParamList(VariableName, VariableName, AssignOp, Number), BinaryExpression(VariableName, BitOp, VariableName)))) # Member expressions x[1] x.foo x.if.True ==> Script( ExpressionStatement(MemberExpression(VariableName, Number)), ExpressionStatement(MemberExpression(VariableName, PropertyName)), ExpressionStatement(MemberExpression(MemberExpression(VariableName, PropertyName), PropertyName))) # Call expressions foo(x, y, **z) + bar(blah=20) ==> Script(ExpressionStatement(BinaryExpression( CallExpression(VariableName, ArgList(VariableName, VariableName, VariableName)), ArithOp, CallExpression(VariableName, ArgList(VariableName, AssignOp, Number))))) # Collection expressions [True, False, None] {foo: 22, bar: False, **other} {1, 2, 3} (3) (3,) (3, 4) ==> Script( ExpressionStatement(ArrayExpression(Boolean, Boolean, None)), ExpressionStatement(DictionaryExpression(VariableName, Number, VariableName, Boolean, VariableName)), ExpressionStatement(SetExpression(Number, Number, Number)), ExpressionStatement(ParenthesizedExpression(Number)), ExpressionStatement(TupleExpression(Number)), ExpressionStatement(TupleExpression(Number, Number))) # Comprehension expressions [i + 1 for i in range(1, 10) if x % 2 == 0] (x for x in [3, 4]) {key: value for (key, value) in blah} {a - b for a in foo for b in bar} ==> Script( ExpressionStatement(ArrayComprehensionExpression( BinaryExpression(VariableName, ArithOp, Number), for VariableName in CallExpression(VariableName, ArgList(Number, Number)), if BinaryExpression(BinaryExpression(VariableName, ArithOp, Number), CompareOp, Number))), ExpressionStatement(ComprehensionExpression( VariableName, for, VariableName, in, ArrayExpression(Number, Number))), ExpressionStatement(DictionaryComprehensionExpression( VariableName, VariableName, for, TupleExpression(VariableName, VariableName) in VariableName)), ExpressionStatement(SetComprehensionExpression( BinaryExpression(VariableName, ArithOp, VariableName), for, VariableName, in, VariableName, for, VariableName, in, VariableName))) # Yield expressions def foo(): yield 1 return 1 + (yield 2) ==> Script(FunctionDefinition(def, VariableName, ParamList, Body( YieldStatement(yield, Number), ReturnStatement(return, BinaryExpression(Number, ArithOp, ParenthesizedExpression(YieldExpression(yield, Number))))))) # Unary expressions [-1, +2 * 3, ~2**2] ==> Script(ExpressionStatement(ArrayExpression( UnaryExpression(ArithOp, Number), BinaryExpression(UnaryExpression(ArithOp, Number), ArithOp, Number), UnaryExpression(BitOp, BinaryExpression(Number, ArithOp, Number))))) # Await await something() ==> Script(ExpressionStatement(AwaitExpression(await, CallExpression(VariableName, ArgList)))) # Newlines in brackets x = [ 1, 2, # And 3, 4, ] ==> Script(AssignStatement(VariableName, AssignOp, ArrayExpression(Number, Number, Comment, Number, Number))) # Too many commas in brackets x = [ 1, 2,, ] ==> Script(AssignStatement(VariableName, AssignOp, ArrayExpression(Number, Number, ⚠))) # Conditional expression x = 5 if True else 1 if False else 0 ==> Script(AssignStatement(VariableName, AssignOp, ConditionalExpression(Number, if, Boolean, else, ConditionalExpression(Number, if, Boolean, else, Number)))) # Exponent is R-to-L associative 2 ** 3 ** 2 ==> Script(ExpressionStatement(BinaryExpression( Number,ArithOp("**"), BinaryExpression(Number,ArithOp("**"),Number))))