# standalone assignment expression x = 3; ==> Program( ExpressionStatement(AssignmentExpression( Identifier, AssignOp, IntegerLiteral))) # standalone binary expression a > b; a < b; a == b; a >= b; a <= b; a != b; a && b; a || b; a & b; a | b; a ^ b; a % b; a << b; a >> b; a >>> b; 3 + 2; 3 - 2; 3 * 2; 9 / 3; ==> Program( ExpressionStatement(BinaryExpression(Identifier, CompareOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, CompareOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, CompareOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, CompareOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, CompareOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, CompareOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, LogicOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, LogicOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, BitOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, BitOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, BitOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, ArithOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, BitOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, BitOp, Identifier)), ExpressionStatement(BinaryExpression(Identifier, BitOp, Identifier)), ExpressionStatement(BinaryExpression(IntegerLiteral, ArithOp, IntegerLiteral)), ExpressionStatement(BinaryExpression(IntegerLiteral, ArithOp, IntegerLiteral)), ExpressionStatement(BinaryExpression(IntegerLiteral, ArithOp, IntegerLiteral)), ExpressionStatement(BinaryExpression(IntegerLiteral, ArithOp, IntegerLiteral))) # instanceof expressions a instanceof C.D; a instanceof List; c instanceof C[]; ==> Program( ExpressionStatement(InstanceofExpression( Identifier, instanceof, ScopedTypeName(TypeName, TypeName))), ExpressionStatement(InstanceofExpression( Identifier, instanceof, GenericType(TypeName, TypeArguments(TypeName)))), ExpressionStatement(InstanceofExpression( Identifier, instanceof, ArrayType(TypeName, Dimension)))) # if statements if (x) y; ==> Program( IfStatement(if, ParenthesizedExpression(Identifier), ExpressionStatement(Identifier))) # if statements with braces if (x) { y; } ==> Program( IfStatement(if, ParenthesizedExpression(Identifier), Block(ExpressionStatement(Identifier)))) # if statements with assignment without braces if (x = 3) y = 2; ==> Program( IfStatement(if, ParenthesizedExpression( AssignmentExpression( Identifier, AssignOp, IntegerLiteral)), ExpressionStatement( AssignmentExpression( Identifier, AssignOp, IntegerLiteral)))) # if then else statement if (x = 3) { y = 9; } else { y = 0; } ==> Program( IfStatement(if, ParenthesizedExpression( AssignmentExpression( Identifier, AssignOp, IntegerLiteral)), Block( ExpressionStatement(AssignmentExpression( Identifier, AssignOp, IntegerLiteral))), else, Block( ExpressionStatement(AssignmentExpression( Identifier, AssignOp, IntegerLiteral))))) # nested if then else statements if (a) if (b) c(); else d(); ==> Program( IfStatement(if, ParenthesizedExpression(Identifier), IfStatement(if, ParenthesizedExpression(Identifier), ExpressionStatement(MethodInvocation(MethodName(Identifier), ArgumentList)), else, ExpressionStatement(MethodInvocation(MethodName(Identifier), ArgumentList))))) # ternary expressions max = (a > b) ? a : b; ==> Program( ExpressionStatement(AssignmentExpression( Identifier, AssignOp, TernaryExpression( ParenthesizedExpression(BinaryExpression( Identifier, CompareOp, Identifier)), LogicOp, Identifier, Identifier)))) # for statement for(int i = 1; i < 11; i++) { System.out.println("Count is: " + i); } for (j.init(i); j.check(); j.update()) { System.out.println(j); } ==> Program( ForStatement(for, ForSpec( LocalVariableDeclaration( PrimitiveType, VariableDeclarator( Definition, AssignOp, IntegerLiteral)), BinaryExpression( Identifier, CompareOp, IntegerLiteral), UpdateExpression(Identifier, UpdateOp,)), Block( ExpressionStatement(MethodInvocation( FieldAccess( Identifier, Identifier), MethodName(Identifier), ArgumentList(BinaryExpression( StringLiteral, ArithOp, Identifier)))))), ForStatement(for, ForSpec( MethodInvocation( Identifier, MethodName(Identifier), ArgumentList(Identifier)), MethodInvocation( Identifier, MethodName(Identifier), ArgumentList), MethodInvocation( Identifier, MethodName(Identifier), ArgumentList)), Block( ExpressionStatement(MethodInvocation( FieldAccess( Identifier, Identifier), MethodName(Identifier), ArgumentList(Identifier)))))) # Enhanced for statements for (A b : c) { d(b); } ==> Program( EnhancedForStatement(for, ForSpec( TypeName, Definition, Identifier), Block( ExpressionStatement(MethodInvocation( MethodName(Identifier), ArgumentList(Identifier)))))) # while statement class WhileDemo { public static void main(String[] args){ int count = 1; while (count < 11) { System.out.println("Count is: " + count); count++; } } } ==> Program( ClassDeclaration(class, Definition, ClassBody( MethodDeclaration( Modifiers(public, static), void, Definition, FormalParameters( FormalParameter( ArrayType( TypeName, Dimension), Definition)), Block( LocalVariableDeclaration( PrimitiveType, VariableDeclarator( Definition, AssignOp, IntegerLiteral)), WhileStatement(while, ParenthesizedExpression( BinaryExpression( Identifier, CompareOp, IntegerLiteral)), Block( ExpressionStatement(MethodInvocation( FieldAccess( Identifier, Identifier), MethodName(Identifier), ArgumentList( BinaryExpression(StringLiteral, ArithOp, Identifier)))), ExpressionStatement(UpdateExpression(Identifier, UpdateOp))))))))) # try-with-resources statements try (FileInputStream input = new FileInputStream("file.txt")) { int data = input.read(); } ==> Program( TryWithResourcesStatement(try, ResourceSpecification( Resource( TypeName, Definition, AssignOp, ObjectCreationExpression(new, TypeName, ArgumentList(StringLiteral)))), Block( LocalVariableDeclaration( PrimitiveType, VariableDeclarator( Definition, AssignOp, MethodInvocation( Identifier, MethodName(Identifier), ArgumentList)))))) # return statement return x; return x * y; return x + 2; return fire(x); ==> Program( ReturnStatement(return,Identifier), ReturnStatement(return,BinaryExpression(Identifier, ArithOp, Identifier)), ReturnStatement(return,BinaryExpression(Identifier, ArithOp, IntegerLiteral)), ReturnStatement(return,MethodInvocation(MethodName(Identifier), ArgumentList(Identifier)))) # annotation @SuppressWarnings(value = "unchecked") @GwtCompatible(emulated = true) class Duck { } ==> Program( ClassDeclaration( Modifiers( Annotation( Identifier, AnnotationArgumentList( ElementValuePair( Identifier, AssignOp, StringLiteral))), Annotation( Identifier, AnnotationArgumentList( ElementValuePair( Identifier, AssignOp, BooleanLiteral)))), class, Definition, ClassBody)) # marker annotation @Override class Quack { @bar public void foo() { } } ==> Program( ClassDeclaration( Modifiers(MarkerAnnotation(Identifier)), class, Definition, ClassBody( MethodDeclaration( Modifiers(MarkerAnnotation(Identifier), public), void, Definition, FormalParameters, Block)))) # single element annotation @Duck(waddle.swim) @SuppressWarnings("unchecked") class Quack { } ==> Program( ClassDeclaration( Modifiers( Annotation(Identifier, AnnotationArgumentList(FieldAccess(Identifier, Identifier))), Annotation(Identifier, AnnotationArgumentList(StringLiteral))), class, Definition, ClassBody)) # lambda expression class LambdaTest { void singleton() { version -> create; (a, b) -> a + b; } } ==> Program( ClassDeclaration(class, Definition, ClassBody( MethodDeclaration( void, Definition, FormalParameters, Block( ExpressionStatement(LambdaExpression( Definition, Identifier)), ExpressionStatement(LambdaExpression( InferredParameters(Definition, Definition), BinaryExpression(Identifier, ArithOp, Identifier)))))))) # switch statement public class SwitchDemo { public static void main(String[] args) { int destinysChild = 2; String destinysChildString; switch (destinysChild) { case 1: destinysChildString = "Beyonce"; break; case 2: destinysChildString = "Kelly"; break; case 3: destinysChildString = "Michelle"; break; default: destinysChildString = "Invalid"; break; } System.out.println(destinysChildString); } } ==> Program( ClassDeclaration( Modifiers(public), class, Definition, ClassBody( MethodDeclaration( Modifiers(public, static), void, Definition, FormalParameters( FormalParameter( ArrayType( TypeName, Dimension), Definition)), Block( LocalVariableDeclaration( PrimitiveType, VariableDeclarator( Definition, AssignOp, IntegerLiteral)), LocalVariableDeclaration( TypeName, VariableDeclarator(Definition)), SwitchStatement(switch, ParenthesizedExpression(Identifier), SwitchBlock( SwitchLabel(case,IntegerLiteral), ExpressionStatement(AssignmentExpression( Identifier, AssignOp, StringLiteral)), BreakStatement(break), SwitchLabel(case,IntegerLiteral), ExpressionStatement(AssignmentExpression( Identifier, AssignOp, StringLiteral)), BreakStatement(break), SwitchLabel(case,IntegerLiteral), ExpressionStatement(AssignmentExpression( Identifier, AssignOp, StringLiteral)), BreakStatement(break), SwitchLabel(default), ExpressionStatement(AssignmentExpression( Identifier, AssignOp, StringLiteral)), BreakStatement(break))), ExpressionStatement(MethodInvocation( FieldAccess( Identifier, Identifier), MethodName(Identifier), ArgumentList(Identifier)))))))) # type arguments class Box { private T theObject; public Box( T arg) { theObject = arg; } // more code } ==> Program( ClassDeclaration(class, Definition, TypeParameters( TypeParameter( Definition)), ClassBody( FieldDeclaration( Modifiers(private), TypeName, VariableDeclarator(Definition)), ConstructorDeclaration( Modifiers(public), Definition, FormalParameters( FormalParameter( TypeName, Definition)), ConstructorBody( ExpressionStatement(AssignmentExpression( Identifier, AssignOp, Identifier)))), LineComment))) # wildcard class WildcardDemo { List a; } ==> Program( ClassDeclaration(class, Definition, ClassBody( FieldDeclaration( GenericType( TypeName, TypeArguments( Wildcard(extends, TypeName))), VariableDeclarator(Definition))))) # type arguments with generic types class someClass { public List someMethod() { List< T > list = Collections.< T >emptyList(); return list; } public static void anotherMethod(S arg) { List< S > list = Collections.< S >emptyList(); } } ==> Program( ClassDeclaration(class, Definition, TypeParameters( TypeParameter( Definition)), ClassBody( MethodDeclaration( Modifiers(public), GenericType( TypeName, TypeArguments(TypeName)), Definition, FormalParameters, Block( LocalVariableDeclaration( GenericType( TypeName, TypeArguments(TypeName)), VariableDeclarator( Definition, AssignOp, MethodInvocation( Identifier, TypeArguments(TypeName), MethodName(Identifier), ArgumentList))), ReturnStatement(return,Identifier))), MethodDeclaration( Modifiers(public, static), TypeParameters( TypeParameter( Definition)), void, Definition, FormalParameters( FormalParameter( TypeName, Definition)), Block( LocalVariableDeclaration( GenericType( TypeName, TypeArguments(TypeName)), VariableDeclarator( Definition, AssignOp, MethodInvocation( Identifier, TypeArguments(TypeName), MethodName(Identifier), ArgumentList)))))))) # empty type arguments Box integerBox = new Box<>(); ==> Program( LocalVariableDeclaration( GenericType(TypeName, TypeArguments(TypeName)), VariableDeclarator( Definition, AssignOp, ObjectCreationExpression(new, GenericType(TypeName, TypeArguments), ArgumentList)))) # method references action = bar::method; foo.bar::method; String[]::new; Foo::apply; super::something; ==> Program( ExpressionStatement(AssignmentExpression(Identifier, AssignOp, MethodReference(Identifier, Identifier))), ExpressionStatement(MethodReference(FieldAccess(Identifier, Identifier), Identifier)), ExpressionStatement(MethodReference(ArrayType(TypeName, Dimension), new)), ExpressionStatement(MethodReference(GenericType(TypeName, TypeArguments(TypeName)), Identifier)), ExpressionStatement(MethodReference(super, Identifier))) # text block x = """ hello multi-""-line foo"""; ==> Program(ExpressionStatement(AssignmentExpression(Identifier,AssignOp,TextBlock))) # precedence x = 1 < 2 || a & b ^ c * 2 && 1 + d | e; ==> Program(ExpressionStatement(AssignmentExpression(Identifier,AssignOp, BinaryExpression( BinaryExpression(IntegerLiteral,CompareOp,IntegerLiteral), LogicOp, BinaryExpression( BinaryExpression( BinaryExpression(Identifier,BitOp,Identifier), BitOp, BinaryExpression(Identifier,ArithOp,IntegerLiteral)), LogicOp, BinaryExpression( BinaryExpression(IntegerLiteral,ArithOp,Identifier), BitOp, Identifier))))))