Program ::= CompilationUnit*; // 7.3 Compilation Units CompilationUnit ::= ImportDecl* TypeDecl*; // 7.5 Import Declarations abstract ImportDecl ::= Access; SingleTypeImportDecl : ImportDecl; TypeImportOnDemandDecl : ImportDecl; abstract Access : Expr; AbstractDot : Access ::= Left:Expr Right:Access; Dot : AbstractDot; VarAccess : Access ::= ; MethodAccess : Access ::= Arg:Expr*; ConstructorAccess : Access ::= Arg:Expr*; SuperConstructorAccess : ConstructorAccess; TypeAccess : Access ::= ; PrimitiveTypeAccess : TypeAccess ::= // // ; ArrayTypeAccess : TypeAccess ::= // // Access; ArrayTypeWithSizeAccess : ArrayTypeAccess ::= Expr; ThisAccess : Access ::= ; SuperAccess : Access ::= ; PackageAccess : Access ::= ; ArrayAccess : Access ::= Expr; ParseName : Access ::= ; PackageOrTypeAccess : Access ::= ; AmbiguousAccess : Access ::= ; ClassInstanceExpr : Access ::= Access Arg:Expr* [TypeDecl]; ClassAccess : Access ::= ; abstract TypeDecl ::= Modifiers BodyDecl*; // 4.1 The Kinds of Types and Values abstract ReferenceType : TypeDecl; PrimitiveType : TypeDecl ::= Modifiers [SuperClassAccess:Access] BodyDecl*; EmptyType : PrimitiveType; // placeholder for ; in compilation unit NullType : TypeDecl; VoidType : TypeDecl; UnknownType : ClassDecl; // 4.2 Primitive Types and Values abstract NumericType : PrimitiveType; BooleanType : PrimitiveType; abstract IntegralType : NumericType; ByteType : IntegralType; ShortType : IntegralType; IntType : IntegralType; LongType : IntegralType; CharType : IntegralType; FloatingPointType : NumericType; FloatType : FloatingPointType; DoubleType : FloatingPointType; // 4.3 Reference Types and Values ClassDecl : ReferenceType ::= Modifiers [SuperClassAccess:Access] Implements:Access* BodyDecl*; InterfaceDecl : ReferenceType ::= Modifiers SuperInterfaceId:Access* BodyDecl*; ArrayDecl : ClassDecl; AnonymousDecl : ClassDecl ::= Modifiers /[SuperClassAccess:Access]/ /Implements:Access*/ BodyDecl*; abstract BodyDecl; InstanceInitializer : BodyDecl ::= Block; StaticInitializer : BodyDecl ::= Block; ConstructorDecl : BodyDecl ::= Modifiers Parameter:ParameterDeclaration* Exception:Access* [ConstructorInvocation:Stmt] Block; abstract MemberDecl : BodyDecl; FieldDecl : MemberDecl ::= Modifiers TypeAccess:Access VariableDecl*; FieldDeclaration : MemberDecl ::= Modifiers TypeAccess:Access [Init:Expr]; // Simplified FieldDecl VarDeclStmt : Stmt ::= Modifiers TypeAccess:Access VariableDecl*; VariableDeclaration : Stmt ::= Modifiers TypeAccess:Access [Init:Expr]; // Simplified VarDeclStmt VariableDecl ::= Dims* [Init:Expr]; ParameterDeclaration ::= Modifiers TypeAccess:Access ; ArrayInit : Expr ::= Init:Expr*; MethodDecl : MemberDecl ::= Modifiers TypeAccess:Access Parameter:ParameterDeclaration* Exception:Access* [Block]; // 8.5 Member Type Declarations abstract MemberTypeDecl : MemberDecl; MemberClassDecl : MemberTypeDecl ::= ClassDecl; MemberInterfaceDecl : MemberTypeDecl ::= InterfaceDecl; IdUse ::= ; abstract Expr; abstract AssignExpr : Expr ::= Dest:Expr Source:Expr; AssignSimpleExpr : AssignExpr ; abstract AssignMultiplicativeExpr : AssignExpr; AssignMulExpr : AssignMultiplicativeExpr ; AssignDivExpr : AssignMultiplicativeExpr ; AssignModExpr : AssignMultiplicativeExpr ; abstract AssignAdditiveExpr : AssignExpr; AssignPlusExpr : AssignAdditiveExpr ; AssignMinusExpr : AssignAdditiveExpr ; abstract AssignShiftExpr : AssignExpr; AssignLShiftExpr : AssignShiftExpr ; AssignRShiftExpr : AssignShiftExpr ; AssignURShiftExpr : AssignShiftExpr ; abstract AssignBitwiseExpr : AssignExpr; AssignAndExpr : AssignBitwiseExpr ; AssignXorExpr : AssignBitwiseExpr ; AssignOrExpr : AssignBitwiseExpr ; abstract PrimaryExpr : Expr; abstract Literal : PrimaryExpr ::= ; IntegerLiteral : Literal ; LongLiteral : Literal ; FloatingPointLiteral : Literal ; DoubleLiteral : Literal ; BooleanLiteral : Literal ; CharacterLiteral : Literal ; StringLiteral : Literal ; NullLiteral : Literal ; ParExpr : PrimaryExpr ::= Expr; ArrayCreationExpr : PrimaryExpr ::= TypeAccess:Access [ArrayInit]; Dims ::= [Expr]; abstract Unary : Expr ::= Operand:Expr; PreIncExpr : Unary ; PreDecExpr : Unary ; MinusExpr : Unary ; PlusExpr : Unary ; BitNotExpr : Unary ; LogNotExpr : Unary ; CastExpr : Expr ::= TypeAccess:Access Expr; abstract PostfixExpr : Unary; PostIncExpr : PostfixExpr ; PostDecExpr : PostfixExpr ; abstract Binary : Expr ::= LeftOperand:Expr RightOperand:Expr; abstract ArithmeticExpr : Binary; abstract MultiplicativeExpr : ArithmeticExpr; MulExpr : MultiplicativeExpr ; DivExpr : MultiplicativeExpr ; ModExpr : MultiplicativeExpr ; abstract AdditiveExpr : ArithmeticExpr; AddExpr : AdditiveExpr ; SubExpr : AdditiveExpr ; abstract ShiftExpr : Binary; LShiftExpr : ShiftExpr ; RShiftExpr : ShiftExpr ; URShiftExpr : ShiftExpr ; abstract BitwiseExpr : Binary; AndBitwiseExpr : BitwiseExpr ; OrBitwiseExpr : BitwiseExpr ; XorBitwiseExpr : BitwiseExpr ; abstract LogicalExpr : Binary; AndLogicalExpr : LogicalExpr ; OrLogicalExpr : LogicalExpr ; abstract RelationalExpr : Binary; LTExpr : RelationalExpr ; GTExpr : RelationalExpr ; LEExpr : RelationalExpr ; GEExpr : RelationalExpr ; abstract EqualityExpr : RelationalExpr; EQExpr : EqualityExpr ; NEExpr : EqualityExpr ; InstanceOfExpr : Expr ::= Expr TypeAccess:Access; ConditionalExpr : Expr ::= Condition:Expr TrueExpr:Expr FalseExpr:Expr; Modifiers ::= Modifier*; Modifier ::= ; // Statements abstract Stmt; abstract BranchTargetStmt : Stmt; // a statement that can be reached by break or continue Block : Stmt ::= Stmt*; EmptyStmt : Stmt; LabeledStmt : BranchTargetStmt ::= Stmt; ExprStmt : Stmt ::= Expr; SwitchStmt : BranchTargetStmt ::= Expr Block; abstract Case : Stmt; ConstCase : Case ::= Value:Expr; DefaultCase : Case; IfStmt : Stmt ::= Condition:Expr Then:Stmt [Else:Stmt]; WhileStmt : BranchTargetStmt ::= Condition:Expr Stmt; DoStmt : BranchTargetStmt ::= Stmt Condition:Expr; ForStmt : BranchTargetStmt ::= InitStmt:Stmt* [Condition:Expr] UpdateStmt:Stmt* Stmt; BreakStmt : Stmt ::= ; ContinueStmt : Stmt ::= ; ReturnStmt : Stmt ::= [Result:Expr]; ThrowStmt : Stmt ::= Expr; SynchronizedStmt : Stmt ::= Expr Block; TryStmt : Stmt ::= Block CatchClause* [Finally:Block]; CatchClause ::= Parameter:ParameterDeclaration Block; AssertStmt : Stmt ::= first:Expr [Expr]; LocalClassDeclStmt : Stmt ::= ClassDecl;