Alte Java8- durch neue Java17-Grammatik ersetzt
This commit is contained in:
parent
58cd490639
commit
d89e414ca7
241
src/main/antlr4/de/dhbwstuttgart/parser/antlr/Java17Lexer.g4
Normal file
241
src/main/antlr4/de/dhbwstuttgart/parser/antlr/Java17Lexer.g4
Normal file
@ -0,0 +1,241 @@
|
||||
/*
|
||||
[The "BSD licence"]
|
||||
Copyright (c) 2013 Terence Parr, Sam Harwell
|
||||
Copyright (c) 2017 Ivan Kochurkin (upgrade to Java 8)
|
||||
Copyright (c) 2021 Michał Lorek (upgrade to Java 11)
|
||||
Copyright (c) 2022 Michał Lorek (upgrade to Java 17)
|
||||
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.
|
||||
*/
|
||||
|
||||
lexer grammar Java17Lexer;
|
||||
|
||||
// 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';
|
||||
|
||||
// Module related keywords
|
||||
MODULE: 'module';
|
||||
OPEN: 'open';
|
||||
REQUIRES: 'requires';
|
||||
EXPORTS: 'exports';
|
||||
OPENS: 'opens';
|
||||
TO: 'to';
|
||||
USES: 'uses';
|
||||
PROVIDES: 'provides';
|
||||
WITH: 'with';
|
||||
TRANSITIVE: 'transitive';
|
||||
|
||||
// Local Variable Type Inference
|
||||
VAR: 'var'; // reserved type name
|
||||
|
||||
// Switch Expressions
|
||||
YIELD: 'yield'; // reserved type name from Java 14
|
||||
|
||||
// Records
|
||||
RECORD: 'record';
|
||||
|
||||
// Sealed Classes
|
||||
SEALED: 'sealed';
|
||||
PERMITS: 'permits';
|
||||
NON_SEALED: 'non-sealed';
|
||||
|
||||
// Literals
|
||||
|
||||
DECIMAL_LITERAL: ('0' | [1-9] (Digits? | '_'+ Digits)) [lL]?;
|
||||
HEX_LITERAL: '0' [xX] [0-9a-fA-F] ([0-9a-fA-F_]* [0-9a-fA-F])? [lL]?;
|
||||
OCT_LITERAL: '0' '_'* [0-7] ([0-7_]* [0-7])? [lL]?;
|
||||
BINARY_LITERAL: '0' [bB] [01] ([01_]* [01])? [lL]?;
|
||||
|
||||
FLOAT_LITERAL: (Digits '.' Digits? | '.' Digits) ExponentPart? [fFdD]?
|
||||
| Digits (ExponentPart [fFdD]? | [fFdD])
|
||||
;
|
||||
|
||||
HEX_FLOAT_LITERAL: '0' [xX] (HexDigits '.'? | HexDigits? '.' HexDigits) [pP] [+-]? Digits [fFdD]?;
|
||||
|
||||
BOOL_LITERAL: 'true'
|
||||
| 'false'
|
||||
;
|
||||
|
||||
CHAR_LITERAL: '\'' (~['\\\r\n] | EscapeSequence) '\'';
|
||||
|
||||
STRING_LITERAL: '"' (~["\\\r\n] | EscapeSequence)* '"';
|
||||
|
||||
TEXT_BLOCK: '"""' [ \t]* [\r\n] (. | EscapeSequence)*? '"""';
|
||||
|
||||
NULL_LITERAL: 'null';
|
||||
|
||||
// Separators
|
||||
|
||||
LPAREN: '(';
|
||||
RPAREN: ')';
|
||||
LBRACE: '{';
|
||||
RBRACE: '}';
|
||||
LBRACK: '[';
|
||||
RBRACK: ']';
|
||||
SEMI: ';';
|
||||
COMMA: ',';
|
||||
DOT: '.';
|
||||
|
||||
// Operators
|
||||
|
||||
ASSIGN: '=';
|
||||
GT: '>';
|
||||
LT: '<';
|
||||
BANG: '!';
|
||||
TILDE: '~';
|
||||
QUESTION: '?';
|
||||
COLON: ':';
|
||||
EQUAL: '==';
|
||||
LE: '<=';
|
||||
GE: '>=';
|
||||
NOTEQUAL: '!=';
|
||||
AND: '&&';
|
||||
OR: '||';
|
||||
INC: '++';
|
||||
DEC: '--';
|
||||
ADD: '+';
|
||||
SUB: '-';
|
||||
MUL: '*';
|
||||
DIV: '/';
|
||||
BITAND: '&';
|
||||
BITOR: '|';
|
||||
CARET: '^';
|
||||
MOD: '%';
|
||||
|
||||
ADD_ASSIGN: '+=';
|
||||
SUB_ASSIGN: '-=';
|
||||
MUL_ASSIGN: '*=';
|
||||
DIV_ASSIGN: '/=';
|
||||
AND_ASSIGN: '&=';
|
||||
OR_ASSIGN: '|=';
|
||||
XOR_ASSIGN: '^=';
|
||||
MOD_ASSIGN: '%=';
|
||||
LSHIFT_ASSIGN: '<<=';
|
||||
RSHIFT_ASSIGN: '>>=';
|
||||
URSHIFT_ASSIGN: '>>>=';
|
||||
|
||||
// Java 8 tokens
|
||||
|
||||
ARROW: '->';
|
||||
COLONCOLON: '::';
|
||||
|
||||
// Additional symbols not defined in the lexical specification
|
||||
|
||||
AT: '@';
|
||||
ELLIPSIS: '...';
|
||||
|
||||
// Whitespace and comments
|
||||
|
||||
WS: [ \t\r\n\u000C]+ -> channel(HIDDEN);
|
||||
COMMENT: '/*' .*? '*/' -> channel(HIDDEN);
|
||||
LINE_COMMENT: '//' ~[\r\n]* -> channel(HIDDEN);
|
||||
|
||||
// Identifiers
|
||||
|
||||
IDENTIFIER: Letter LetterOrDigit*;
|
||||
|
||||
// Fragment rules
|
||||
|
||||
fragment ExponentPart
|
||||
: [eE] [+-]? Digits
|
||||
;
|
||||
|
||||
fragment EscapeSequence
|
||||
: '\\' [btnfr"'\\]
|
||||
| '\\' ([0-3]? [0-7])? [0-7]
|
||||
| '\\' 'u'+ HexDigit HexDigit HexDigit HexDigit
|
||||
;
|
||||
|
||||
fragment HexDigits
|
||||
: HexDigit ((HexDigit | '_')* HexDigit)?
|
||||
;
|
||||
|
||||
fragment HexDigit
|
||||
: [0-9a-fA-F]
|
||||
;
|
||||
|
||||
fragment Digits
|
||||
: [0-9] ([0-9_]* [0-9])?
|
||||
;
|
||||
|
||||
fragment LetterOrDigit
|
||||
: Letter
|
||||
| [0-9]
|
||||
;
|
||||
|
||||
fragment Letter
|
||||
: [a-zA-Z$_] // these are the "java letters" below 0x7F
|
||||
| ~[\u0000-\u007F\uD800-\uDBFF] // covers all characters above 0x7F which are not a surrogate
|
||||
| [\uD800-\uDBFF] [\uDC00-\uDFFF] // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
|
||||
;
|
767
src/main/antlr4/de/dhbwstuttgart/parser/antlr/Java17Parser.g4
Normal file
767
src/main/antlr4/de/dhbwstuttgart/parser/antlr/Java17Parser.g4
Normal file
@ -0,0 +1,767 @@
|
||||
/*
|
||||
[The "BSD licence"]
|
||||
Copyright (c) 2013 Terence Parr, Sam Harwell
|
||||
Copyright (c) 2017 Ivan Kochurkin (upgrade to Java 8)
|
||||
Copyright (c) 2021 Michał Lorek (upgrade to Java 11)
|
||||
Copyright (c) 2022 Michał Lorek (upgrade to Java 17)
|
||||
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.
|
||||
*/
|
||||
|
||||
parser grammar Java17Parser;
|
||||
|
||||
options { tokenVocab=Java17Lexer; }
|
||||
|
||||
compilationUnit
|
||||
: packageDeclaration? importDeclaration* typeDeclaration*
|
||||
| moduleDeclaration EOF
|
||||
;
|
||||
|
||||
packageDeclaration
|
||||
: annotation* PACKAGE qualifiedName ';'
|
||||
;
|
||||
|
||||
importDeclaration
|
||||
: IMPORT STATIC? qualifiedName ('.' '*')? ';'
|
||||
;
|
||||
|
||||
typeDeclaration
|
||||
: classOrInterfaceModifier*
|
||||
(classDeclaration | enumDeclaration | interfaceDeclaration | annotationTypeDeclaration | recordDeclaration)
|
||||
| ';'
|
||||
;
|
||||
|
||||
modifier
|
||||
: classOrInterfaceModifier
|
||||
| NATIVE
|
||||
| SYNCHRONIZED
|
||||
| TRANSIENT
|
||||
| VOLATILE
|
||||
;
|
||||
|
||||
classOrInterfaceModifier
|
||||
: annotation
|
||||
| PUBLIC
|
||||
| PROTECTED
|
||||
| PRIVATE
|
||||
| STATIC
|
||||
| ABSTRACT
|
||||
| FINAL // FINAL for class only -- does not apply to interfaces
|
||||
| STRICTFP
|
||||
| SEALED // Java17
|
||||
| NON_SEALED // Java17
|
||||
;
|
||||
|
||||
variableModifier
|
||||
: FINAL
|
||||
| annotation
|
||||
;
|
||||
|
||||
classDeclaration
|
||||
: CLASS identifier typeParameters?
|
||||
(EXTENDS typeType)?
|
||||
(IMPLEMENTS typeList)?
|
||||
(PERMITS typeList)? // Java17
|
||||
classBody
|
||||
;
|
||||
|
||||
typeParameters
|
||||
: '<' typeParameter (',' typeParameter)* '>'
|
||||
;
|
||||
|
||||
typeParameter
|
||||
: annotation* identifier (EXTENDS annotation* typeBound)?
|
||||
;
|
||||
|
||||
typeBound
|
||||
: typeType ('&' typeType)*
|
||||
;
|
||||
|
||||
enumDeclaration
|
||||
: ENUM identifier (IMPLEMENTS typeList)? '{' enumConstants? ','? enumBodyDeclarations? '}'
|
||||
;
|
||||
|
||||
enumConstants
|
||||
: enumConstant (',' enumConstant)*
|
||||
;
|
||||
|
||||
enumConstant
|
||||
: annotation* identifier arguments? classBody?
|
||||
;
|
||||
|
||||
enumBodyDeclarations
|
||||
: ';' classBodyDeclaration*
|
||||
;
|
||||
|
||||
interfaceDeclaration
|
||||
: INTERFACE identifier typeParameters? (EXTENDS typeList)? (PERMITS typeList)? interfaceBody
|
||||
;
|
||||
|
||||
classBody
|
||||
: '{' classBodyDeclaration* '}'
|
||||
;
|
||||
|
||||
interfaceBody
|
||||
: '{' interfaceBodyDeclaration* '}'
|
||||
;
|
||||
|
||||
classBodyDeclaration
|
||||
: ';'
|
||||
| STATIC? block
|
||||
| modifier* memberDeclaration
|
||||
;
|
||||
|
||||
memberDeclaration
|
||||
: recordDeclaration //Java17
|
||||
| methodDeclaration
|
||||
| genericMethodDeclaration
|
||||
| fieldDeclaration
|
||||
| constructorDeclaration
|
||||
| genericConstructorDeclaration
|
||||
| interfaceDeclaration
|
||||
| annotationTypeDeclaration
|
||||
| classDeclaration
|
||||
| enumDeclaration
|
||||
;
|
||||
|
||||
/* We use rule this even for void methods which cannot have [] after parameters.
|
||||
This simplifies grammar and we can consider void to be a type, which
|
||||
renders the [] matching as a context-sensitive issue or a semantic check
|
||||
for invalid return type after parsing.
|
||||
*/
|
||||
methodDeclaration
|
||||
: typeTypeOrVoid identifier formalParameters ('[' ']')*
|
||||
(THROWS qualifiedNameList)?
|
||||
methodBody
|
||||
;
|
||||
|
||||
methodBody
|
||||
: block
|
||||
| ';'
|
||||
;
|
||||
|
||||
typeTypeOrVoid
|
||||
: typeType
|
||||
| VOID
|
||||
;
|
||||
|
||||
genericMethodDeclaration
|
||||
: typeParameters methodDeclaration
|
||||
;
|
||||
|
||||
genericConstructorDeclaration
|
||||
: typeParameters constructorDeclaration
|
||||
;
|
||||
|
||||
constructorDeclaration
|
||||
: identifier formalParameters (THROWS qualifiedNameList)? constructorBody=block
|
||||
;
|
||||
|
||||
fieldDeclaration
|
||||
: typeType variableDeclarators ';'
|
||||
;
|
||||
|
||||
interfaceBodyDeclaration
|
||||
: modifier* interfaceMemberDeclaration
|
||||
| ';'
|
||||
;
|
||||
|
||||
interfaceMemberDeclaration
|
||||
: constDeclaration
|
||||
| interfaceMethodDeclaration
|
||||
| genericInterfaceMethodDeclaration
|
||||
| interfaceDeclaration
|
||||
| annotationTypeDeclaration
|
||||
| classDeclaration
|
||||
| enumDeclaration
|
||||
| recordDeclaration // Java17
|
||||
;
|
||||
|
||||
constDeclaration
|
||||
: typeType constantDeclarator (',' constantDeclarator)* ';'
|
||||
;
|
||||
|
||||
constantDeclarator
|
||||
: identifier ('[' ']')* '=' variableInitializer
|
||||
;
|
||||
|
||||
// Early versions of Java allows brackets after the method name, eg.
|
||||
// public int[] return2DArray() [] { ... }
|
||||
// is the same as
|
||||
// public int[][] return2DArray() { ... }
|
||||
interfaceMethodDeclaration
|
||||
: interfaceMethodModifier* interfaceCommonBodyDeclaration
|
||||
;
|
||||
|
||||
// Java8
|
||||
interfaceMethodModifier
|
||||
: annotation
|
||||
| PUBLIC
|
||||
| ABSTRACT
|
||||
| DEFAULT
|
||||
| STATIC
|
||||
| STRICTFP
|
||||
;
|
||||
|
||||
genericInterfaceMethodDeclaration
|
||||
: interfaceMethodModifier* typeParameters interfaceCommonBodyDeclaration
|
||||
;
|
||||
|
||||
interfaceCommonBodyDeclaration
|
||||
: annotation* typeTypeOrVoid identifier formalParameters ('[' ']')* (THROWS qualifiedNameList)? methodBody
|
||||
;
|
||||
|
||||
variableDeclarators
|
||||
: variableDeclarator (',' variableDeclarator)*
|
||||
;
|
||||
|
||||
variableDeclarator
|
||||
: variableDeclaratorId ('=' variableInitializer)?
|
||||
;
|
||||
|
||||
variableDeclaratorId
|
||||
: identifier ('[' ']')*
|
||||
;
|
||||
|
||||
variableInitializer
|
||||
: arrayInitializer
|
||||
| expression
|
||||
;
|
||||
|
||||
arrayInitializer
|
||||
: '{' (variableInitializer (',' variableInitializer)* (',')? )? '}'
|
||||
;
|
||||
|
||||
classOrInterfaceType
|
||||
: (identifier typeArguments? '.')* typeIdentifier typeArguments?
|
||||
;
|
||||
|
||||
typeArgument
|
||||
: typeType
|
||||
| annotation* '?' ((EXTENDS | SUPER) typeType)?
|
||||
;
|
||||
|
||||
qualifiedNameList
|
||||
: qualifiedName (',' qualifiedName)*
|
||||
;
|
||||
|
||||
formalParameters
|
||||
: '(' ( receiverParameter?
|
||||
| receiverParameter (',' formalParameterList)?
|
||||
| formalParameterList?
|
||||
) ')'
|
||||
;
|
||||
|
||||
receiverParameter
|
||||
: typeType (identifier '.')* THIS
|
||||
;
|
||||
|
||||
formalParameterList
|
||||
: formalParameter (',' formalParameter)* (',' lastFormalParameter)?
|
||||
| lastFormalParameter
|
||||
;
|
||||
|
||||
formalParameter
|
||||
: variableModifier* typeType variableDeclaratorId
|
||||
;
|
||||
|
||||
lastFormalParameter
|
||||
: variableModifier* typeType annotation* '...' variableDeclaratorId
|
||||
;
|
||||
|
||||
// local variable type inference
|
||||
lambdaLVTIList
|
||||
: lambdaLVTIParameter (',' lambdaLVTIParameter)*
|
||||
;
|
||||
|
||||
lambdaLVTIParameter
|
||||
: variableModifier* VAR identifier
|
||||
;
|
||||
|
||||
qualifiedName
|
||||
: identifier ('.' identifier)*
|
||||
;
|
||||
|
||||
literal
|
||||
: integerLiteral
|
||||
| floatLiteral
|
||||
| CHAR_LITERAL
|
||||
| STRING_LITERAL
|
||||
| BOOL_LITERAL
|
||||
| NULL_LITERAL
|
||||
| TEXT_BLOCK // Java17
|
||||
;
|
||||
|
||||
integerLiteral
|
||||
: DECIMAL_LITERAL
|
||||
| HEX_LITERAL
|
||||
| OCT_LITERAL
|
||||
| BINARY_LITERAL
|
||||
;
|
||||
|
||||
floatLiteral
|
||||
: FLOAT_LITERAL
|
||||
| HEX_FLOAT_LITERAL
|
||||
;
|
||||
|
||||
// ANNOTATIONS
|
||||
altAnnotationQualifiedName
|
||||
: (identifier DOT)* '@' identifier
|
||||
;
|
||||
|
||||
annotation
|
||||
: ('@' qualifiedName | altAnnotationQualifiedName) ('(' ( elementValuePairs | elementValue )? ')')?
|
||||
;
|
||||
|
||||
elementValuePairs
|
||||
: elementValuePair (',' elementValuePair)*
|
||||
;
|
||||
|
||||
elementValuePair
|
||||
: identifier '=' elementValue
|
||||
;
|
||||
|
||||
elementValue
|
||||
: expression
|
||||
| annotation
|
||||
| elementValueArrayInitializer
|
||||
;
|
||||
|
||||
elementValueArrayInitializer
|
||||
: '{' (elementValue (',' elementValue)*)? (',')? '}'
|
||||
;
|
||||
|
||||
annotationTypeDeclaration
|
||||
: '@' INTERFACE identifier annotationTypeBody
|
||||
;
|
||||
|
||||
annotationTypeBody
|
||||
: '{' (annotationTypeElementDeclaration)* '}'
|
||||
;
|
||||
|
||||
annotationTypeElementDeclaration
|
||||
: modifier* annotationTypeElementRest
|
||||
| ';' // this is not allowed by the grammar, but apparently allowed by the actual compiler
|
||||
;
|
||||
|
||||
annotationTypeElementRest
|
||||
: typeType annotationMethodOrConstantRest ';'
|
||||
| classDeclaration ';'?
|
||||
| interfaceDeclaration ';'?
|
||||
| enumDeclaration ';'?
|
||||
| annotationTypeDeclaration ';'?
|
||||
| recordDeclaration ';'? // Java17
|
||||
;
|
||||
|
||||
annotationMethodOrConstantRest
|
||||
: annotationMethodRest
|
||||
| annotationConstantRest
|
||||
;
|
||||
|
||||
annotationMethodRest
|
||||
: identifier '(' ')' defaultValue?
|
||||
;
|
||||
|
||||
annotationConstantRest
|
||||
: variableDeclarators
|
||||
;
|
||||
|
||||
defaultValue
|
||||
: DEFAULT elementValue
|
||||
;
|
||||
|
||||
// MODULES - Java9
|
||||
|
||||
moduleDeclaration
|
||||
: OPEN? MODULE qualifiedName moduleBody
|
||||
;
|
||||
|
||||
moduleBody
|
||||
: '{' moduleDirective* '}'
|
||||
;
|
||||
|
||||
moduleDirective
|
||||
: REQUIRES requiresModifier* qualifiedName ';'
|
||||
| EXPORTS qualifiedName (TO qualifiedName)? ';'
|
||||
| OPENS qualifiedName (TO qualifiedName)? ';'
|
||||
| USES qualifiedName ';'
|
||||
| PROVIDES qualifiedName WITH qualifiedName ';'
|
||||
;
|
||||
|
||||
requiresModifier
|
||||
: TRANSITIVE
|
||||
| STATIC
|
||||
;
|
||||
|
||||
// RECORDS - Java 17
|
||||
|
||||
recordDeclaration
|
||||
: RECORD identifier typeParameters? recordHeader
|
||||
(IMPLEMENTS typeList)?
|
||||
recordBody
|
||||
;
|
||||
|
||||
recordHeader
|
||||
: '(' recordComponentList? ')'
|
||||
;
|
||||
|
||||
recordComponentList
|
||||
: recordComponent (',' recordComponent)*
|
||||
;
|
||||
|
||||
recordComponent
|
||||
: typeType identifier
|
||||
;
|
||||
|
||||
recordBody
|
||||
: '{' classBodyDeclaration* '}'
|
||||
;
|
||||
|
||||
// STATEMENTS / BLOCKS
|
||||
|
||||
block
|
||||
: '{' blockStatement* '}'
|
||||
;
|
||||
|
||||
blockStatement
|
||||
: localVariableDeclaration ';'
|
||||
| localTypeDeclaration
|
||||
| statement
|
||||
;
|
||||
|
||||
localVariableDeclaration
|
||||
: variableModifier* (VAR identifier '=' expression | typeType variableDeclarators)
|
||||
;
|
||||
|
||||
identifier
|
||||
: IDENTIFIER
|
||||
| MODULE
|
||||
| OPEN
|
||||
| REQUIRES
|
||||
| EXPORTS
|
||||
| OPENS
|
||||
| TO
|
||||
| USES
|
||||
| PROVIDES
|
||||
| WITH
|
||||
| TRANSITIVE
|
||||
| YIELD
|
||||
| SEALED
|
||||
| PERMITS
|
||||
| RECORD
|
||||
| VAR
|
||||
;
|
||||
|
||||
typeIdentifier // Identifiers that are not restricted for type declarations
|
||||
: IDENTIFIER
|
||||
| MODULE
|
||||
| OPEN
|
||||
| REQUIRES
|
||||
| EXPORTS
|
||||
| OPENS
|
||||
| TO
|
||||
| USES
|
||||
| PROVIDES
|
||||
| WITH
|
||||
| TRANSITIVE
|
||||
| SEALED
|
||||
| PERMITS
|
||||
| RECORD
|
||||
;
|
||||
|
||||
localTypeDeclaration
|
||||
: classOrInterfaceModifier*
|
||||
(classDeclaration | interfaceDeclaration | recordDeclaration)
|
||||
| ';'
|
||||
;
|
||||
|
||||
statement
|
||||
: blockLabel=block
|
||||
| ASSERT expression (':' expression)? ';'
|
||||
| IF parExpression statement (ELSE statement)?
|
||||
| FOR '(' forControl ')' statement
|
||||
| WHILE parExpression statement
|
||||
| DO statement WHILE parExpression ';'
|
||||
| TRY block (catchClause+ finallyBlock? | finallyBlock)
|
||||
| TRY resourceSpecification block catchClause* finallyBlock?
|
||||
| SWITCH parExpression '{' switchBlockStatementGroup* switchLabel* '}'
|
||||
| SYNCHRONIZED parExpression block
|
||||
| RETURN expression? ';'
|
||||
| THROW expression ';'
|
||||
| BREAK identifier? ';'
|
||||
| CONTINUE identifier? ';'
|
||||
| YIELD expression ';' // Java17
|
||||
| SEMI
|
||||
| statementExpression=expression ';'
|
||||
| switchExpression ';'? // Java17
|
||||
| identifierLabel=identifier ':' statement
|
||||
;
|
||||
|
||||
catchClause
|
||||
: CATCH '(' variableModifier* catchType identifier ')' block
|
||||
;
|
||||
|
||||
catchType
|
||||
: qualifiedName ('|' qualifiedName)*
|
||||
;
|
||||
|
||||
finallyBlock
|
||||
: FINALLY block
|
||||
;
|
||||
|
||||
resourceSpecification
|
||||
: '(' resources ';'? ')'
|
||||
;
|
||||
|
||||
resources
|
||||
: resource (';' resource)*
|
||||
;
|
||||
|
||||
resource
|
||||
: variableModifier* ( classOrInterfaceType variableDeclaratorId | VAR identifier ) '=' expression
|
||||
| identifier
|
||||
;
|
||||
|
||||
/** Matches cases then statements, both of which are mandatory.
|
||||
* To handle empty cases at the end, we add switchLabel* to statement.
|
||||
*/
|
||||
switchBlockStatementGroup
|
||||
: switchLabel+ blockStatement+
|
||||
;
|
||||
|
||||
switchLabel
|
||||
: CASE (constantExpression=expression | enumConstantName=IDENTIFIER | typeType varName=identifier) ':'
|
||||
| DEFAULT ':'
|
||||
;
|
||||
|
||||
forControl
|
||||
: enhancedForControl
|
||||
| forInit? ';' expression? ';' forUpdate=expressionList?
|
||||
;
|
||||
|
||||
forInit
|
||||
: localVariableDeclaration
|
||||
| expressionList
|
||||
;
|
||||
|
||||
enhancedForControl
|
||||
: variableModifier* (typeType | VAR) variableDeclaratorId ':' expression
|
||||
;
|
||||
|
||||
// EXPRESSIONS
|
||||
|
||||
parExpression
|
||||
: '(' expression ')'
|
||||
;
|
||||
|
||||
expressionList
|
||||
: expression (',' expression)*
|
||||
;
|
||||
|
||||
methodCall
|
||||
: identifier '(' expressionList? ')'
|
||||
| THIS '(' expressionList? ')'
|
||||
| SUPER '(' expressionList? ')'
|
||||
;
|
||||
|
||||
expression
|
||||
: primary
|
||||
| expression bop='.'
|
||||
(
|
||||
identifier
|
||||
| methodCall
|
||||
| THIS
|
||||
| NEW nonWildcardTypeArguments? innerCreator
|
||||
| SUPER superSuffix
|
||||
| explicitGenericInvocation
|
||||
)
|
||||
| expression '[' expression ']'
|
||||
| methodCall
|
||||
| NEW creator
|
||||
| '(' annotation* typeType ('&' typeType)* ')' expression
|
||||
| expression postfix=('++' | '--')
|
||||
| prefix=('+'|'-'|'++'|'--') expression
|
||||
| prefix=('~'|'!') expression
|
||||
| expression bop=('*'|'/'|'%') expression
|
||||
| expression bop=('+'|'-') expression
|
||||
| expression ('<' '<' | '>' '>' '>' | '>' '>') expression
|
||||
| expression bop=('<=' | '>=' | '>' | '<') expression
|
||||
| expression bop=INSTANCEOF (typeType | pattern)
|
||||
| expression bop=('==' | '!=') expression
|
||||
| expression bop='&' expression
|
||||
| expression bop='^' expression
|
||||
| expression bop='|' expression
|
||||
| expression bop='&&' expression
|
||||
| expression bop='||' expression
|
||||
| <assoc=right> expression bop='?' expression ':' expression
|
||||
| <assoc=right> expression
|
||||
bop=('=' | '+=' | '-=' | '*=' | '/=' | '&=' | '|=' | '^=' | '>>=' | '>>>=' | '<<=' | '%=')
|
||||
expression
|
||||
| lambdaExpression // Java8
|
||||
| switchExpression // Java17
|
||||
|
||||
// Java 8 methodReference
|
||||
| expression '::' typeArguments? identifier
|
||||
| typeType '::' (typeArguments? identifier | NEW)
|
||||
| classType '::' typeArguments? NEW
|
||||
;
|
||||
|
||||
// Java17
|
||||
pattern
|
||||
: variableModifier* typeType annotation* identifier
|
||||
;
|
||||
|
||||
// Java8
|
||||
lambdaExpression
|
||||
: lambdaParameters '->' lambdaBody
|
||||
;
|
||||
|
||||
// Java8
|
||||
lambdaParameters
|
||||
: identifier
|
||||
| '(' formalParameterList? ')'
|
||||
| '(' identifier (',' identifier)* ')'
|
||||
| '(' lambdaLVTIList? ')'
|
||||
;
|
||||
|
||||
// Java8
|
||||
lambdaBody
|
||||
: expression
|
||||
| block
|
||||
;
|
||||
|
||||
primary
|
||||
: '(' expression ')'
|
||||
| THIS
|
||||
| SUPER
|
||||
| literal
|
||||
| identifier
|
||||
| typeTypeOrVoid '.' CLASS
|
||||
| nonWildcardTypeArguments (explicitGenericInvocationSuffix | THIS arguments)
|
||||
;
|
||||
|
||||
// Java17
|
||||
switchExpression
|
||||
: SWITCH parExpression '{' switchLabeledRule* '}'
|
||||
;
|
||||
|
||||
// Java17
|
||||
switchLabeledRule
|
||||
: CASE (expressionList | NULL_LITERAL | guardedPattern) (ARROW | COLON) switchRuleOutcome
|
||||
| DEFAULT (ARROW | COLON) switchRuleOutcome
|
||||
;
|
||||
|
||||
// Java17
|
||||
guardedPattern
|
||||
: '(' guardedPattern ')'
|
||||
| variableModifier* typeType annotation* identifier ('&&' expression)*
|
||||
| guardedPattern '&&' expression
|
||||
;
|
||||
|
||||
// Java17
|
||||
switchRuleOutcome
|
||||
: block
|
||||
| blockStatement*
|
||||
;
|
||||
|
||||
classType
|
||||
: (classOrInterfaceType '.')? annotation* identifier typeArguments?
|
||||
;
|
||||
|
||||
creator
|
||||
: nonWildcardTypeArguments createdName classCreatorRest
|
||||
| createdName (arrayCreatorRest | classCreatorRest)
|
||||
;
|
||||
|
||||
createdName
|
||||
: identifier typeArgumentsOrDiamond? ('.' identifier typeArgumentsOrDiamond?)*
|
||||
| primitiveType
|
||||
;
|
||||
|
||||
innerCreator
|
||||
: identifier nonWildcardTypeArgumentsOrDiamond? classCreatorRest
|
||||
;
|
||||
|
||||
arrayCreatorRest
|
||||
: '[' (']' ('[' ']')* arrayInitializer | expression ']' ('[' expression ']')* ('[' ']')*)
|
||||
;
|
||||
|
||||
classCreatorRest
|
||||
: arguments classBody?
|
||||
;
|
||||
|
||||
explicitGenericInvocation
|
||||
: nonWildcardTypeArguments explicitGenericInvocationSuffix
|
||||
;
|
||||
|
||||
typeArgumentsOrDiamond
|
||||
: '<' '>'
|
||||
| typeArguments
|
||||
;
|
||||
|
||||
nonWildcardTypeArgumentsOrDiamond
|
||||
: '<' '>'
|
||||
| nonWildcardTypeArguments
|
||||
;
|
||||
|
||||
nonWildcardTypeArguments
|
||||
: '<' typeList '>'
|
||||
;
|
||||
|
||||
typeList
|
||||
: typeType (',' typeType)*
|
||||
;
|
||||
|
||||
typeType
|
||||
: annotation* (classOrInterfaceType | primitiveType) (annotation* '[' ']')*
|
||||
;
|
||||
|
||||
primitiveType
|
||||
: BOOLEAN
|
||||
| CHAR
|
||||
| BYTE
|
||||
| SHORT
|
||||
| INT
|
||||
| LONG
|
||||
| FLOAT
|
||||
| DOUBLE
|
||||
;
|
||||
|
||||
typeArguments
|
||||
: '<' typeArgument (',' typeArgument)* '>'
|
||||
;
|
||||
|
||||
superSuffix
|
||||
: arguments
|
||||
| '.' typeArguments? identifier arguments?
|
||||
;
|
||||
|
||||
explicitGenericInvocationSuffix
|
||||
: SUPER superSuffix
|
||||
| identifier arguments
|
||||
;
|
||||
|
||||
arguments
|
||||
: '(' expressionList? ')'
|
||||
;
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user