1/*
2 [The "BSD licence"]
3 Copyright (c) 2013 Terence Parr, Sam Harwell
4 All rights reserved.
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions
7 are met:
8 1. Redistributions of source code must retain the above copyright
9    notice, this list of conditions and the following disclaimer.
10 2. Redistributions in binary form must reproduce the above copyright
11    notice, this list of conditions and the following disclaimer in the
12    documentation and/or other materials provided with the distribution.
13 3. The name of the author may not be used to endorse or promote products
14    derived from this software without specific prior written permission.
15 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*/
26grammar BindingExpression;
27
28bindingSyntax
29    :   expression defaults?
30    ;
31
32defaults
33    :   ',' 'default' '=' constantValue
34    ;
35constantValue
36    :   literal
37    |   ResourceReference
38    |   identifier
39    ;
40
41expression
42    :   '(' expression ')'                              # Grouping
43// this isn't allowed yet.
44//    |   THIS                                            # Primary
45    |   literal                                         # Primary
46    |   identifier                                      # Primary
47    |   classExtraction                                 # Primary
48    |   resources                                       # Resource
49//    |   typeArguments (explicitGenericInvocationSuffix | 'this' arguments) # GenericCall
50    |   expression '.' Identifier                       # DotOp
51//    |   expression '.' 'this'                           # ThisReference
52//    |   expression '.' explicitGenericInvocation        # ExplicitGenericInvocationOp
53    |   expression '[' expression ']'                   # BracketOp
54    |   target=expression '.' methodName=Identifier '(' args=expressionList? ')' # MethodInvocation
55    |   '(' type ')' expression                         # CastOp
56    |   op=('+'|'-') expression                         # UnaryOp
57    |   op=('~'|'!') expression                         # UnaryOp
58    |   left=expression op=('*'|'/'|'%') right=expression             # MathOp
59    |   left=expression op=('+'|'-') right=expression                 # MathOp
60    |   left=expression op=('<<' | '>>>' | '>>') right=expression     # BitShiftOp
61    |   left=expression op=('<=' | '>=' | '>' | '<') right=expression # ComparisonOp
62    |   expression 'instanceof' type                    # InstanceOfOp
63    |   left=expression op=('==' | '!=') right=expression             # ComparisonOp
64    |   left=expression op='&' right=expression                       # BinaryOp
65    |   left=expression op='^' right=expression                       # BinaryOp
66    |   left=expression op='|' right=expression                       # BinaryOp
67    |   left=expression op='&&' right=expression                      # AndOrOp
68    |   left=expression op='||' right=expression                      # AndOrOp
69    |   <assoc=right>left=expression op='?' iftrue=expression ':' iffalse=expression # TernaryOp
70    |   left=expression op='??' right=expression                      # QuestionQuestionOp
71    ;
72
73THIS
74    :   'this'
75    ;
76
77classExtraction
78    :   type '.' 'class'
79    |   'void' '.' 'class'
80    ;
81
82expressionList
83    :   expression (',' expression)*
84    ;
85
86literal
87    :   javaLiteral
88    |   stringLiteral
89    ;
90
91identifier
92    :   Identifier
93    ;
94
95javaLiteral
96    :   IntegerLiteral
97    |   FloatingPointLiteral
98    |   BooleanLiteral
99    |   NullLiteral
100    |   CharacterLiteral
101    ;
102
103stringLiteral
104    :   SingleQuoteString
105    |   DoubleQuoteString
106    ;
107
108explicitGenericInvocation
109    :   typeArguments explicitGenericInvocationSuffix
110    ;
111
112typeArguments
113    :   '<' type (',' type)* '>'
114    ;
115
116type
117    :   classOrInterfaceType ('[' ']')*
118    |   primitiveType ('[' ']')*
119    ;
120
121explicitGenericInvocationSuffix
122    :   Identifier arguments
123    ;
124
125arguments
126    :   '(' expressionList? ')'
127    ;
128
129classOrInterfaceType
130    :   identifier typeArguments? ('.' Identifier typeArguments? )*
131    ;
132
133primitiveType
134    :   'boolean'
135    |   'char'
136    |   'byte'
137    |   'short'
138    |   'int'
139    |   'long'
140    |   'float'
141    |   'double'
142    ;
143
144resources
145    :   ResourceReference resourceParameters?
146    ;
147
148resourceParameters
149    :   '(' expressionList ')'
150    ;
151
152// LEXER
153
154// §3.10.1 Integer Literals
155
156IntegerLiteral
157    :   DecimalIntegerLiteral
158    |   HexIntegerLiteral
159    |   OctalIntegerLiteral
160    |   BinaryIntegerLiteral
161    ;
162
163fragment
164DecimalIntegerLiteral
165    :   DecimalNumeral IntegerTypeSuffix?
166    ;
167
168fragment
169HexIntegerLiteral
170    :   HexNumeral IntegerTypeSuffix?
171    ;
172
173fragment
174OctalIntegerLiteral
175    :   OctalNumeral IntegerTypeSuffix?
176    ;
177
178fragment
179BinaryIntegerLiteral
180    :   BinaryNumeral IntegerTypeSuffix?
181    ;
182
183fragment
184IntegerTypeSuffix
185    :   [lL]
186    ;
187
188fragment
189DecimalNumeral
190    :   '0'
191    |   NonZeroDigit (Digits? | Underscores Digits)
192    ;
193
194fragment
195Digits
196    :   Digit (DigitOrUnderscore* Digit)?
197    ;
198
199fragment
200Digit
201    :   '0'
202    |   NonZeroDigit
203    ;
204
205fragment
206NonZeroDigit
207    :   [1-9]
208    ;
209
210fragment
211DigitOrUnderscore
212    :   Digit
213    |   '_'
214    ;
215
216fragment
217Underscores
218    :   '_'+
219    ;
220
221fragment
222HexNumeral
223    :   '0' [xX] HexDigits
224    ;
225
226fragment
227HexDigits
228    :   HexDigit (HexDigitOrUnderscore* HexDigit)?
229    ;
230
231fragment
232HexDigit
233    :   [0-9a-fA-F]
234    ;
235
236fragment
237HexDigitOrUnderscore
238    :   HexDigit
239    |   '_'
240    ;
241
242fragment
243OctalNumeral
244    :   '0' Underscores? OctalDigits
245    ;
246
247fragment
248OctalDigits
249    :   OctalDigit (OctalDigitOrUnderscore* OctalDigit)?
250    ;
251
252fragment
253OctalDigit
254    :   [0-7]
255    ;
256
257fragment
258OctalDigitOrUnderscore
259    :   OctalDigit
260    |   '_'
261    ;
262
263fragment
264BinaryNumeral
265    :   '0' [bB] BinaryDigits
266    ;
267
268fragment
269BinaryDigits
270    :   BinaryDigit (BinaryDigitOrUnderscore* BinaryDigit)?
271    ;
272
273fragment
274BinaryDigit
275    :   [01]
276    ;
277
278fragment
279BinaryDigitOrUnderscore
280    :   BinaryDigit
281    |   '_'
282    ;
283
284// §3.10.2 Floating-Point Literals
285
286FloatingPointLiteral
287    :   DecimalFloatingPointLiteral
288    |   HexadecimalFloatingPointLiteral
289    ;
290
291fragment
292DecimalFloatingPointLiteral
293    :   Digits '.' Digits? ExponentPart? FloatTypeSuffix?
294    |   '.' Digits ExponentPart? FloatTypeSuffix?
295    |   Digits ExponentPart FloatTypeSuffix?
296    |   Digits FloatTypeSuffix
297    ;
298
299fragment
300ExponentPart
301    :   ExponentIndicator SignedInteger
302    ;
303
304fragment
305ExponentIndicator
306    :   [eE]
307    ;
308
309fragment
310SignedInteger
311    :   Sign? Digits
312    ;
313
314fragment
315Sign
316    :   [+-]
317    ;
318
319fragment
320FloatTypeSuffix
321    :   [fFdD]
322    ;
323
324fragment
325HexadecimalFloatingPointLiteral
326    :   HexSignificand BinaryExponent FloatTypeSuffix?
327    ;
328
329fragment
330HexSignificand
331    :   HexNumeral '.'?
332    |   '0' [xX] HexDigits? '.' HexDigits
333    ;
334
335fragment
336BinaryExponent
337    :   BinaryExponentIndicator SignedInteger
338    ;
339
340fragment
341BinaryExponentIndicator
342    :   [pP]
343    ;
344
345// §3.10.3 Boolean Literals
346
347BooleanLiteral
348    :   'true'
349    |   'false'
350    ;
351
352// §3.10.4 Character Literals
353
354CharacterLiteral
355    :   '\'' SingleCharacter '\''
356    |   '\'' EscapeSequence '\''
357    ;
358
359fragment
360SingleCharacter
361    :   ~['\\]
362    ;
363// §3.10.5 String Literals
364SingleQuoteString
365    :   '`' SingleQuoteStringCharacter* '`'
366    ;
367
368DoubleQuoteString
369    :   '"' StringCharacters? '"'
370    ;
371
372fragment
373StringCharacters
374    :   StringCharacter+
375    ;
376fragment
377StringCharacter
378    :   ~["\\]
379    |   EscapeSequence
380    ;
381fragment
382SingleQuoteStringCharacter
383    :   ~[`\\]
384    |   EscapeSequence
385    ;
386
387// §3.10.6 Escape Sequences for Character and String Literals
388fragment
389EscapeSequence
390    :   '\\' [btnfr"'`\\]
391    |   OctalEscape
392    |   UnicodeEscape
393    ;
394
395fragment
396OctalEscape
397    :   '\\' OctalDigit
398    |   '\\' OctalDigit OctalDigit
399    |   '\\' ZeroToThree OctalDigit OctalDigit
400    ;
401
402fragment
403UnicodeEscape
404    :   '\\' 'u' HexDigit HexDigit HexDigit HexDigit
405    ;
406
407fragment
408ZeroToThree
409    :   [0-3]
410    ;
411
412// §3.10.7 The Null Literal
413
414NullLiteral
415    :   'null'
416    ;
417
418// §3.8 Identifiers (must appear after all keywords in the grammar)
419
420Identifier
421    :   JavaLetter JavaLetterOrDigit*
422    ;
423
424fragment
425JavaLetter
426    :   [a-zA-Z$_] // these are the "java letters" below 0xFF
427    |   // covers all characters above 0xFF which are not a surrogate
428        ~[\u0000-\u00FF\uD800-\uDBFF]
429        {Character.isJavaIdentifierStart(_input.LA(-1))}?
430    |   // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
431        [\uD800-\uDBFF] [\uDC00-\uDFFF]
432        {Character.isJavaIdentifierStart(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
433    ;
434
435fragment
436JavaLetterOrDigit
437    :   [a-zA-Z0-9$_] // these are the "java letters or digits" below 0xFF
438    |   // covers all characters above 0xFF which are not a surrogate
439        ~[\u0000-\u00FF\uD800-\uDBFF]
440        {Character.isJavaIdentifierPart(_input.LA(-1))}?
441    |   // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
442        [\uD800-\uDBFF] [\uDC00-\uDFFF]
443        {Character.isJavaIdentifierPart(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
444    ;
445
446//
447// Whitespace and comments
448//
449
450WS  :  [ \t\r\n\u000C]+ -> skip
451    ;
452
453//
454// Resource references
455//
456
457ResourceReference
458    :   '@' (PackageName ':')? ResourceType '/' Identifier
459    ;
460
461PackageName
462    :   'android'
463    |   Identifier
464    ;
465
466ResourceType
467    :   'anim'
468    |   'animator'
469    |   'bool'
470    |   'color'
471    |   'colorStateList'
472    |   'dimen'
473    |   'dimenOffset'
474    |   'dimenSize'
475    |   'drawable'
476    |   'fraction'
477    |   'id'
478    |   'integer'
479    |   'intArray'
480    |   'interpolator'
481    |   'layout'
482    |   'plurals'
483    |   'stateListAnimator'
484    |   'string'
485    |   'stringArray'
486    |   'transition'
487    |   'typedArray'
488    ;
489