# Function definition def foo(): pass def bar(a: str, b = 22, **c) -> num: pass ==> Script( FunctionDefinition(def,VariableName,ParamList,Body(PassStatement(pass))), FunctionDefinition(def,VariableName,ParamList(VariableName, TypeDef(VariableName), VariableName, AssignOp, Number, VariableName), TypeDef(VariableName), Body(PassStatement(pass)))) # Single-line function definition def foo(a, b): return a + b ==> Script(FunctionDefinition(def,VariableName,ParamList(VariableName, VariableName), Body(ReturnStatement(return, BinaryExpression(VariableName, ArithOp, VariableName))))) # Return with no body def foo(a, b): a = b return ==> Script(FunctionDefinition(def,VariableName,ParamList(VariableName, VariableName), Body(AssignStatement(VariableName, AssignOp, VariableName), ReturnStatement(return)))) # Conditional if a: b() if 1 + 3: pass elif 55 < 2: pass else: pass ==> Script( IfStatement(if, VariableName, Body(ExpressionStatement(CallExpression(VariableName, ArgList)))) IfStatement(if, BinaryExpression(Number, ArithOp, Number), Body(PassStatement(pass)), elif, BinaryExpression(Number, CompareOp, Number), Body(PassStatement(pass)), else, Body(PassStatement(pass)))) # Assignment a = 4 b: str = "hi" c, d, e = None f = g = False h += 1 ==> Script( AssignStatement(VariableName, AssignOp, Number), AssignStatement(VariableName, TypeDef(VariableName), AssignOp, String), AssignStatement(VariableName, VariableName, VariableName, AssignOp, None), AssignStatement(VariableName, AssignOp, VariableName, AssignOp, Boolean), UpdateStatement(VariableName, UpdateOp, Number)) # For loops for a, b in woop(): doStuff(b, a) ==> Script(ForStatement(for, VariableName, VariableName, in CallExpression(VariableName, ArgList), Body(ExpressionStatement(CallExpression(VariableName, ArgList(VariableName, VariableName)))))) # Try statements try: pass except SomeException as e: pass except OtherException: pass else: pass finally: pass ==> Script(TryStatement( try, Body(PassStatement(pass)), except, VariableName, as, VariableName, Body(PassStatement(pass)), except VariableName, Body(PassStatement(pass)), else Body(PassStatement(pass)), finally Body(PassStatement(pass)))) # With statements with open("x") as file: pass async with foo as bar: pass ==> Script( WithStatement(with, CallExpression(VariableName, ArgList(String)), as, VariableName, Body(PassStatement(pass))), WithStatement(async, with, VariableName, as, VariableName, Body(PassStatement(pass)))) # Class definition class Foo: prop = 0 def __init__(self): pass def plus(self): self.prop += 1 class Bar(Foo): pass ==> Script( ClassDefinition(class, VariableName, Body( AssignStatement(VariableName, AssignOp, Number), FunctionDefinition(def, VariableName, ParamList(VariableName), Body(PassStatement(pass))), FunctionDefinition(def, VariableName, ParamList(VariableName), Body( UpdateStatement(MemberExpression(VariableName, PropertyName), UpdateOp, Number))))), ClassDefinition(class, VariableName, ArgList(VariableName), Body(PassStatement(pass)))) # Scope statements global a nonlocal b, c ==> Script( ScopeStatement(global, VariableName), ScopeStatement(nonlocal, VariableName, VariableName)) # Decorators @Something.X def f(): pass @Other(arg1, arg2) class C: pass ==> Script( DecoratedStatement(Decorator(At, VariableName, VariableName), FunctionDefinition(def, VariableName, ParamList, Body(PassStatement(pass)))), DecoratedStatement(Decorator(At, VariableName, ArgList(VariableName, VariableName)), ClassDefinition(class, VariableName, Body(PassStatement(pass))))) # Small statements def x(): return 5 raise Exception("woop") while False: break continue assert 1 == 2 del x[2] ==> Script( FunctionDefinition(def, VariableName, ParamList, Body(ReturnStatement(return, Number))), RaiseStatement(raise, CallExpression(VariableName, ArgList(String))), WhileStatement(while, Boolean, Body(BreakStatement(break), ContinueStatement(continue))), AssertStatement(assert, BinaryExpression(Number, CompareOp, Number)), DeleteStatement(del, MemberExpression(VariableName, Number))) # Import statements import datetime from something.other import one, two ==> Script( ImportStatement(import, VariableName), ImportStatement(from, VariableName, VariableName, import VariableName, VariableName)) # One-line small statements x; y(); z = 2 raise "oh" ==> Script( StatementGroup( ExpressionStatement(VariableName), ExpressionStatement(CallExpression(VariableName, ArgList)), AssignStatement(VariableName, AssignOp, Number)), RaiseStatement(raise, String)) # Nested bodies def x(): ok if not ok: while True: one two three if None: four else: five six seven ==> Script( FunctionDefinition(def, VariableName, ParamList, Body( ExpressionStatement(VariableName), IfStatement(if, UnaryExpression(not, VariableName), Body( WhileStatement(while, Boolean, Body( ExpressionStatement(VariableName), ExpressionStatement(VariableName))))), ExpressionStatement(VariableName), IfStatement(if, None, Body( ExpressionStatement(VariableName) ), else, Body( ExpressionStatement(VariableName))), ExpressionStatement(VariableName))), ExpressionStatement(VariableName)) # Empty and commented lines if None: one two four # comment five six ==> Script( IfStatement(if, None, Body( ExpressionStatement(VariableName), ExpressionStatement(VariableName), ExpressionStatement(VariableName), Comment, ExpressionStatement(VariableName))), ExpressionStatement(VariableName)) # Escaped newlines x = 1 + \ 2 ==> Script(AssignStatement(VariableName, AssignOp, BinaryExpression(Number, ArithOp, Number))) # Python 2 compatibility print "hi" print(print.something) try: raise Exception, "foo" except Exception, foo: pass ==> Script( PrintStatement(print, String), ExpressionStatement(CallExpression(VariableName, ArgList(MemberExpression(VariableName, PropertyName)))), TryStatement(try, Body(RaiseStatement(raise, VariableName, String)), except, VariableName, VariableName, Body(PassStatement(pass)))) # Require indentation on body def foo(): pass ==> Script(FunctionDefinition(def,VariableName,ParamList,Body(⚠)), PassStatement(pass)) # Nested else if a: if b: pass else: pass ==> Script(IfStatement(if, VariableName, Body( IfStatement(if, VariableName, Body(PassStatement(pass)))), else, Body(PassStatement(pass)))) # Self not reserved self = True ==> Script(AssignStatement(VariableName,AssignOp,Boolean)) # Trailing whitespace in block def x(): one two ==> Script(FunctionDefinition(def,VariableName,ParamList,Body(ExpressionStatement(VariableName),ExpressionStatement(VariableName)))) # Can handle tab indentation class Employee: first_name: str last_name: str def __init__(self, a): self.first_name = a self.last_name = a ==> Script(ClassDefinition(class,VariableName,Body( AssignStatement(VariableName,TypeDef(VariableName)), AssignStatement(VariableName,TypeDef(VariableName)), FunctionDefinition(def,VariableName,ParamList(VariableName,VariableName),Body( AssignStatement(MemberExpression(VariableName,PropertyName),AssignOp,VariableName), AssignStatement(MemberExpression(VariableName,PropertyName),AssignOp,VariableName)))))) # Parses match statements match foo: case 1: pass case Point("a", True) as z | a.b | {x: None, **y}: pass case [a, b, *rest] | (p, q): pass ==> Script(MatchStatement(match,VariableName,MatchBody( MatchClause(case, LiteralPattern(Number), Body(PassStatement(pass))), MatchClause(case, OrPattern( AsPattern( ClassPattern(VariableName,PatternArgList(LiteralPattern(String),LiteralPattern(Boolean))), as,VariableName), LogicOp, AttributePattern(VariableName,PropertyName), LogicOp, MappingPattern(VariableName,LiteralPattern(None),CapturePattern(VariableName))), Body(PassStatement(pass))), MatchClause(case, OrPattern(SequencePattern( CapturePattern(VariableName), CapturePattern(VariableName), StarPattern(CapturePattern(VariableName))), LogicOp, SequencePattern(CapturePattern(VariableName),CapturePattern(VariableName))), Body(PassStatement(pass)))))) # Type Params class ClassA[T: str]: def method1(self) -> T: pass def func[**T](a: T, b: T) -> T: pass ==> Script( ClassDefinition(class,VariableName, TypeParamList(TypeParam(VariableName,TypeDef(":",VariableName))), Body(FunctionDefinition(def,VariableName,ParamList(VariableName),TypeDef(VariableName), Body(PassStatement(pass))))), FunctionDefinition(def,VariableName,TypeParamList(TypeParam(VariableName)), ParamList(VariableName,TypeDef(VariableName),VariableName,TypeDef(VariableName)), TypeDef(VariableName), Body(PassStatement(pass)))) # Type Definition type Point = tuple[float, float] ==> Script(TypeDefinition(type,VariableName,MemberExpression(VariableName,VariableName,",",VariableName)))