blob: cfd73f1a48b653893c582f75b4c897e9c03f3786 [file] [log] [blame]
George Mountc09acd42015-01-07 16:34:06 -08001/*
2 * This grammar is a tweaked subset of that in Java.g4, which has a
3 * BSD license and is redistributed along with this.
4 */
5grammar BindingExpression;
6
7bindingSyntax
George Mountc09acd42015-01-07 16:34:06 -08008 : expression defaults?
9 ;
10
11defaults
12 : ',' 'default' '=' constantValue
13 ;
14constantValue
15 : literal
16 | ResourceReference
George Mountc09acd42015-01-07 16:34:06 -080017 | identifier
18 ;
19
20expression
21 : '(' expression ')' # Grouping
22// this isn't allowed yet.
23// | THIS # Primary
24 | literal # Primary
25 | identifier # Primary
26 | classExtraction # Primary
George Mountae7cb822015-02-23 15:43:53 -080027 | resources # Resource
George Mountd0717692015-01-26 16:57:04 -080028// | typeArguments (explicitGenericInvocationSuffix | 'this' arguments) # GenericCall
George Mountc09acd42015-01-07 16:34:06 -080029 | expression '.' Identifier # DotOp
30// | expression '.' 'this' # ThisReference
George Mountd0717692015-01-26 16:57:04 -080031// | expression '.' explicitGenericInvocation # ExplicitGenericInvocationOp
George Mountc09acd42015-01-07 16:34:06 -080032 | expression '[' expression ']' # BracketOp
Yigit Boyard7af42b2015-01-09 14:23:33 -080033 | target=expression '.' methodName=Identifier '(' args=expressionList? ')' # MethodInvocation
George Mountc09acd42015-01-07 16:34:06 -080034 | '(' type ')' expression # CastOp
George Mountd0717692015-01-26 16:57:04 -080035 | op=('+'|'-') expression # UnaryOp
36 | op=('~'|'!') expression # UnaryOp
Yigit Boyar35e303e2015-01-09 10:43:24 -080037 | left=expression op=('*'|'/'|'%') right=expression # MathOp
38 | left=expression op=('+'|'-') right=expression # MathOp
39 | left=expression op=('<<' | '>>>' | '>>') right=expression # BitShiftOp
40 | left=expression op=('<=' | '>=' | '>' | '<') right=expression # ComparisonOp
George Mountc09acd42015-01-07 16:34:06 -080041 | expression 'instanceof' type # InstanceOfOp
Yigit Boyar35e303e2015-01-09 10:43:24 -080042 | left=expression op=('==' | '!=') right=expression # ComparisonOp
43 | left=expression op='&' right=expression # BinaryOp
44 | left=expression op='^' right=expression # BinaryOp
45 | left=expression op='|' right=expression # BinaryOp
46 | left=expression op='&&' right=expression # AndOrOp
47 | left=expression op='||' right=expression # AndOrOp
48 | left=expression op='?' iftrue=expression ':' iffalse=expression # TernaryOp
49 | left=expression op='??' right=expression # QuestionQuestionOp
George Mountc09acd42015-01-07 16:34:06 -080050 ;
51
52THIS
53 : 'this'
54 ;
55
56classExtraction
57 : type '.' 'class'
58 | 'void' '.' 'class'
59 ;
60
61expressionList
62 : expression (',' expression)*
63 ;
64
65literal
66 : javaLiteral
67 | stringLiteral
68 ;
69
70identifier
71 : Identifier
72 ;
73
74javaLiteral
75 : IntegerLiteral
76 | FloatingPointLiteral
77 | BooleanLiteral
78 | NullLiteral
79 | CharacterLiteral
80 ;
81
82stringLiteral
83 : SingleQuoteString
84 | DoubleQuoteString
85 ;
86
87explicitGenericInvocation
88 : typeArguments explicitGenericInvocationSuffix
89 ;
90
91typeArguments
92 : '<' type (',' type)* '>'
93 ;
94
95type
96 : classOrInterfaceType ('[' ']')*
97 | primitiveType ('[' ']')*
98 ;
99
100explicitGenericInvocationSuffix
101 : Identifier arguments
102 ;
103
104arguments
105 : '(' expressionList? ')'
106 ;
107
108classOrInterfaceType
109 : identifier typeArguments? ('.' Identifier typeArguments? )*
110 ;
111
112primitiveType
113 : 'boolean'
114 | 'char'
115 | 'byte'
116 | 'short'
117 | 'int'
118 | 'long'
119 | 'float'
120 | 'double'
121 ;
122
George Mountae7cb822015-02-23 15:43:53 -0800123resources
124 : ResourceReference resourceParameters?
125 ;
126
127resourceParameters
128 : '(' expressionList ')'
129 ;
130
George Mountc09acd42015-01-07 16:34:06 -0800131// LEXER
132
133// §3.10.1 Integer Literals
134
135IntegerLiteral
136 : DecimalIntegerLiteral
137 | HexIntegerLiteral
138 | OctalIntegerLiteral
139 | BinaryIntegerLiteral
140 ;
141
142fragment
143DecimalIntegerLiteral
144 : DecimalNumeral IntegerTypeSuffix?
145 ;
146
147fragment
148HexIntegerLiteral
149 : HexNumeral IntegerTypeSuffix?
150 ;
151
152fragment
153OctalIntegerLiteral
154 : OctalNumeral IntegerTypeSuffix?
155 ;
156
157fragment
158BinaryIntegerLiteral
159 : BinaryNumeral IntegerTypeSuffix?
160 ;
161
162fragment
163IntegerTypeSuffix
164 : [lL]
165 ;
166
167fragment
168DecimalNumeral
169 : '0'
170 | NonZeroDigit (Digits? | Underscores Digits)
171 ;
172
173fragment
174Digits
175 : Digit (DigitOrUnderscore* Digit)?
176 ;
177
178fragment
179Digit
180 : '0'
181 | NonZeroDigit
182 ;
183
184fragment
185NonZeroDigit
186 : [1-9]
187 ;
188
189fragment
190DigitOrUnderscore
191 : Digit
192 | '_'
193 ;
194
195fragment
196Underscores
197 : '_'+
198 ;
199
200fragment
201HexNumeral
202 : '0' [xX] HexDigits
203 ;
204
205fragment
206HexDigits
207 : HexDigit (HexDigitOrUnderscore* HexDigit)?
208 ;
209
210fragment
211HexDigit
212 : [0-9a-fA-F]
213 ;
214
215fragment
216HexDigitOrUnderscore
217 : HexDigit
218 | '_'
219 ;
220
221fragment
222OctalNumeral
223 : '0' Underscores? OctalDigits
224 ;
225
226fragment
227OctalDigits
228 : OctalDigit (OctalDigitOrUnderscore* OctalDigit)?
229 ;
230
231fragment
232OctalDigit
233 : [0-7]
234 ;
235
236fragment
237OctalDigitOrUnderscore
238 : OctalDigit
239 | '_'
240 ;
241
242fragment
243BinaryNumeral
244 : '0' [bB] BinaryDigits
245 ;
246
247fragment
248BinaryDigits
249 : BinaryDigit (BinaryDigitOrUnderscore* BinaryDigit)?
250 ;
251
252fragment
253BinaryDigit
254 : [01]
255 ;
256
257fragment
258BinaryDigitOrUnderscore
259 : BinaryDigit
260 | '_'
261 ;
262
263// §3.10.2 Floating-Point Literals
264
265FloatingPointLiteral
266 : DecimalFloatingPointLiteral
267 | HexadecimalFloatingPointLiteral
268 ;
269
270fragment
271DecimalFloatingPointLiteral
272 : Digits '.' Digits? ExponentPart? FloatTypeSuffix?
273 | '.' Digits ExponentPart? FloatTypeSuffix?
274 | Digits ExponentPart FloatTypeSuffix?
275 | Digits FloatTypeSuffix
276 ;
277
278fragment
279ExponentPart
280 : ExponentIndicator SignedInteger
281 ;
282
283fragment
284ExponentIndicator
285 : [eE]
286 ;
287
288fragment
289SignedInteger
290 : Sign? Digits
291 ;
292
293fragment
294Sign
295 : [+-]
296 ;
297
298fragment
299FloatTypeSuffix
300 : [fFdD]
301 ;
302
303fragment
304HexadecimalFloatingPointLiteral
305 : HexSignificand BinaryExponent FloatTypeSuffix?
306 ;
307
308fragment
309HexSignificand
310 : HexNumeral '.'?
311 | '0' [xX] HexDigits? '.' HexDigits
312 ;
313
314fragment
315BinaryExponent
316 : BinaryExponentIndicator SignedInteger
317 ;
318
319fragment
320BinaryExponentIndicator
321 : [pP]
322 ;
323
324// §3.10.3 Boolean Literals
325
326BooleanLiteral
327 : 'true'
328 | 'false'
329 ;
330
331// §3.10.4 Character Literals
332
333CharacterLiteral
334 : '\'' SingleCharacter '\''
335 | '\'' EscapeSequence '\''
336 ;
337
338fragment
339SingleCharacter
340 : ~['\\]
341 ;
342// §3.10.5 String Literals
343SingleQuoteString
George Mount7920e172015-02-05 16:02:46 -0800344 : '`' SingleQuoteStringCharacter* '`'
George Mountc09acd42015-01-07 16:34:06 -0800345 ;
346
347DoubleQuoteString
348 : '"' StringCharacters? '"'
349 ;
350
351fragment
352StringCharacters
353 : StringCharacter+
354 ;
355fragment
356StringCharacter
357 : ~["\\]
358 | EscapeSequence
359 ;
360fragment
361SingleQuoteStringCharacter
362 : ~[`\\]
363 | EscapeSequence
364 ;
365
366// §3.10.6 Escape Sequences for Character and String Literals
367fragment
368EscapeSequence
369 : '\\' [btnfr"'`\\]
370 | OctalEscape
371 | UnicodeEscape
372 ;
373
374fragment
375OctalEscape
376 : '\\' OctalDigit
377 | '\\' OctalDigit OctalDigit
378 | '\\' ZeroToThree OctalDigit OctalDigit
379 ;
380
381fragment
382UnicodeEscape
383 : '\\' 'u' HexDigit HexDigit HexDigit HexDigit
384 ;
385
386fragment
387ZeroToThree
388 : [0-3]
389 ;
390
391// §3.10.7 The Null Literal
392
393NullLiteral
394 : 'null'
395 ;
396
397// §3.8 Identifiers (must appear after all keywords in the grammar)
398
399Identifier
400 : JavaLetter JavaLetterOrDigit*
401 ;
402
403fragment
404JavaLetter
405 : [a-zA-Z$_] // these are the "java letters" below 0xFF
406 | // covers all characters above 0xFF which are not a surrogate
407 ~[\u0000-\u00FF\uD800-\uDBFF]
408 {Character.isJavaIdentifierStart(_input.LA(-1))}?
409 | // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
410 [\uD800-\uDBFF] [\uDC00-\uDFFF]
411 {Character.isJavaIdentifierStart(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
412 ;
413
414fragment
415JavaLetterOrDigit
416 : [a-zA-Z0-9$_] // these are the "java letters or digits" below 0xFF
417 | // covers all characters above 0xFF which are not a surrogate
418 ~[\u0000-\u00FF\uD800-\uDBFF]
419 {Character.isJavaIdentifierPart(_input.LA(-1))}?
420 | // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
421 [\uD800-\uDBFF] [\uDC00-\uDFFF]
422 {Character.isJavaIdentifierPart(Character.toCodePoint((char)_input.LA(-2), (char)_input.LA(-1)))}?
423 ;
424
425//
426// Whitespace and comments
427//
428
429WS : [ \t\r\n\u000C]+ -> skip
430 ;
431
432//
433// Resource references
434//
435
436ResourceReference
George Mountae7cb822015-02-23 15:43:53 -0800437 : '@' (PackageName ':')? ResourceType '/' Identifier
George Mountc09acd42015-01-07 16:34:06 -0800438 ;
439
George Mountc09acd42015-01-07 16:34:06 -0800440PackageName
441 : 'android'
442 | Identifier
443 ;
444
George Mountc09acd42015-01-07 16:34:06 -0800445ResourceType
446 : 'anim'
447 | 'animator'
George Mountc09acd42015-01-07 16:34:06 -0800448 | 'bool'
449 | 'color'
George Mountc752a5f2015-01-21 16:24:43 -0800450 | 'colorStateList'
George Mountc09acd42015-01-07 16:34:06 -0800451 | 'dimen'
George Mountc752a5f2015-01-21 16:24:43 -0800452 | 'dimenOffset'
453 | 'dimenSize'
George Mountc09acd42015-01-07 16:34:06 -0800454 | 'drawable'
455 | 'fraction'
456 | 'id'
457 | 'integer'
George Mountc752a5f2015-01-21 16:24:43 -0800458 | 'intArray'
George Mountc09acd42015-01-07 16:34:06 -0800459 | 'interpolator'
460 | 'layout'
George Mountc09acd42015-01-07 16:34:06 -0800461 | 'plurals'
George Mountc752a5f2015-01-21 16:24:43 -0800462 | 'stateListAnimator'
George Mountc09acd42015-01-07 16:34:06 -0800463 | 'string'
George Mountc752a5f2015-01-21 16:24:43 -0800464 | 'stringArray'
George Mountc09acd42015-01-07 16:34:06 -0800465 | 'transition'
George Mountc752a5f2015-01-21 16:24:43 -0800466 | 'typedArray'
George Mountc09acd42015-01-07 16:34:06 -0800467 ;