/* * [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' ;