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