Files
ironjava/IronJava.Core/Grammar/Java9Parser.g4
2025-07-21 22:29:22 -04:00

1432 lines
29 KiB
ANTLR

/*
* [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.
*/
// $antlr-format alignTrailingComments true, columnLimit 150, minEmptyLines 1, maxEmptyLinesToKeep 1, reflowComments false, useTab false
// $antlr-format allowShortRulesOnASingleLine false, allowShortBlocksOnASingleLine true, alignSemicolons hanging, alignColons hanging
parser grammar Java9Parser;
options
{
tokenVocab = Java9Lexer;
}
/*
* 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) EOF
;
ordinaryCompilation
: packageDeclaration? importDeclaration* typeDeclaration*
;
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
;
identifier
: Identifier
| 'to'
| 'module'
| 'open'
| 'with'
| 'provides'
| 'uses'
| 'opens'
| 'requires'
| 'exports'
;