|
|
@@ -0,0 +1,1862 @@
|
|
|
+/*
|
|
|
+ * [The "BSD license"]
|
|
|
+ * Copyright (c) 2014 Terence Parr
|
|
|
+ * Copyright (c) 2014 Sam Harwell
|
|
|
+ * Copyright (c) 2017 Chan Chung Kwong
|
|
|
+ * All rights reserved.
|
|
|
+ *
|
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
|
+ * modification, are permitted provided that the following conditions
|
|
|
+ * are met:
|
|
|
+ *
|
|
|
+ * 1. Redistributions of source code must retain the above copyright
|
|
|
+ * notice, this list of conditions and the following disclaimer.
|
|
|
+ * 2. Redistributions in binary form must reproduce the above copyright
|
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
|
+ * 3. The name of the author may not be used to endorse or promote products
|
|
|
+ * derived from this software without specific prior written permission.
|
|
|
+ *
|
|
|
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
+ */
|
|
|
+
|
|
|
+/**
|
|
|
+ * A Java 9 grammar for ANTLR 4 derived from the Java Language Specification
|
|
|
+ * chapter 19.
|
|
|
+ *
|
|
|
+ * NOTE: This grammar results in a generated parser that is much slower
|
|
|
+ * than the Java 7 grammar in the grammars-v4/java directory. This
|
|
|
+ * one is, however, extremely close to the spec.
|
|
|
+ *
|
|
|
+ * You can test with
|
|
|
+ *
|
|
|
+ * $ antlr4 Java9.g4
|
|
|
+ * $ javac *.java
|
|
|
+ * $ grun Java9 compilationUnit *.java
|
|
|
+ *
|
|
|
+ * Or,
|
|
|
+~/antlr/code/grammars-v4/java9 $ java Test .
|
|
|
+/Users/parrt/antlr/code/grammars-v4/java9/./Java9BaseListener.java
|
|
|
+/Users/parrt/antlr/code/grammars-v4/java9/./Java9Lexer.java
|
|
|
+/Users/parrt/antlr/code/grammars-v4/java9/./Java9Listener.java
|
|
|
+/Users/parrt/antlr/code/grammars-v4/java9/./Java9Parser.java
|
|
|
+/Users/parrt/antlr/code/grammars-v4/java9/./Test.java
|
|
|
+Total lexer+parser time 30844ms.
|
|
|
+~/antlr/code/grammars-v4/java9 $ java Test examples/module-info.java
|
|
|
+/home/kwong/projects/grammars-v4/java9/examples/module-info.java
|
|
|
+Total lexer+parser time 914ms.
|
|
|
+~/antlr/code/grammars-v4/java9 $ java Test examples/TryWithResourceDemo.java
|
|
|
+/home/kwong/projects/grammars-v4/java9/examples/TryWithResourceDemo.java
|
|
|
+Total lexer+parser time 3634ms.
|
|
|
+~/antlr/code/grammars-v4/java9 $ java Test examples/helloworld.java
|
|
|
+/home/kwong/projects/grammars-v4/java9/examples/helloworld.java
|
|
|
+Total lexer+parser time 2497ms.
|
|
|
+
|
|
|
+ */
|
|
|
+grammar Java9;
|
|
|
+
|
|
|
+/*
|
|
|
+ * Productions from §3 (Lexical Structure)
|
|
|
+ */
|
|
|
+
|
|
|
+literal
|
|
|
+ : IntegerLiteral
|
|
|
+ | FloatingPointLiteral
|
|
|
+ | BooleanLiteral
|
|
|
+ | CharacterLiteral
|
|
|
+ | StringLiteral
|
|
|
+ | NullLiteral
|
|
|
+ ;
|
|
|
+
|
|
|
+/*
|
|
|
+ * Productions from §4 (Types, Values, and Variables)
|
|
|
+ */
|
|
|
+
|
|
|
+primitiveType
|
|
|
+ : annotation* numericType
|
|
|
+ | annotation* 'boolean'
|
|
|
+ ;
|
|
|
+
|
|
|
+numericType
|
|
|
+ : integralType
|
|
|
+ | floatingPointType
|
|
|
+ ;
|
|
|
+
|
|
|
+integralType
|
|
|
+ : 'byte'
|
|
|
+ | 'short'
|
|
|
+ | 'int'
|
|
|
+ | 'long'
|
|
|
+ | 'char'
|
|
|
+ ;
|
|
|
+
|
|
|
+floatingPointType
|
|
|
+ : 'float'
|
|
|
+ | 'double'
|
|
|
+ ;
|
|
|
+
|
|
|
+referenceType
|
|
|
+ : classOrInterfaceType
|
|
|
+ | typeVariable
|
|
|
+ | arrayType
|
|
|
+ ;
|
|
|
+
|
|
|
+/*classOrInterfaceType
|
|
|
+ : classType
|
|
|
+ | interfaceType
|
|
|
+ ;
|
|
|
+*/
|
|
|
+classOrInterfaceType
|
|
|
+ : ( classType_lfno_classOrInterfaceType
|
|
|
+ | interfaceType_lfno_classOrInterfaceType
|
|
|
+ )
|
|
|
+ ( classType_lf_classOrInterfaceType
|
|
|
+ | interfaceType_lf_classOrInterfaceType
|
|
|
+ )*
|
|
|
+ ;
|
|
|
+
|
|
|
+classType
|
|
|
+ : annotation* identifier typeArguments?
|
|
|
+ | classOrInterfaceType '.' annotation* identifier typeArguments?
|
|
|
+ ;
|
|
|
+
|
|
|
+classType_lf_classOrInterfaceType
|
|
|
+ : '.' annotation* identifier typeArguments?
|
|
|
+ ;
|
|
|
+
|
|
|
+classType_lfno_classOrInterfaceType
|
|
|
+ : annotation* identifier typeArguments?
|
|
|
+ ;
|
|
|
+
|
|
|
+interfaceType
|
|
|
+ : classType
|
|
|
+ ;
|
|
|
+
|
|
|
+interfaceType_lf_classOrInterfaceType
|
|
|
+ : classType_lf_classOrInterfaceType
|
|
|
+ ;
|
|
|
+
|
|
|
+interfaceType_lfno_classOrInterfaceType
|
|
|
+ : classType_lfno_classOrInterfaceType
|
|
|
+ ;
|
|
|
+
|
|
|
+typeVariable
|
|
|
+ : annotation* identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+arrayType
|
|
|
+ : primitiveType dims
|
|
|
+ | classOrInterfaceType dims
|
|
|
+ | typeVariable dims
|
|
|
+ ;
|
|
|
+
|
|
|
+dims
|
|
|
+ : annotation* '[' ']' (annotation* '[' ']')*
|
|
|
+ ;
|
|
|
+
|
|
|
+typeParameter
|
|
|
+ : typeParameterModifier* identifier typeBound?
|
|
|
+ ;
|
|
|
+
|
|
|
+typeParameterModifier
|
|
|
+ : annotation
|
|
|
+ ;
|
|
|
+
|
|
|
+typeBound
|
|
|
+ : 'extends' typeVariable
|
|
|
+ | 'extends' classOrInterfaceType additionalBound*
|
|
|
+ ;
|
|
|
+
|
|
|
+additionalBound
|
|
|
+ : '&' interfaceType
|
|
|
+ ;
|
|
|
+
|
|
|
+typeArguments
|
|
|
+ : '<' typeArgumentList '>'
|
|
|
+ ;
|
|
|
+
|
|
|
+typeArgumentList
|
|
|
+ : typeArgument (',' typeArgument)*
|
|
|
+ ;
|
|
|
+
|
|
|
+typeArgument
|
|
|
+ : referenceType
|
|
|
+ | wildcard
|
|
|
+ ;
|
|
|
+
|
|
|
+wildcard
|
|
|
+ : annotation* '?' wildcardBounds?
|
|
|
+ ;
|
|
|
+
|
|
|
+wildcardBounds
|
|
|
+ : 'extends' referenceType
|
|
|
+ | 'super' referenceType
|
|
|
+ ;
|
|
|
+
|
|
|
+/*
|
|
|
+ * Productions from §6 (Names)
|
|
|
+ */
|
|
|
+
|
|
|
+moduleName
|
|
|
+ : identifier
|
|
|
+ | moduleName '.' identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+packageName
|
|
|
+ : identifier
|
|
|
+ | packageName '.' identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+typeName
|
|
|
+ : identifier
|
|
|
+ | packageOrTypeName '.' identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+packageOrTypeName
|
|
|
+ : identifier
|
|
|
+ | packageOrTypeName '.' identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+expressionName
|
|
|
+ : identifier
|
|
|
+ | ambiguousName '.' identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+methodName
|
|
|
+ : identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+ambiguousName
|
|
|
+ : identifier
|
|
|
+ | ambiguousName '.' identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+/*
|
|
|
+ * Productions from §7 (Packages)
|
|
|
+ */
|
|
|
+
|
|
|
+compilationUnit
|
|
|
+ : ordinaryCompilation
|
|
|
+ | modularCompilation
|
|
|
+ ;
|
|
|
+
|
|
|
+ordinaryCompilation
|
|
|
+ : packageDeclaration? importDeclaration* typeDeclaration* EOF
|
|
|
+ ;
|
|
|
+
|
|
|
+modularCompilation
|
|
|
+ : importDeclaration* moduleDeclaration
|
|
|
+ ;
|
|
|
+
|
|
|
+packageDeclaration
|
|
|
+ : packageModifier* 'package' packageName ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+packageModifier
|
|
|
+ : annotation
|
|
|
+ ;
|
|
|
+
|
|
|
+importDeclaration
|
|
|
+ : singleTypeImportDeclaration
|
|
|
+ | typeImportOnDemandDeclaration
|
|
|
+ | singleStaticImportDeclaration
|
|
|
+ | staticImportOnDemandDeclaration
|
|
|
+ ;
|
|
|
+
|
|
|
+singleTypeImportDeclaration
|
|
|
+ : 'import' typeName ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+typeImportOnDemandDeclaration
|
|
|
+ : 'import' packageOrTypeName '.' '*' ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+singleStaticImportDeclaration
|
|
|
+ : 'import' 'static' typeName '.' identifier ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+staticImportOnDemandDeclaration
|
|
|
+ : 'import' 'static' typeName '.' '*' ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+typeDeclaration
|
|
|
+ : classDeclaration
|
|
|
+ | interfaceDeclaration
|
|
|
+ | ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+moduleDeclaration
|
|
|
+ : annotation* 'open'? 'module' moduleName '{' moduleDirective* '}'
|
|
|
+ ;
|
|
|
+
|
|
|
+moduleDirective
|
|
|
+ : 'requires' requiresModifier* moduleName ';'
|
|
|
+ | 'exports' packageName ('to' moduleName (',' moduleName)*)? ';'
|
|
|
+ | 'opens' packageName ('to' moduleName (',' moduleName)*)? ';'
|
|
|
+ | 'uses' typeName ';'
|
|
|
+ | 'provides' typeName 'with' typeName (',' typeName)* ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+requiresModifier
|
|
|
+ : 'transitive'
|
|
|
+ | 'static'
|
|
|
+ ;
|
|
|
+
|
|
|
+/*
|
|
|
+ * Productions from §8 (Classes)
|
|
|
+ */
|
|
|
+
|
|
|
+classDeclaration
|
|
|
+ : normalClassDeclaration
|
|
|
+ | enumDeclaration
|
|
|
+ ;
|
|
|
+
|
|
|
+normalClassDeclaration
|
|
|
+ : classModifier* 'class' identifier typeParameters? superclass? superinterfaces? classBody
|
|
|
+ ;
|
|
|
+
|
|
|
+classModifier
|
|
|
+ : annotation
|
|
|
+ | 'public'
|
|
|
+ | 'protected'
|
|
|
+ | 'private'
|
|
|
+ | 'abstract'
|
|
|
+ | 'static'
|
|
|
+ | 'final'
|
|
|
+ | 'strictfp'
|
|
|
+ ;
|
|
|
+
|
|
|
+typeParameters
|
|
|
+ : '<' typeParameterList '>'
|
|
|
+ ;
|
|
|
+
|
|
|
+typeParameterList
|
|
|
+ : typeParameter (',' typeParameter)*
|
|
|
+ ;
|
|
|
+
|
|
|
+superclass
|
|
|
+ : 'extends' classType
|
|
|
+ ;
|
|
|
+
|
|
|
+superinterfaces
|
|
|
+ : 'implements' interfaceTypeList
|
|
|
+ ;
|
|
|
+
|
|
|
+interfaceTypeList
|
|
|
+ : interfaceType (',' interfaceType)*
|
|
|
+ ;
|
|
|
+
|
|
|
+classBody
|
|
|
+ : '{' classBodyDeclaration* '}'
|
|
|
+ ;
|
|
|
+
|
|
|
+classBodyDeclaration
|
|
|
+ : classMemberDeclaration
|
|
|
+ | instanceInitializer
|
|
|
+ | staticInitializer
|
|
|
+ | constructorDeclaration
|
|
|
+ ;
|
|
|
+
|
|
|
+classMemberDeclaration
|
|
|
+ : fieldDeclaration
|
|
|
+ | methodDeclaration
|
|
|
+ | classDeclaration
|
|
|
+ | interfaceDeclaration
|
|
|
+ | ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+fieldDeclaration
|
|
|
+ : fieldModifier* unannType variableDeclaratorList ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+fieldModifier
|
|
|
+ : annotation
|
|
|
+ | 'public'
|
|
|
+ | 'protected'
|
|
|
+ | 'private'
|
|
|
+ | 'static'
|
|
|
+ | 'final'
|
|
|
+ | 'transient'
|
|
|
+ | 'volatile'
|
|
|
+ ;
|
|
|
+
|
|
|
+variableDeclaratorList
|
|
|
+ : variableDeclarator (',' variableDeclarator)*
|
|
|
+ ;
|
|
|
+
|
|
|
+variableDeclarator
|
|
|
+ : variableDeclaratorId ('=' variableInitializer)?
|
|
|
+ ;
|
|
|
+
|
|
|
+variableDeclaratorId
|
|
|
+ : identifier dims?
|
|
|
+ ;
|
|
|
+
|
|
|
+variableInitializer
|
|
|
+ : expression
|
|
|
+ | arrayInitializer
|
|
|
+ ;
|
|
|
+
|
|
|
+unannType
|
|
|
+ : unannPrimitiveType
|
|
|
+ | unannReferenceType
|
|
|
+ ;
|
|
|
+
|
|
|
+unannPrimitiveType
|
|
|
+ : numericType
|
|
|
+ | 'boolean'
|
|
|
+ ;
|
|
|
+
|
|
|
+unannReferenceType
|
|
|
+ : unannClassOrInterfaceType
|
|
|
+ | unannTypeVariable
|
|
|
+ | unannArrayType
|
|
|
+ ;
|
|
|
+
|
|
|
+/*unannClassOrInterfaceType
|
|
|
+ : unannClassType
|
|
|
+ | unannInterfaceType
|
|
|
+ ;
|
|
|
+*/
|
|
|
+
|
|
|
+unannClassOrInterfaceType
|
|
|
+ : ( unannClassType_lfno_unannClassOrInterfaceType
|
|
|
+ | unannInterfaceType_lfno_unannClassOrInterfaceType
|
|
|
+ )
|
|
|
+ ( unannClassType_lf_unannClassOrInterfaceType
|
|
|
+ | unannInterfaceType_lf_unannClassOrInterfaceType
|
|
|
+ )*
|
|
|
+ ;
|
|
|
+
|
|
|
+unannClassType
|
|
|
+ : identifier typeArguments?
|
|
|
+ | unannClassOrInterfaceType '.' annotation* identifier typeArguments?
|
|
|
+ ;
|
|
|
+
|
|
|
+unannClassType_lf_unannClassOrInterfaceType
|
|
|
+ : '.' annotation* identifier typeArguments?
|
|
|
+ ;
|
|
|
+
|
|
|
+unannClassType_lfno_unannClassOrInterfaceType
|
|
|
+ : identifier typeArguments?
|
|
|
+ ;
|
|
|
+
|
|
|
+unannInterfaceType
|
|
|
+ : unannClassType
|
|
|
+ ;
|
|
|
+
|
|
|
+unannInterfaceType_lf_unannClassOrInterfaceType
|
|
|
+ : unannClassType_lf_unannClassOrInterfaceType
|
|
|
+ ;
|
|
|
+
|
|
|
+unannInterfaceType_lfno_unannClassOrInterfaceType
|
|
|
+ : unannClassType_lfno_unannClassOrInterfaceType
|
|
|
+ ;
|
|
|
+
|
|
|
+unannTypeVariable
|
|
|
+ : identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+unannArrayType
|
|
|
+ : unannPrimitiveType dims
|
|
|
+ | unannClassOrInterfaceType dims
|
|
|
+ | unannTypeVariable dims
|
|
|
+ ;
|
|
|
+
|
|
|
+methodDeclaration
|
|
|
+ : methodModifier* methodHeader methodBody
|
|
|
+ ;
|
|
|
+
|
|
|
+methodModifier
|
|
|
+ : annotation
|
|
|
+ | 'public'
|
|
|
+ | 'protected'
|
|
|
+ | 'private'
|
|
|
+ | 'abstract'
|
|
|
+ | 'static'
|
|
|
+ | 'final'
|
|
|
+ | 'synchronized'
|
|
|
+ | 'native'
|
|
|
+ | 'strictfp'
|
|
|
+ ;
|
|
|
+
|
|
|
+methodHeader
|
|
|
+ : result methodDeclarator throws_?
|
|
|
+ | typeParameters annotation* result methodDeclarator throws_?
|
|
|
+ ;
|
|
|
+
|
|
|
+result
|
|
|
+ : unannType
|
|
|
+ | 'void'
|
|
|
+ ;
|
|
|
+
|
|
|
+methodDeclarator
|
|
|
+ : identifier '(' formalParameterList? ')' dims?
|
|
|
+ ;
|
|
|
+
|
|
|
+formalParameterList
|
|
|
+ : formalParameters ',' lastFormalParameter
|
|
|
+ | lastFormalParameter
|
|
|
+ | receiverParameter
|
|
|
+ ;
|
|
|
+
|
|
|
+formalParameters
|
|
|
+ : formalParameter (',' formalParameter)*
|
|
|
+ | receiverParameter (',' formalParameter)*
|
|
|
+ ;
|
|
|
+
|
|
|
+formalParameter
|
|
|
+ : variableModifier* unannType variableDeclaratorId
|
|
|
+ ;
|
|
|
+
|
|
|
+variableModifier
|
|
|
+ : annotation
|
|
|
+ | 'final'
|
|
|
+ ;
|
|
|
+
|
|
|
+lastFormalParameter
|
|
|
+ : variableModifier* unannType annotation* '...' variableDeclaratorId
|
|
|
+ | formalParameter
|
|
|
+ ;
|
|
|
+
|
|
|
+receiverParameter
|
|
|
+ : annotation* unannType (identifier '.')? 'this'
|
|
|
+ ;
|
|
|
+
|
|
|
+throws_
|
|
|
+ : 'throws' exceptionTypeList
|
|
|
+ ;
|
|
|
+
|
|
|
+exceptionTypeList
|
|
|
+ : exceptionType (',' exceptionType)*
|
|
|
+ ;
|
|
|
+
|
|
|
+exceptionType
|
|
|
+ : classType
|
|
|
+ | typeVariable
|
|
|
+ ;
|
|
|
+
|
|
|
+methodBody
|
|
|
+ : block
|
|
|
+ | ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+instanceInitializer
|
|
|
+ : block
|
|
|
+ ;
|
|
|
+
|
|
|
+staticInitializer
|
|
|
+ : 'static' block
|
|
|
+ ;
|
|
|
+
|
|
|
+constructorDeclaration
|
|
|
+ : constructorModifier* constructorDeclarator throws_? constructorBody
|
|
|
+ ;
|
|
|
+
|
|
|
+constructorModifier
|
|
|
+ : annotation
|
|
|
+ | 'public'
|
|
|
+ | 'protected'
|
|
|
+ | 'private'
|
|
|
+ ;
|
|
|
+
|
|
|
+constructorDeclarator
|
|
|
+ : typeParameters? simpleTypeName '(' formalParameterList? ')'
|
|
|
+ ;
|
|
|
+
|
|
|
+simpleTypeName
|
|
|
+ : identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+constructorBody
|
|
|
+ : '{' explicitConstructorInvocation? blockStatements? '}'
|
|
|
+ ;
|
|
|
+
|
|
|
+explicitConstructorInvocation
|
|
|
+ : typeArguments? 'this' '(' argumentList? ')' ';'
|
|
|
+ | typeArguments? 'super' '(' argumentList? ')' ';'
|
|
|
+ | expressionName '.' typeArguments? 'super' '(' argumentList? ')' ';'
|
|
|
+ | primary '.' typeArguments? 'super' '(' argumentList? ')' ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+enumDeclaration
|
|
|
+ : classModifier* 'enum' identifier superinterfaces? enumBody
|
|
|
+ ;
|
|
|
+
|
|
|
+enumBody
|
|
|
+ : '{' enumConstantList? ','? enumBodyDeclarations? '}'
|
|
|
+ ;
|
|
|
+
|
|
|
+enumConstantList
|
|
|
+ : enumConstant (',' enumConstant)*
|
|
|
+ ;
|
|
|
+
|
|
|
+enumConstant
|
|
|
+ : enumConstantModifier* identifier ('(' argumentList? ')')? classBody?
|
|
|
+ ;
|
|
|
+
|
|
|
+enumConstantModifier
|
|
|
+ : annotation
|
|
|
+ ;
|
|
|
+
|
|
|
+enumBodyDeclarations
|
|
|
+ : ';' classBodyDeclaration*
|
|
|
+ ;
|
|
|
+
|
|
|
+/*
|
|
|
+ * Productions from §9 (Interfaces)
|
|
|
+ */
|
|
|
+
|
|
|
+interfaceDeclaration
|
|
|
+ : normalInterfaceDeclaration
|
|
|
+ | annotationTypeDeclaration
|
|
|
+ ;
|
|
|
+
|
|
|
+normalInterfaceDeclaration
|
|
|
+ : interfaceModifier* 'interface' identifier typeParameters? extendsInterfaces? interfaceBody
|
|
|
+ ;
|
|
|
+
|
|
|
+interfaceModifier
|
|
|
+ : annotation
|
|
|
+ | 'public'
|
|
|
+ | 'protected'
|
|
|
+ | 'private'
|
|
|
+ | 'abstract'
|
|
|
+ | 'static'
|
|
|
+ | 'strictfp'
|
|
|
+ ;
|
|
|
+
|
|
|
+extendsInterfaces
|
|
|
+ : 'extends' interfaceTypeList
|
|
|
+ ;
|
|
|
+
|
|
|
+interfaceBody
|
|
|
+ : '{' interfaceMemberDeclaration* '}'
|
|
|
+ ;
|
|
|
+
|
|
|
+interfaceMemberDeclaration
|
|
|
+ : constantDeclaration
|
|
|
+ | interfaceMethodDeclaration
|
|
|
+ | classDeclaration
|
|
|
+ | interfaceDeclaration
|
|
|
+ | ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+constantDeclaration
|
|
|
+ : constantModifier* unannType variableDeclaratorList ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+constantModifier
|
|
|
+ : annotation
|
|
|
+ | 'public'
|
|
|
+ | 'static'
|
|
|
+ | 'final'
|
|
|
+ ;
|
|
|
+
|
|
|
+interfaceMethodDeclaration
|
|
|
+ : interfaceMethodModifier* methodHeader methodBody
|
|
|
+ ;
|
|
|
+
|
|
|
+interfaceMethodModifier
|
|
|
+ : annotation
|
|
|
+ | 'public'
|
|
|
+ | 'private'//Introduced in Java 9
|
|
|
+ | 'abstract'
|
|
|
+ | 'default'
|
|
|
+ | 'static'
|
|
|
+ | 'strictfp'
|
|
|
+ ;
|
|
|
+
|
|
|
+annotationTypeDeclaration
|
|
|
+ : interfaceModifier* '@' 'interface' identifier annotationTypeBody
|
|
|
+ ;
|
|
|
+
|
|
|
+annotationTypeBody
|
|
|
+ : '{' annotationTypeMemberDeclaration* '}'
|
|
|
+ ;
|
|
|
+
|
|
|
+annotationTypeMemberDeclaration
|
|
|
+ : annotationTypeElementDeclaration
|
|
|
+ | constantDeclaration
|
|
|
+ | classDeclaration
|
|
|
+ | interfaceDeclaration
|
|
|
+ | ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+annotationTypeElementDeclaration
|
|
|
+ : annotationTypeElementModifier* unannType identifier '(' ')' dims? defaultValue? ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+annotationTypeElementModifier
|
|
|
+ : annotation
|
|
|
+ | 'public'
|
|
|
+ | 'abstract'
|
|
|
+ ;
|
|
|
+
|
|
|
+defaultValue
|
|
|
+ : 'default' elementValue
|
|
|
+ ;
|
|
|
+
|
|
|
+annotation
|
|
|
+ : normalAnnotation
|
|
|
+ | markerAnnotation
|
|
|
+ | singleElementAnnotation
|
|
|
+ ;
|
|
|
+
|
|
|
+normalAnnotation
|
|
|
+ : '@' typeName '(' elementValuePairList? ')'
|
|
|
+ ;
|
|
|
+
|
|
|
+elementValuePairList
|
|
|
+ : elementValuePair (',' elementValuePair)*
|
|
|
+ ;
|
|
|
+
|
|
|
+elementValuePair
|
|
|
+ : identifier '=' elementValue
|
|
|
+ ;
|
|
|
+
|
|
|
+elementValue
|
|
|
+ : conditionalExpression
|
|
|
+ | elementValueArrayInitializer
|
|
|
+ | annotation
|
|
|
+ ;
|
|
|
+
|
|
|
+elementValueArrayInitializer
|
|
|
+ : '{' elementValueList? ','? '}'
|
|
|
+ ;
|
|
|
+
|
|
|
+elementValueList
|
|
|
+ : elementValue (',' elementValue)*
|
|
|
+ ;
|
|
|
+
|
|
|
+markerAnnotation
|
|
|
+ : '@' typeName
|
|
|
+ ;
|
|
|
+
|
|
|
+singleElementAnnotation
|
|
|
+ : '@' typeName '(' elementValue ')'
|
|
|
+ ;
|
|
|
+
|
|
|
+/*
|
|
|
+ * Productions from §10 (Arrays)
|
|
|
+ */
|
|
|
+
|
|
|
+arrayInitializer
|
|
|
+ : '{' variableInitializerList? ','? '}'
|
|
|
+ ;
|
|
|
+
|
|
|
+variableInitializerList
|
|
|
+ : variableInitializer (',' variableInitializer)*
|
|
|
+ ;
|
|
|
+
|
|
|
+/*
|
|
|
+ * Productions from §14 (Blocks and Statements)
|
|
|
+ */
|
|
|
+
|
|
|
+block
|
|
|
+ : '{' blockStatements? '}'
|
|
|
+ ;
|
|
|
+
|
|
|
+blockStatements
|
|
|
+ : blockStatement+
|
|
|
+ ;
|
|
|
+
|
|
|
+blockStatement
|
|
|
+ : localVariableDeclarationStatement
|
|
|
+ | classDeclaration
|
|
|
+ | statement
|
|
|
+ ;
|
|
|
+
|
|
|
+localVariableDeclarationStatement
|
|
|
+ : localVariableDeclaration ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+localVariableDeclaration
|
|
|
+ : variableModifier* unannType variableDeclaratorList
|
|
|
+ ;
|
|
|
+
|
|
|
+statement
|
|
|
+ : statementWithoutTrailingSubstatement
|
|
|
+ | labeledStatement
|
|
|
+ | ifThenStatement
|
|
|
+ | ifThenElseStatement
|
|
|
+ | whileStatement
|
|
|
+ | forStatement
|
|
|
+ ;
|
|
|
+
|
|
|
+statementNoShortIf
|
|
|
+ : statementWithoutTrailingSubstatement
|
|
|
+ | labeledStatementNoShortIf
|
|
|
+ | ifThenElseStatementNoShortIf
|
|
|
+ | whileStatementNoShortIf
|
|
|
+ | forStatementNoShortIf
|
|
|
+ ;
|
|
|
+
|
|
|
+statementWithoutTrailingSubstatement
|
|
|
+ : block
|
|
|
+ | emptyStatement
|
|
|
+ | expressionStatement
|
|
|
+ | assertStatement
|
|
|
+ | switchStatement
|
|
|
+ | doStatement
|
|
|
+ | breakStatement
|
|
|
+ | continueStatement
|
|
|
+ | returnStatement
|
|
|
+ | synchronizedStatement
|
|
|
+ | throwStatement
|
|
|
+ | tryStatement
|
|
|
+ ;
|
|
|
+
|
|
|
+emptyStatement
|
|
|
+ : ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+labeledStatement
|
|
|
+ : identifier ':' statement
|
|
|
+ ;
|
|
|
+
|
|
|
+labeledStatementNoShortIf
|
|
|
+ : identifier ':' statementNoShortIf
|
|
|
+ ;
|
|
|
+
|
|
|
+expressionStatement
|
|
|
+ : statementExpression ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+statementExpression
|
|
|
+ : assignment
|
|
|
+ | preIncrementExpression
|
|
|
+ | preDecrementExpression
|
|
|
+ | postIncrementExpression
|
|
|
+ | postDecrementExpression
|
|
|
+ | methodInvocation
|
|
|
+ | classInstanceCreationExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+ifThenStatement
|
|
|
+ : 'if' '(' expression ')' statement
|
|
|
+ ;
|
|
|
+
|
|
|
+ifThenElseStatement
|
|
|
+ : 'if' '(' expression ')' statementNoShortIf 'else' statement
|
|
|
+ ;
|
|
|
+
|
|
|
+ifThenElseStatementNoShortIf
|
|
|
+ : 'if' '(' expression ')' statementNoShortIf 'else' statementNoShortIf
|
|
|
+ ;
|
|
|
+
|
|
|
+assertStatement
|
|
|
+ : 'assert' expression ';'
|
|
|
+ | 'assert' expression ':' expression ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+switchStatement
|
|
|
+ : 'switch' '(' expression ')' switchBlock
|
|
|
+ ;
|
|
|
+
|
|
|
+switchBlock
|
|
|
+ : '{' switchBlockStatementGroup* switchLabel* '}'
|
|
|
+ ;
|
|
|
+
|
|
|
+switchBlockStatementGroup
|
|
|
+ : switchLabels blockStatements
|
|
|
+ ;
|
|
|
+
|
|
|
+switchLabels
|
|
|
+ : switchLabel+
|
|
|
+ ;
|
|
|
+
|
|
|
+switchLabel
|
|
|
+ : 'case' constantExpression ':'
|
|
|
+ | 'case' enumConstantName ':'
|
|
|
+ | 'default' ':'
|
|
|
+ ;
|
|
|
+
|
|
|
+enumConstantName
|
|
|
+ : identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+whileStatement
|
|
|
+ : 'while' '(' expression ')' statement
|
|
|
+ ;
|
|
|
+
|
|
|
+whileStatementNoShortIf
|
|
|
+ : 'while' '(' expression ')' statementNoShortIf
|
|
|
+ ;
|
|
|
+
|
|
|
+doStatement
|
|
|
+ : 'do' statement 'while' '(' expression ')' ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+forStatement
|
|
|
+ : basicForStatement
|
|
|
+ | enhancedForStatement
|
|
|
+ ;
|
|
|
+
|
|
|
+forStatementNoShortIf
|
|
|
+ : basicForStatementNoShortIf
|
|
|
+ | enhancedForStatementNoShortIf
|
|
|
+ ;
|
|
|
+
|
|
|
+basicForStatement
|
|
|
+ : 'for' '(' forInit? ';' expression? ';' forUpdate? ')' statement
|
|
|
+ ;
|
|
|
+
|
|
|
+basicForStatementNoShortIf
|
|
|
+ : 'for' '(' forInit? ';' expression? ';' forUpdate? ')' statementNoShortIf
|
|
|
+ ;
|
|
|
+
|
|
|
+forInit
|
|
|
+ : statementExpressionList
|
|
|
+ | localVariableDeclaration
|
|
|
+ ;
|
|
|
+
|
|
|
+forUpdate
|
|
|
+ : statementExpressionList
|
|
|
+ ;
|
|
|
+
|
|
|
+statementExpressionList
|
|
|
+ : statementExpression (',' statementExpression)*
|
|
|
+ ;
|
|
|
+
|
|
|
+enhancedForStatement
|
|
|
+ : 'for' '(' variableModifier* unannType variableDeclaratorId ':' expression ')' statement
|
|
|
+ ;
|
|
|
+
|
|
|
+enhancedForStatementNoShortIf
|
|
|
+ : 'for' '(' variableModifier* unannType variableDeclaratorId ':' expression ')' statementNoShortIf
|
|
|
+ ;
|
|
|
+
|
|
|
+breakStatement
|
|
|
+ : 'break' identifier? ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+continueStatement
|
|
|
+ : 'continue' identifier? ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+returnStatement
|
|
|
+ : 'return' expression? ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+throwStatement
|
|
|
+ : 'throw' expression ';'
|
|
|
+ ;
|
|
|
+
|
|
|
+synchronizedStatement
|
|
|
+ : 'synchronized' '(' expression ')' block
|
|
|
+ ;
|
|
|
+
|
|
|
+tryStatement
|
|
|
+ : 'try' block catches
|
|
|
+ | 'try' block catches? finally_
|
|
|
+ | tryWithResourcesStatement
|
|
|
+ ;
|
|
|
+
|
|
|
+catches
|
|
|
+ : catchClause+
|
|
|
+ ;
|
|
|
+
|
|
|
+catchClause
|
|
|
+ : 'catch' '(' catchFormalParameter ')' block
|
|
|
+ ;
|
|
|
+
|
|
|
+catchFormalParameter
|
|
|
+ : variableModifier* catchType variableDeclaratorId
|
|
|
+ ;
|
|
|
+
|
|
|
+catchType
|
|
|
+ : unannClassType ('|' classType)*
|
|
|
+ ;
|
|
|
+
|
|
|
+finally_
|
|
|
+ : 'finally' block
|
|
|
+ ;
|
|
|
+
|
|
|
+tryWithResourcesStatement
|
|
|
+ : 'try' resourceSpecification block catches? finally_?
|
|
|
+ ;
|
|
|
+
|
|
|
+resourceSpecification
|
|
|
+ : '(' resourceList ';'? ')'
|
|
|
+ ;
|
|
|
+
|
|
|
+resourceList
|
|
|
+ : resource (';' resource)*
|
|
|
+ ;
|
|
|
+
|
|
|
+resource
|
|
|
+ : variableModifier* unannType variableDeclaratorId '=' expression
|
|
|
+ | variableAccess//Introduced in Java 9
|
|
|
+ ;
|
|
|
+
|
|
|
+variableAccess
|
|
|
+ : expressionName
|
|
|
+ | fieldAccess
|
|
|
+ ;
|
|
|
+
|
|
|
+/*
|
|
|
+ * Productions from §15 (Expressions)
|
|
|
+ */
|
|
|
+
|
|
|
+/*primary
|
|
|
+ : primaryNoNewArray
|
|
|
+ | arrayCreationExpression
|
|
|
+ ;
|
|
|
+*/
|
|
|
+
|
|
|
+primary
|
|
|
+ : ( primaryNoNewArray_lfno_primary
|
|
|
+ | arrayCreationExpression
|
|
|
+ )
|
|
|
+ ( primaryNoNewArray_lf_primary
|
|
|
+ )*
|
|
|
+ ;
|
|
|
+
|
|
|
+primaryNoNewArray
|
|
|
+ : literal
|
|
|
+ | classLiteral
|
|
|
+ | 'this'
|
|
|
+ | typeName '.' 'this'
|
|
|
+ | '(' expression ')'
|
|
|
+ | classInstanceCreationExpression
|
|
|
+ | fieldAccess
|
|
|
+ | arrayAccess
|
|
|
+ | methodInvocation
|
|
|
+ | methodReference
|
|
|
+ ;
|
|
|
+
|
|
|
+primaryNoNewArray_lf_arrayAccess
|
|
|
+ :
|
|
|
+ ;
|
|
|
+
|
|
|
+primaryNoNewArray_lfno_arrayAccess
|
|
|
+ : literal
|
|
|
+ | typeName ('[' ']')* '.' 'class'
|
|
|
+ | 'void' '.' 'class'
|
|
|
+ | 'this'
|
|
|
+ | typeName '.' 'this'
|
|
|
+ | '(' expression ')'
|
|
|
+ | classInstanceCreationExpression
|
|
|
+ | fieldAccess
|
|
|
+ | methodInvocation
|
|
|
+ | methodReference
|
|
|
+ ;
|
|
|
+
|
|
|
+primaryNoNewArray_lf_primary
|
|
|
+ : classInstanceCreationExpression_lf_primary
|
|
|
+ | fieldAccess_lf_primary
|
|
|
+ | arrayAccess_lf_primary
|
|
|
+ | methodInvocation_lf_primary
|
|
|
+ | methodReference_lf_primary
|
|
|
+ ;
|
|
|
+
|
|
|
+primaryNoNewArray_lf_primary_lf_arrayAccess_lf_primary
|
|
|
+ :
|
|
|
+ ;
|
|
|
+
|
|
|
+primaryNoNewArray_lf_primary_lfno_arrayAccess_lf_primary
|
|
|
+ : classInstanceCreationExpression_lf_primary
|
|
|
+ | fieldAccess_lf_primary
|
|
|
+ | methodInvocation_lf_primary
|
|
|
+ | methodReference_lf_primary
|
|
|
+ ;
|
|
|
+
|
|
|
+primaryNoNewArray_lfno_primary
|
|
|
+ : literal
|
|
|
+ | typeName ('[' ']')* '.' 'class'
|
|
|
+ | unannPrimitiveType ('[' ']')* '.' 'class'
|
|
|
+ | 'void' '.' 'class'
|
|
|
+ | 'this'
|
|
|
+ | typeName '.' 'this'
|
|
|
+ | '(' expression ')'
|
|
|
+ | classInstanceCreationExpression_lfno_primary
|
|
|
+ | fieldAccess_lfno_primary
|
|
|
+ | arrayAccess_lfno_primary
|
|
|
+ | methodInvocation_lfno_primary
|
|
|
+ | methodReference_lfno_primary
|
|
|
+ ;
|
|
|
+
|
|
|
+primaryNoNewArray_lfno_primary_lf_arrayAccess_lfno_primary
|
|
|
+ :
|
|
|
+ ;
|
|
|
+
|
|
|
+primaryNoNewArray_lfno_primary_lfno_arrayAccess_lfno_primary
|
|
|
+ : literal
|
|
|
+ | typeName ('[' ']')* '.' 'class'
|
|
|
+ | unannPrimitiveType ('[' ']')* '.' 'class'
|
|
|
+ | 'void' '.' 'class'
|
|
|
+ | 'this'
|
|
|
+ | typeName '.' 'this'
|
|
|
+ | '(' expression ')'
|
|
|
+ | classInstanceCreationExpression_lfno_primary
|
|
|
+ | fieldAccess_lfno_primary
|
|
|
+ | methodInvocation_lfno_primary
|
|
|
+ | methodReference_lfno_primary
|
|
|
+ ;
|
|
|
+
|
|
|
+classLiteral
|
|
|
+ : (typeName|numericType|'boolean') ('[' ']')* '.' 'class'
|
|
|
+ | 'void' '.' 'class'
|
|
|
+ ;
|
|
|
+
|
|
|
+classInstanceCreationExpression
|
|
|
+ : 'new' typeArguments? annotation* identifier ('.' annotation* identifier)* typeArgumentsOrDiamond? '(' argumentList? ')' classBody?
|
|
|
+ | expressionName '.' 'new' typeArguments? annotation* identifier typeArgumentsOrDiamond? '(' argumentList? ')' classBody?
|
|
|
+ | primary '.' 'new' typeArguments? annotation* identifier typeArgumentsOrDiamond? '(' argumentList? ')' classBody?
|
|
|
+ ;
|
|
|
+
|
|
|
+classInstanceCreationExpression_lf_primary
|
|
|
+ : '.' 'new' typeArguments? annotation* identifier typeArgumentsOrDiamond? '(' argumentList? ')' classBody?
|
|
|
+ ;
|
|
|
+
|
|
|
+classInstanceCreationExpression_lfno_primary
|
|
|
+ : 'new' typeArguments? annotation* identifier ('.' annotation* identifier)* typeArgumentsOrDiamond? '(' argumentList? ')' classBody?
|
|
|
+ | expressionName '.' 'new' typeArguments? annotation* identifier typeArgumentsOrDiamond? '(' argumentList? ')' classBody?
|
|
|
+ ;
|
|
|
+
|
|
|
+typeArgumentsOrDiamond
|
|
|
+ : typeArguments
|
|
|
+ | '<' '>'
|
|
|
+ ;
|
|
|
+
|
|
|
+fieldAccess
|
|
|
+ : primary '.' identifier
|
|
|
+ | 'super' '.' identifier
|
|
|
+ | typeName '.' 'super' '.' identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+fieldAccess_lf_primary
|
|
|
+ : '.' identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+fieldAccess_lfno_primary
|
|
|
+ : 'super' '.' identifier
|
|
|
+ | typeName '.' 'super' '.' identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+/*arrayAccess
|
|
|
+ : expressionName '[' expression ']'
|
|
|
+ | primaryNoNewArray '[' expression ']'
|
|
|
+ ;
|
|
|
+*/
|
|
|
+
|
|
|
+arrayAccess
|
|
|
+ : ( expressionName '[' expression ']'
|
|
|
+ | primaryNoNewArray_lfno_arrayAccess '[' expression ']'
|
|
|
+ )
|
|
|
+ ( primaryNoNewArray_lf_arrayAccess '[' expression ']'
|
|
|
+ )*
|
|
|
+ ;
|
|
|
+
|
|
|
+arrayAccess_lf_primary
|
|
|
+ : ( primaryNoNewArray_lf_primary_lfno_arrayAccess_lf_primary '[' expression ']'
|
|
|
+ )
|
|
|
+ ( primaryNoNewArray_lf_primary_lf_arrayAccess_lf_primary '[' expression ']'
|
|
|
+ )*
|
|
|
+ ;
|
|
|
+
|
|
|
+arrayAccess_lfno_primary
|
|
|
+ : ( expressionName '[' expression ']'
|
|
|
+ | primaryNoNewArray_lfno_primary_lfno_arrayAccess_lfno_primary '[' expression ']'
|
|
|
+ )
|
|
|
+ ( primaryNoNewArray_lfno_primary_lf_arrayAccess_lfno_primary '[' expression ']'
|
|
|
+ )*
|
|
|
+ ;
|
|
|
+
|
|
|
+
|
|
|
+methodInvocation
|
|
|
+ : methodName '(' argumentList? ')'
|
|
|
+ | typeName '.' typeArguments? identifier '(' argumentList? ')'
|
|
|
+ | expressionName '.' typeArguments? identifier '(' argumentList? ')'
|
|
|
+ | primary '.' typeArguments? identifier '(' argumentList? ')'
|
|
|
+ | 'super' '.' typeArguments? identifier '(' argumentList? ')'
|
|
|
+ | typeName '.' 'super' '.' typeArguments? identifier '(' argumentList? ')'
|
|
|
+ ;
|
|
|
+
|
|
|
+methodInvocation_lf_primary
|
|
|
+ : '.' typeArguments? identifier '(' argumentList? ')'
|
|
|
+ ;
|
|
|
+
|
|
|
+methodInvocation_lfno_primary
|
|
|
+ : methodName '(' argumentList? ')'
|
|
|
+ | typeName '.' typeArguments? identifier '(' argumentList? ')'
|
|
|
+ | expressionName '.' typeArguments? identifier '(' argumentList? ')'
|
|
|
+ | 'super' '.' typeArguments? identifier '(' argumentList? ')'
|
|
|
+ | typeName '.' 'super' '.' typeArguments? identifier '(' argumentList? ')'
|
|
|
+ ;
|
|
|
+
|
|
|
+argumentList
|
|
|
+ : expression (',' expression)*
|
|
|
+ ;
|
|
|
+
|
|
|
+methodReference
|
|
|
+ : expressionName '::' typeArguments? identifier
|
|
|
+ | referenceType '::' typeArguments? identifier
|
|
|
+ | primary '::' typeArguments? identifier
|
|
|
+ | 'super' '::' typeArguments? identifier
|
|
|
+ | typeName '.' 'super' '::' typeArguments? identifier
|
|
|
+ | classType '::' typeArguments? 'new'
|
|
|
+ | arrayType '::' 'new'
|
|
|
+ ;
|
|
|
+
|
|
|
+methodReference_lf_primary
|
|
|
+ : '::' typeArguments? identifier
|
|
|
+ ;
|
|
|
+
|
|
|
+methodReference_lfno_primary
|
|
|
+ : expressionName '::' typeArguments? identifier
|
|
|
+ | referenceType '::' typeArguments? identifier
|
|
|
+ | 'super' '::' typeArguments? identifier
|
|
|
+ | typeName '.' 'super' '::' typeArguments? identifier
|
|
|
+ | classType '::' typeArguments? 'new'
|
|
|
+ | arrayType '::' 'new'
|
|
|
+ ;
|
|
|
+
|
|
|
+arrayCreationExpression
|
|
|
+ : 'new' primitiveType dimExprs dims?
|
|
|
+ | 'new' classOrInterfaceType dimExprs dims?
|
|
|
+ | 'new' primitiveType dims arrayInitializer
|
|
|
+ | 'new' classOrInterfaceType dims arrayInitializer
|
|
|
+ ;
|
|
|
+
|
|
|
+dimExprs
|
|
|
+ : dimExpr+
|
|
|
+ ;
|
|
|
+
|
|
|
+dimExpr
|
|
|
+ : annotation* '[' expression ']'
|
|
|
+ ;
|
|
|
+
|
|
|
+constantExpression
|
|
|
+ : expression
|
|
|
+ ;
|
|
|
+
|
|
|
+expression
|
|
|
+ : lambdaExpression
|
|
|
+ | assignmentExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+lambdaExpression
|
|
|
+ : lambdaParameters '->' lambdaBody
|
|
|
+ ;
|
|
|
+
|
|
|
+lambdaParameters
|
|
|
+ : identifier
|
|
|
+ | '(' formalParameterList? ')'
|
|
|
+ | '(' inferredFormalParameterList ')'
|
|
|
+ ;
|
|
|
+
|
|
|
+inferredFormalParameterList
|
|
|
+ : identifier (',' identifier)*
|
|
|
+ ;
|
|
|
+
|
|
|
+lambdaBody
|
|
|
+ : expression
|
|
|
+ | block
|
|
|
+ ;
|
|
|
+
|
|
|
+assignmentExpression
|
|
|
+ : conditionalExpression
|
|
|
+ | assignment
|
|
|
+ ;
|
|
|
+
|
|
|
+assignment
|
|
|
+ : leftHandSide assignmentOperator expression
|
|
|
+ ;
|
|
|
+
|
|
|
+leftHandSide
|
|
|
+ : expressionName
|
|
|
+ | fieldAccess
|
|
|
+ | arrayAccess
|
|
|
+ ;
|
|
|
+
|
|
|
+assignmentOperator
|
|
|
+ : '='
|
|
|
+ | '*='
|
|
|
+ | '/='
|
|
|
+ | '%='
|
|
|
+ | '+='
|
|
|
+ | '-='
|
|
|
+ | '<<='
|
|
|
+ | '>>='
|
|
|
+ | '>>>='
|
|
|
+ | '&='
|
|
|
+ | '^='
|
|
|
+ | '|='
|
|
|
+ ;
|
|
|
+
|
|
|
+conditionalExpression
|
|
|
+ : conditionalOrExpression
|
|
|
+ | conditionalOrExpression '?' expression ':' (conditionalExpression|lambdaExpression)
|
|
|
+ ;
|
|
|
+
|
|
|
+conditionalOrExpression
|
|
|
+ : conditionalAndExpression
|
|
|
+ | conditionalOrExpression '||' conditionalAndExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+conditionalAndExpression
|
|
|
+ : inclusiveOrExpression
|
|
|
+ | conditionalAndExpression '&&' inclusiveOrExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+inclusiveOrExpression
|
|
|
+ : exclusiveOrExpression
|
|
|
+ | inclusiveOrExpression '|' exclusiveOrExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+exclusiveOrExpression
|
|
|
+ : andExpression
|
|
|
+ | exclusiveOrExpression '^' andExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+andExpression
|
|
|
+ : equalityExpression
|
|
|
+ | andExpression '&' equalityExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+equalityExpression
|
|
|
+ : relationalExpression
|
|
|
+ | equalityExpression '==' relationalExpression
|
|
|
+ | equalityExpression '!=' relationalExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+relationalExpression
|
|
|
+ : shiftExpression
|
|
|
+ | relationalExpression '<' shiftExpression
|
|
|
+ | relationalExpression '>' shiftExpression
|
|
|
+ | relationalExpression '<=' shiftExpression
|
|
|
+ | relationalExpression '>=' shiftExpression
|
|
|
+ | relationalExpression 'instanceof' referenceType
|
|
|
+ ;
|
|
|
+
|
|
|
+shiftExpression
|
|
|
+ : additiveExpression
|
|
|
+ | shiftExpression '<' '<' additiveExpression
|
|
|
+ | shiftExpression '>' '>' additiveExpression
|
|
|
+ | shiftExpression '>' '>' '>' additiveExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+additiveExpression
|
|
|
+ : multiplicativeExpression
|
|
|
+ | additiveExpression '+' multiplicativeExpression
|
|
|
+ | additiveExpression '-' multiplicativeExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+multiplicativeExpression
|
|
|
+ : unaryExpression
|
|
|
+ | multiplicativeExpression '*' unaryExpression
|
|
|
+ | multiplicativeExpression '/' unaryExpression
|
|
|
+ | multiplicativeExpression '%' unaryExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+unaryExpression
|
|
|
+ : preIncrementExpression
|
|
|
+ | preDecrementExpression
|
|
|
+ | '+' unaryExpression
|
|
|
+ | '-' unaryExpression
|
|
|
+ | unaryExpressionNotPlusMinus
|
|
|
+ ;
|
|
|
+
|
|
|
+preIncrementExpression
|
|
|
+ : '++' unaryExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+preDecrementExpression
|
|
|
+ : '--' unaryExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+unaryExpressionNotPlusMinus
|
|
|
+ : postfixExpression
|
|
|
+ | '~' unaryExpression
|
|
|
+ | '!' unaryExpression
|
|
|
+ | castExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+/*postfixExpression
|
|
|
+ : primary
|
|
|
+ | expressionName
|
|
|
+ | postIncrementExpression
|
|
|
+ | postDecrementExpression
|
|
|
+ ;
|
|
|
+*/
|
|
|
+
|
|
|
+postfixExpression
|
|
|
+ : ( primary
|
|
|
+ | expressionName
|
|
|
+ )
|
|
|
+ ( postIncrementExpression_lf_postfixExpression
|
|
|
+ | postDecrementExpression_lf_postfixExpression
|
|
|
+ )*
|
|
|
+ ;
|
|
|
+
|
|
|
+postIncrementExpression
|
|
|
+ : postfixExpression '++'
|
|
|
+ ;
|
|
|
+
|
|
|
+postIncrementExpression_lf_postfixExpression
|
|
|
+ : '++'
|
|
|
+ ;
|
|
|
+
|
|
|
+postDecrementExpression
|
|
|
+ : postfixExpression '--'
|
|
|
+ ;
|
|
|
+
|
|
|
+postDecrementExpression_lf_postfixExpression
|
|
|
+ : '--'
|
|
|
+ ;
|
|
|
+
|
|
|
+castExpression
|
|
|
+ : '(' primitiveType ')' unaryExpression
|
|
|
+ | '(' referenceType additionalBound* ')' unaryExpressionNotPlusMinus
|
|
|
+ | '(' referenceType additionalBound* ')' lambdaExpression
|
|
|
+ ;
|
|
|
+
|
|
|
+// LEXER
|
|
|
+
|
|
|
+identifier : Identifier | 'to' | 'module' | 'open' | 'with' | 'provides' | 'uses' | 'opens' | 'requires' | 'exports';
|
|
|
+
|
|
|
+// §3.9 Keywords
|
|
|
+
|
|
|
+ABSTRACT : 'abstract';
|
|
|
+ASSERT : 'assert';
|
|
|
+BOOLEAN : 'boolean';
|
|
|
+BREAK : 'break';
|
|
|
+BYTE : 'byte';
|
|
|
+CASE : 'case';
|
|
|
+CATCH : 'catch';
|
|
|
+CHAR : 'char';
|
|
|
+CLASS : 'class';
|
|
|
+CONST : 'const';
|
|
|
+CONTINUE : 'continue';
|
|
|
+DEFAULT : 'default';
|
|
|
+DO : 'do';
|
|
|
+DOUBLE : 'double';
|
|
|
+ELSE : 'else';
|
|
|
+ENUM : 'enum';
|
|
|
+EXTENDS : 'extends';
|
|
|
+FINAL : 'final';
|
|
|
+FINALLY : 'finally';
|
|
|
+FLOAT : 'float';
|
|
|
+FOR : 'for';
|
|
|
+IF : 'if';
|
|
|
+GOTO : 'goto';
|
|
|
+IMPLEMENTS : 'implements';
|
|
|
+IMPORT : 'import';
|
|
|
+INSTANCEOF : 'instanceof';
|
|
|
+INT : 'int';
|
|
|
+INTERFACE : 'interface';
|
|
|
+LONG : 'long';
|
|
|
+NATIVE : 'native';
|
|
|
+NEW : 'new';
|
|
|
+PACKAGE : 'package';
|
|
|
+PRIVATE : 'private';
|
|
|
+PROTECTED : 'protected';
|
|
|
+PUBLIC : 'public';
|
|
|
+RETURN : 'return';
|
|
|
+SHORT : 'short';
|
|
|
+STATIC : 'static';
|
|
|
+STRICTFP : 'strictfp';
|
|
|
+SUPER : 'super';
|
|
|
+SWITCH : 'switch';
|
|
|
+SYNCHRONIZED : 'synchronized';
|
|
|
+THIS : 'this';
|
|
|
+THROW : 'throw';
|
|
|
+THROWS : 'throws';
|
|
|
+TRANSIENT : 'transient';
|
|
|
+TRY : 'try';
|
|
|
+VOID : 'void';
|
|
|
+VOLATILE : 'volatile';
|
|
|
+WHILE : 'while';
|
|
|
+UNDER_SCORE : '_';//Introduced in Java 9
|
|
|
+
|
|
|
+// §3.10.1 Integer Literals
|
|
|
+
|
|
|
+IntegerLiteral
|
|
|
+ : DecimalIntegerLiteral
|
|
|
+ | HexIntegerLiteral
|
|
|
+ | OctalIntegerLiteral
|
|
|
+ | BinaryIntegerLiteral
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+DecimalIntegerLiteral
|
|
|
+ : DecimalNumeral IntegerTypeSuffix?
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+HexIntegerLiteral
|
|
|
+ : HexNumeral IntegerTypeSuffix?
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+OctalIntegerLiteral
|
|
|
+ : OctalNumeral IntegerTypeSuffix?
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+BinaryIntegerLiteral
|
|
|
+ : BinaryNumeral IntegerTypeSuffix?
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+IntegerTypeSuffix
|
|
|
+ : [lL]
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+DecimalNumeral
|
|
|
+ : '0'
|
|
|
+ | NonZeroDigit (Digits? | Underscores Digits)
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+Digits
|
|
|
+ : Digit (DigitsAndUnderscores? Digit)?
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+Digit
|
|
|
+ : '0'
|
|
|
+ | NonZeroDigit
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+NonZeroDigit
|
|
|
+ : [1-9]
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+DigitsAndUnderscores
|
|
|
+ : DigitOrUnderscore+
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+DigitOrUnderscore
|
|
|
+ : Digit
|
|
|
+ | '_'
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+Underscores
|
|
|
+ : '_'+
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+HexNumeral
|
|
|
+ : '0' [xX] HexDigits
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+HexDigits
|
|
|
+ : HexDigit (HexDigitsAndUnderscores? HexDigit)?
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+HexDigit
|
|
|
+ : [0-9a-fA-F]
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+HexDigitsAndUnderscores
|
|
|
+ : HexDigitOrUnderscore+
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+HexDigitOrUnderscore
|
|
|
+ : HexDigit
|
|
|
+ | '_'
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+OctalNumeral
|
|
|
+ : '0' Underscores? OctalDigits
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+OctalDigits
|
|
|
+ : OctalDigit (OctalDigitsAndUnderscores? OctalDigit)?
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+OctalDigit
|
|
|
+ : [0-7]
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+OctalDigitsAndUnderscores
|
|
|
+ : OctalDigitOrUnderscore+
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+OctalDigitOrUnderscore
|
|
|
+ : OctalDigit
|
|
|
+ | '_'
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+BinaryNumeral
|
|
|
+ : '0' [bB] BinaryDigits
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+BinaryDigits
|
|
|
+ : BinaryDigit (BinaryDigitsAndUnderscores? BinaryDigit)?
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+BinaryDigit
|
|
|
+ : [01]
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+BinaryDigitsAndUnderscores
|
|
|
+ : BinaryDigitOrUnderscore+
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+BinaryDigitOrUnderscore
|
|
|
+ : BinaryDigit
|
|
|
+ | '_'
|
|
|
+ ;
|
|
|
+
|
|
|
+// §3.10.2 Floating-Point Literals
|
|
|
+
|
|
|
+FloatingPointLiteral
|
|
|
+ : DecimalFloatingPointLiteral
|
|
|
+ | HexadecimalFloatingPointLiteral
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+DecimalFloatingPointLiteral
|
|
|
+ : Digits '.' Digits? ExponentPart? FloatTypeSuffix?
|
|
|
+ | '.' Digits ExponentPart? FloatTypeSuffix?
|
|
|
+ | Digits ExponentPart FloatTypeSuffix?
|
|
|
+ | Digits FloatTypeSuffix
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+ExponentPart
|
|
|
+ : ExponentIndicator SignedInteger
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+ExponentIndicator
|
|
|
+ : [eE]
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+SignedInteger
|
|
|
+ : Sign? Digits
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+Sign
|
|
|
+ : [+-]
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+FloatTypeSuffix
|
|
|
+ : [fFdD]
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+HexadecimalFloatingPointLiteral
|
|
|
+ : HexSignificand BinaryExponent FloatTypeSuffix?
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+HexSignificand
|
|
|
+ : HexNumeral '.'?
|
|
|
+ | '0' [xX] HexDigits? '.' HexDigits
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+BinaryExponent
|
|
|
+ : BinaryExponentIndicator SignedInteger
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+BinaryExponentIndicator
|
|
|
+ : [pP]
|
|
|
+ ;
|
|
|
+
|
|
|
+// §3.10.3 Boolean Literals
|
|
|
+
|
|
|
+BooleanLiteral
|
|
|
+ : 'true'
|
|
|
+ | 'false'
|
|
|
+ ;
|
|
|
+
|
|
|
+// §3.10.4 Character Literals
|
|
|
+
|
|
|
+CharacterLiteral
|
|
|
+ : '\'' SingleCharacter '\''
|
|
|
+ | '\'' EscapeSequence '\''
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+SingleCharacter
|
|
|
+ : ~['\\\r\n]
|
|
|
+ ;
|
|
|
+
|
|
|
+// §3.10.5 String Literals
|
|
|
+
|
|
|
+StringLiteral
|
|
|
+ : '"' StringCharacters? '"'
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+StringCharacters
|
|
|
+ : StringCharacter+
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+StringCharacter
|
|
|
+ : ~["\\\r\n]
|
|
|
+ | EscapeSequence
|
|
|
+ ;
|
|
|
+
|
|
|
+// §3.10.6 Escape Sequences for Character and String Literals
|
|
|
+
|
|
|
+fragment
|
|
|
+EscapeSequence
|
|
|
+ : '\\' [btnfr"'\\]
|
|
|
+ | OctalEscape
|
|
|
+ | UnicodeEscape // This is not in the spec but prevents having to preprocess the input
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+OctalEscape
|
|
|
+ : '\\' OctalDigit
|
|
|
+ | '\\' OctalDigit OctalDigit
|
|
|
+ | '\\' ZeroToThree OctalDigit OctalDigit
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+ZeroToThree
|
|
|
+ : [0-3]
|
|
|
+ ;
|
|
|
+
|
|
|
+// This is not in the spec but prevents having to preprocess the input
|
|
|
+fragment
|
|
|
+UnicodeEscape
|
|
|
+ : '\\' 'u'+ HexDigit HexDigit HexDigit HexDigit
|
|
|
+ ;
|
|
|
+
|
|
|
+// §3.10.7 The Null Literal
|
|
|
+
|
|
|
+NullLiteral
|
|
|
+ : 'null'
|
|
|
+ ;
|
|
|
+
|
|
|
+// §3.11 Separators
|
|
|
+
|
|
|
+LPAREN : '(';
|
|
|
+RPAREN : ')';
|
|
|
+LBRACE : '{';
|
|
|
+RBRACE : '}';
|
|
|
+LBRACK : '[';
|
|
|
+RBRACK : ']';
|
|
|
+SEMI : ';';
|
|
|
+COMMA : ',';
|
|
|
+DOT : '.';
|
|
|
+ELLIPSIS : '...';
|
|
|
+AT : '@';
|
|
|
+COLONCOLON : '::';
|
|
|
+
|
|
|
+
|
|
|
+// §3.12 Operators
|
|
|
+
|
|
|
+ASSIGN : '=';
|
|
|
+GT : '>';
|
|
|
+LT : '<';
|
|
|
+BANG : '!';
|
|
|
+TILDE : '~';
|
|
|
+QUESTION : '?';
|
|
|
+COLON : ':';
|
|
|
+ARROW : '->';
|
|
|
+EQUAL : '==';
|
|
|
+LE : '<=';
|
|
|
+GE : '>=';
|
|
|
+NOTEQUAL : '!=';
|
|
|
+AND : '&&';
|
|
|
+OR : '||';
|
|
|
+INC : '++';
|
|
|
+DEC : '--';
|
|
|
+ADD : '+';
|
|
|
+SUB : '-';
|
|
|
+MUL : '*';
|
|
|
+DIV : '/';
|
|
|
+BITAND : '&';
|
|
|
+BITOR : '|';
|
|
|
+CARET : '^';
|
|
|
+MOD : '%';
|
|
|
+//LSHIFT : '<<';
|
|
|
+//RSHIFT : '>>';
|
|
|
+//URSHIFT : '>>>';
|
|
|
+
|
|
|
+ADD_ASSIGN : '+=';
|
|
|
+SUB_ASSIGN : '-=';
|
|
|
+MUL_ASSIGN : '*=';
|
|
|
+DIV_ASSIGN : '/=';
|
|
|
+AND_ASSIGN : '&=';
|
|
|
+OR_ASSIGN : '|=';
|
|
|
+XOR_ASSIGN : '^=';
|
|
|
+MOD_ASSIGN : '%=';
|
|
|
+LSHIFT_ASSIGN : '<<=';
|
|
|
+RSHIFT_ASSIGN : '>>=';
|
|
|
+URSHIFT_ASSIGN : '>>>=';
|
|
|
+
|
|
|
+// §3.8 Identifiers (must appear after all keywords in the grammar)
|
|
|
+
|
|
|
+Identifier
|
|
|
+ : JavaLetter JavaLetterOrDigit*
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+JavaLetter
|
|
|
+ : [a-zA-Z$_] // these are the "java letters" below 0x7F
|
|
|
+ | // covers all characters above 0x7F which are not a surrogate
|
|
|
+ ~[\u0000-\u007F\uD800-\uDBFF]
|
|
|
+ {Character.isJavaIdentifierStart(_input.LA(-1))}?
|
|
|
+ | // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
|
|
|
+ [\uD800-\uDBFF] [\uDC00-\uDFFF]
|
|
|
+ {Character.isJavaIdentifierStart(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
|
|
|
+ ;
|
|
|
+
|
|
|
+fragment
|
|
|
+JavaLetterOrDigit
|
|
|
+ : [a-zA-Z0-9$_] // these are the "java letters or digits" below 0x7F
|
|
|
+ | // covers all characters above 0x7F which are not a surrogate
|
|
|
+ ~[\u0000-\u007F\uD800-\uDBFF]
|
|
|
+ {Character.isJavaIdentifierPart(_input.LA(-1))}?
|
|
|
+ | // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
|
|
|
+ [\uD800-\uDBFF] [\uDC00-\uDFFF]
|
|
|
+ {Character.isJavaIdentifierPart(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
|
|
|
+ ;
|
|
|
+
|
|
|
+//
|
|
|
+// Whitespace and comments
|
|
|
+//
|
|
|
+
|
|
|
+WS : [ \t\r\n\u000C]+ -> skip
|
|
|
+ ;
|
|
|
+
|
|
|
+COMMENT
|
|
|
+ : '/*' .*? '*/' -> channel(HIDDEN)
|
|
|
+ ;
|
|
|
+
|
|
|
+LINE_COMMENT
|
|
|
+ : '//' ~[\r\n]* -> channel(HIDDEN)
|
|
|
+ ;
|