📄 java.g
字号:
switchBlockLabels
: switchCaseLabels switchDefaultLabel? switchCaseLabels
-> ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabels switchDefaultLabel? switchCaseLabels)
;
switchCaseLabels
: switchCaseLabel*
;
switchCaseLabel
: CASE^ expression COLON! blockStatement*
;
switchDefaultLabel
: DEFAULT^ COLON! blockStatement*
;
forInit
: localVariableDeclaration -> ^(FOR_INIT localVariableDeclaration)
| expressionList -> ^(FOR_INIT expressionList)
| -> ^(FOR_INIT)
;
forCondition
: expression?
-> ^(FOR_CONDITION expression?)
;
forUpdater
: expressionList?
-> ^(FOR_UPDATE expressionList?)
;
// EXPRESSIONS
parenthesizedExpression
: LPAREN expression RPAREN
-> ^(PARENTESIZED_EXPR[$LPAREN, "PARENTESIZED_EXPR"] expression)
;
expressionList
: expression (COMMA! expression)*
;
expression
: assignmentExpression
-> ^(EXPR assignmentExpression)
;
assignmentExpression
: conditionalExpression
( ( ASSIGN^
| PLUS_ASSIGN^
| MINUS_ASSIGN^
| STAR_ASSIGN^
| DIV_ASSIGN^
| AND_ASSIGN^
| OR_ASSIGN^
| XOR_ASSIGN^
| MOD_ASSIGN^
| SHIFT_LEFT_ASSIGN^
| SHIFT_RIGHT_ASSIGN^
| BIT_SHIFT_RIGHT_ASSIGN^
)
assignmentExpression)?
;
conditionalExpression
: logicalOrExpression (QUESTION^ assignmentExpression COLON! conditionalExpression)?
;
logicalOrExpression
: logicalAndExpression (LOGICAL_OR^ logicalAndExpression)*
;
logicalAndExpression
: inclusiveOrExpression (LOGICAL_AND^ inclusiveOrExpression)*
;
inclusiveOrExpression
: exclusiveOrExpression (OR^ exclusiveOrExpression)*
;
exclusiveOrExpression
: andExpression (XOR^ andExpression)*
;
andExpression
: equalityExpression (AND^ equalityExpression)*
;
equalityExpression
: instanceOfExpression
( ( EQUAL^
| NOT_EQUAL^
)
instanceOfExpression
)*
;
instanceOfExpression
: relationalExpression (INSTANCEOF^ type)?
;
relationalExpression
: shiftExpression
( ( LESS_OR_EQUAL^
| GREATER_OR_EQUAL^
| LESS_THAN^
| GREATER_THAN^
)
shiftExpression
)*
;
shiftExpression
: additiveExpression
( ( BIT_SHIFT_RIGHT^
| SHIFT_RIGHT^
| SHIFT_LEFT^
)
additiveExpression
)*
;
additiveExpression
: multiplicativeExpression
( ( PLUS^
| MINUS^
)
multiplicativeExpression
)*
;
multiplicativeExpression
: unaryExpression
( ( STAR^
| DIV^
| MOD^
)
unaryExpression
)*
;
unaryExpression
: PLUS unaryExpression -> ^(UNARY_PLUS[$PLUS, "UNARY_PLUS"] unaryExpression)
| MINUS unaryExpression -> ^(UNARY_MINUS[$MINUS, "UNARY_MINUS"] unaryExpression)
| INC postfixedExpression -> ^(PRE_INC[$INC, "PRE_INC"] postfixedExpression)
| DEC postfixedExpression -> ^(PRE_DEC[$DEC, "PRE_DEC"] postfixedExpression)
| unaryExpressionNotPlusMinus
;
unaryExpressionNotPlusMinus
: NOT unaryExpression -> ^(NOT unaryExpression)
| LOGICAL_NOT unaryExpression -> ^(LOGICAL_NOT unaryExpression)
| LPAREN type RPAREN unaryExpression -> ^(CAST_EXPR[$LPAREN, "CAST_EXPR"] type unaryExpression)
| postfixedExpression
;
postfixedExpression
// At first resolve the primary expression ...
: ( primaryExpression -> primaryExpression
)
// ... and than the optional things that may follow a primary expression 0 or more times.
( outerDot=DOT
( ( genericTypeArgumentListSimplified? // Note: generic type arguments are only valid for method calls, i.e. if there
// is an argument list.
IDENT -> ^(DOT $postfixedExpression IDENT)
)
( arguments -> ^(METHOD_CALL $postfixedExpression genericTypeArgumentListSimplified? arguments)
)?
| THIS -> ^(DOT $postfixedExpression THIS)
| Super=SUPER arguments -> ^(SUPER_CONSTRUCTOR_CALL[$Super, "SUPER_CONSTRUCTOR_CALL"] $postfixedExpression arguments)
| ( SUPER innerDot=DOT IDENT -> ^($innerDot ^($outerDot $postfixedExpression SUPER) IDENT)
)
( arguments -> ^(METHOD_CALL $postfixedExpression arguments)
)?
| innerNewExpression -> ^(DOT $postfixedExpression innerNewExpression)
)
| LBRACK expression RBRACK -> ^(ARRAY_ELEMENT_ACCESS $postfixedExpression expression)
)*
// At the end there may follow a post increment/decrement.
( INC -> ^(POST_INC[$INC, "POST_INC"] $postfixedExpression)
| DEC -> ^(POST_DEC[$DEC, "POST_DEC"] $postfixedExpression)
)?
;
primaryExpression
: parenthesizedExpression
| literal
| newExpression
| qualifiedIdentExpression
| genericTypeArgumentListSimplified
( SUPER
( arguments -> ^(SUPER_CONSTRUCTOR_CALL[$SUPER, "SUPER_CONSTRUCTOR_CALL"] genericTypeArgumentListSimplified arguments)
| DOT IDENT arguments -> ^(METHOD_CALL ^(DOT SUPER IDENT) genericTypeArgumentListSimplified arguments)
)
| IDENT arguments -> ^(METHOD_CALL IDENT genericTypeArgumentListSimplified arguments)
| THIS arguments -> ^(THIS_CONSTRUCTOR_CALL[$THIS, "THIS_CONSTRUCTOR_CALL"] genericTypeArgumentListSimplified arguments)
)
| ( THIS -> THIS
)
( arguments -> ^(THIS_CONSTRUCTOR_CALL[$THIS, "THIS_CONSTRUCTOR_CALL"] arguments)
)?
| SUPER arguments -> ^(SUPER_CONSTRUCTOR_CALL[$SUPER, "SUPER_CONSTRUCTOR_CALL"] arguments)
| ( SUPER DOT IDENT
)
( arguments -> ^(METHOD_CALL ^(DOT SUPER IDENT) arguments)
| -> ^(DOT SUPER IDENT)
)
| ( primitiveType -> primitiveType
)
( arrayDeclarator -> ^(arrayDeclarator $primaryExpression)
)*
DOT CLASS -> ^(DOT $primaryExpression CLASS)
| VOID DOT CLASS -> ^(DOT VOID CLASS)
;
qualifiedIdentExpression
// The qualified identifier itself is the starting point for this rule.
: ( qualifiedIdentifier -> qualifiedIdentifier
)
// And now comes the stuff that may follow the qualified identifier.
( ( arrayDeclarator -> ^(arrayDeclarator $qualifiedIdentExpression)
)+
( DOT CLASS -> ^(DOT $qualifiedIdentExpression CLASS)
)
| arguments -> ^(METHOD_CALL qualifiedIdentifier arguments)
| outerDot=DOT
( CLASS -> ^(DOT qualifiedIdentifier CLASS)
| genericTypeArgumentListSimplified
( Super=SUPER arguments -> ^(SUPER_CONSTRUCTOR_CALL[$Super, "SUPER_CONSTRUCTOR_CALL"] qualifiedIdentifier genericTypeArgumentListSimplified arguments)
| SUPER innerDot=DOT IDENT arguments -> ^(METHOD_CALL ^($innerDot ^($outerDot qualifiedIdentifier SUPER) IDENT) genericTypeArgumentListSimplified arguments)
| IDENT arguments -> ^(METHOD_CALL ^(DOT qualifiedIdentifier IDENT) genericTypeArgumentListSimplified arguments)
)
| THIS -> ^(DOT qualifiedIdentifier THIS)
| Super=SUPER arguments -> ^(SUPER_CONSTRUCTOR_CALL[$Super, "SUPER_CONSTRUCTOR_CALL"] qualifiedIdentifier arguments)
| innerNewExpression -> ^(DOT qualifiedIdentifier innerNewExpression)
)
)?
;
newExpression
: NEW
( primitiveType newArrayConstruction // new static array of primitive type elements
-> ^(STATIC_ARRAY_CREATOR[$NEW, "STATIC_ARRAY_CREATOR"] primitiveType newArrayConstruction)
| genericTypeArgumentListSimplified? qualifiedTypeIdentSimplified
( newArrayConstruction // new static array of object type reference elements
-> ^(STATIC_ARRAY_CREATOR[$NEW, "STATIC_ARRAY_CREATOR"] genericTypeArgumentListSimplified? qualifiedTypeIdentSimplified newArrayConstruction)
| arguments classBody? // new object type via constructor invocation
-> ^(CLASS_CONSTRUCTOR_CALL[$NEW, "STATIC_ARRAY_CREATOR"] genericTypeArgumentListSimplified? qualifiedTypeIdentSimplified arguments classBody?)
)
)
;
innerNewExpression // something like 'InnerType innerType = outer.new InnerType();'
: NEW genericTypeArgumentListSimplified? IDENT arguments classBody?
-> ^(CLASS_CONSTRUCTOR_CALL[$NEW, "STATIC_ARRAY_CREATOR"] genericTypeArgumentListSimplified? IDENT arguments classBody?)
;
newArrayConstruction
: arrayDeclaratorList arrayInitializer
| LBRACK! expression RBRACK! (LBRACK! expression RBRACK!)* arrayDeclaratorList?
;
arguments
: LPAREN expressionList? RPAREN
-> ^(ARGUMENT_LIST[$LPAREN, "ARGUMENT_LIST"] expressionList?)
;
literal
: HEX_LITERAL
| OCTAL_LITERAL
| DECIMAL_LITERAL
| FLOATING_POINT_LITERAL
| CHARACTER_LITERAL
| STRING_LITERAL
| TRUE
| FALSE
| NULL
;
// LEXER
HEX_LITERAL : '0' ('x'|'X') HEX_DIGIT+ INTEGER_TYPE_SUFFIX? ;
DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) INTEGER_TYPE_SUFFIX? ;
OCTAL_LITERAL : '0' ('0'..'7')+ INTEGER_TYPE_SUFFIX? ;
fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
fragment
INTEGER_TYPE_SUFFIX : ('l'|'L') ;
FLOATING_POINT_LITERAL
: ('0'..'9')+
(
DOT ('0'..'9')* EXPONENT? FLOAT_TYPE_SUFFIX?
| EXPONENT FLOAT_TYPE_SUFFIX?
| FLOAT_TYPE_SUFFIX
)
| DOT ('0'..'9')+ EXPONENT? FLOAT_TYPE_SUFFIX?
;
fragment
EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
fragment
FLOAT_TYPE_SUFFIX : ('f'|'F'|'d'|'D') ;
CHARACTER_LITERAL
: '\'' ( ESCAPE_SEQUENCE | ~('\''|'\\') ) '\''
;
STRING_LITERAL
: '"' ( ESCAPE_SEQUENCE | ~('\\'|'"') )* '"'
;
fragment
ESCAPE_SEQUENCE
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
| UNICODE_ESCAPE
| OCTAL_ESCAPE
;
fragment
OCTAL_ESCAPE
: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
| '\\' ('0'..'7') ('0'..'7')
| '\\' ('0'..'7')
;
fragment
UNICODE_ESCAPE
: '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
;
IDENT
: JAVA_ID_START (JAVA_ID_PART)*
;
fragment
JAVA_ID_START
: '\u0024'
| '\u0041'..'\u005a'
| '\u005f'
| '\u0061'..'\u007a'
| '\u00c0'..'\u00d6'
| '\u00d8'..'\u00f6'
| '\u00f8'..'\u00ff'
| '\u0100'..'\u1fff'
| '\u3040'..'\u318f'
| '\u3300'..'\u337f'
| '\u3400'..'\u3d2d'
| '\u4e00'..'\u9fff'
| '\uf900'..'\ufaff'
;
fragment
JAVA_ID_PART
: JAVA_ID_START
| '\u0030'..'\u0039'
;
WS : (' '|'\r'|'\t'|'\u000C'|'\n')
{
if (!preserveWhitespacesAndComments) {
skip();
} else {
$channel = HIDDEN;
}
}
;
COMMENT
: '/*' ( options {greedy=false;} : . )* '*/'
{
if (!preserveWhitespacesAndComments) {
skip();
} else {
$channel = HIDDEN;
}
}
;
LINE_COMMENT
: '//' ~('\n'|'\r')* '\r'? '\n'
{
if (!preserveWhitespacesAndComments) {
skip();
} else {
$channel = HIDDEN;
}
}
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -