| /* |
| [The "BSD licence"] |
| Copyright (c) 2013 Terence Parr, Sam Harwell |
| 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. |
| */ |
| grammar BindingExpression; |
| |
| bindingSyntax |
| : expression defaults? |
| ; |
| |
| defaults |
| : ',' 'default' '=' constantValue |
| ; |
| constantValue |
| : literal |
| | ResourceReference |
| | identifier |
| ; |
| |
| expression |
| : '(' expression ')' # Grouping |
| // this isn't allowed yet. |
| // | THIS # Primary |
| | literal # Primary |
| | identifier # Primary |
| | classExtraction # Primary |
| | resources # Resource |
| // | typeArguments (explicitGenericInvocationSuffix | 'this' arguments) # GenericCall |
| | expression '.' Identifier # DotOp |
| // | expression '.' 'this' # ThisReference |
| // | expression '.' explicitGenericInvocation # ExplicitGenericInvocationOp |
| | expression '[' expression ']' # BracketOp |
| | target=expression '.' methodName=Identifier '(' args=expressionList? ')' # MethodInvocation |
| | '(' type ')' expression # CastOp |
| | op=('+'|'-') expression # UnaryOp |
| | op=('~'|'!') expression # UnaryOp |
| | left=expression op=('*'|'/'|'%') right=expression # MathOp |
| | left=expression op=('+'|'-') right=expression # MathOp |
| | left=expression op=('<<' | '>>>' | '>>') right=expression # BitShiftOp |
| | left=expression op=('<=' | '>=' | '>' | '<') right=expression # ComparisonOp |
| | expression 'instanceof' type # InstanceOfOp |
| | left=expression op=('==' | '!=') right=expression # ComparisonOp |
| | left=expression op='&' right=expression # BinaryOp |
| | left=expression op='^' right=expression # BinaryOp |
| | left=expression op='|' right=expression # BinaryOp |
| | left=expression op='&&' right=expression # AndOrOp |
| | left=expression op='||' right=expression # AndOrOp |
| | left=expression op='?' iftrue=expression ':' iffalse=expression # TernaryOp |
| | left=expression op='??' right=expression # QuestionQuestionOp |
| ; |
| |
| THIS |
| : 'this' |
| ; |
| |
| classExtraction |
| : type '.' 'class' |
| | 'void' '.' 'class' |
| ; |
| |
| expressionList |
| : expression (',' expression)* |
| ; |
| |
| literal |
| : javaLiteral |
| | stringLiteral |
| ; |
| |
| identifier |
| : Identifier |
| ; |
| |
| javaLiteral |
| : IntegerLiteral |
| | FloatingPointLiteral |
| | BooleanLiteral |
| | NullLiteral |
| | CharacterLiteral |
| ; |
| |
| stringLiteral |
| : SingleQuoteString |
| | DoubleQuoteString |
| ; |
| |
| explicitGenericInvocation |
| : typeArguments explicitGenericInvocationSuffix |
| ; |
| |
| typeArguments |
| : '<' type (',' type)* '>' |
| ; |
| |
| type |
| : classOrInterfaceType ('[' ']')* |
| | primitiveType ('[' ']')* |
| ; |
| |
| explicitGenericInvocationSuffix |
| : Identifier arguments |
| ; |
| |
| arguments |
| : '(' expressionList? ')' |
| ; |
| |
| classOrInterfaceType |
| : identifier typeArguments? ('.' Identifier typeArguments? )* |
| ; |
| |
| primitiveType |
| : 'boolean' |
| | 'char' |
| | 'byte' |
| | 'short' |
| | 'int' |
| | 'long' |
| | 'float' |
| | 'double' |
| ; |
| |
| resources |
| : ResourceReference resourceParameters? |
| ; |
| |
| resourceParameters |
| : '(' expressionList ')' |
| ; |
| |
| // LEXER |
| |
| // §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 (DigitOrUnderscore* Digit)? |
| ; |
| |
| fragment |
| Digit |
| : '0' |
| | NonZeroDigit |
| ; |
| |
| fragment |
| NonZeroDigit |
| : [1-9] |
| ; |
| |
| fragment |
| DigitOrUnderscore |
| : Digit |
| | '_' |
| ; |
| |
| fragment |
| Underscores |
| : '_'+ |
| ; |
| |
| fragment |
| HexNumeral |
| : '0' [xX] HexDigits |
| ; |
| |
| fragment |
| HexDigits |
| : HexDigit (HexDigitOrUnderscore* HexDigit)? |
| ; |
| |
| fragment |
| HexDigit |
| : [0-9a-fA-F] |
| ; |
| |
| fragment |
| HexDigitOrUnderscore |
| : HexDigit |
| | '_' |
| ; |
| |
| fragment |
| OctalNumeral |
| : '0' Underscores? OctalDigits |
| ; |
| |
| fragment |
| OctalDigits |
| : OctalDigit (OctalDigitOrUnderscore* OctalDigit)? |
| ; |
| |
| fragment |
| OctalDigit |
| : [0-7] |
| ; |
| |
| fragment |
| OctalDigitOrUnderscore |
| : OctalDigit |
| | '_' |
| ; |
| |
| fragment |
| BinaryNumeral |
| : '0' [bB] BinaryDigits |
| ; |
| |
| fragment |
| BinaryDigits |
| : BinaryDigit (BinaryDigitOrUnderscore* BinaryDigit)? |
| ; |
| |
| fragment |
| BinaryDigit |
| : [01] |
| ; |
| |
| 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 |
| : ~['\\] |
| ; |
| // §3.10.5 String Literals |
| SingleQuoteString |
| : '`' SingleQuoteStringCharacter* '`' |
| ; |
| |
| DoubleQuoteString |
| : '"' StringCharacters? '"' |
| ; |
| |
| fragment |
| StringCharacters |
| : StringCharacter+ |
| ; |
| fragment |
| StringCharacter |
| : ~["\\] |
| | EscapeSequence |
| ; |
| fragment |
| SingleQuoteStringCharacter |
| : ~[`\\] |
| | EscapeSequence |
| ; |
| |
| // §3.10.6 Escape Sequences for Character and String Literals |
| fragment |
| EscapeSequence |
| : '\\' [btnfr"'`\\] |
| | OctalEscape |
| | UnicodeEscape |
| ; |
| |
| fragment |
| OctalEscape |
| : '\\' OctalDigit |
| | '\\' OctalDigit OctalDigit |
| | '\\' ZeroToThree OctalDigit OctalDigit |
| ; |
| |
| fragment |
| UnicodeEscape |
| : '\\' 'u' HexDigit HexDigit HexDigit HexDigit |
| ; |
| |
| fragment |
| ZeroToThree |
| : [0-3] |
| ; |
| |
| // §3.10.7 The Null Literal |
| |
| NullLiteral |
| : 'null' |
| ; |
| |
| // §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 0xFF |
| | // covers all characters above 0xFF which are not a surrogate |
| ~[\u0000-\u00FF\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 0xFF |
| | // covers all characters above 0xFF which are not a surrogate |
| ~[\u0000-\u00FF\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 |
| ; |
| |
| // |
| // Resource references |
| // |
| |
| ResourceReference |
| : '@' (PackageName ':')? ResourceType '/' Identifier |
| ; |
| |
| PackageName |
| : 'android' |
| | Identifier |
| ; |
| |
| ResourceType |
| : 'anim' |
| | 'animator' |
| | 'bool' |
| | 'color' |
| | 'colorStateList' |
| | 'dimen' |
| | 'dimenOffset' |
| | 'dimenSize' |
| | 'drawable' |
| | 'fraction' |
| | 'id' |
| | 'integer' |
| | 'intArray' |
| | 'interpolator' |
| | 'layout' |
| | 'plurals' |
| | 'stateListAnimator' |
| | 'string' |
| | 'stringArray' |
| | 'transition' |
| | 'typedArray' |
| ; |