OLD | NEW |
| (Empty) |
1 part of petitparser.dart; | |
2 | |
3 /// Dart grammar. | |
4 class DartGrammar extends GrammarParser { | |
5 DartGrammar() : super(new DartGrammarDefinition()); | |
6 } | |
7 | |
8 /// Dart grammar definition. | |
9 class DartGrammarDefinition extends GrammarDefinition { | |
10 | |
11 Parser token(input) { | |
12 if (input is String) { | |
13 input = input.length == 1 ? char(input) : string(input); | |
14 } else if (input is Function) { | |
15 input = ref(input); | |
16 } | |
17 if (input is! Parser && input is TrimmingParser) { | |
18 throw new StateError('Invalid token parser: $input'); | |
19 } | |
20 return input.token().trim(ref(HIDDEN_STUFF)); | |
21 } | |
22 | |
23 | |
24 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
25 // for details. All rights reserved. Use of this source code is governed by a | |
26 // BSD-style license that can be found in the LICENSE file. | |
27 | |
28 // ----------------------------------------------------------------- | |
29 // Keyword definitions. | |
30 // ----------------------------------------------------------------- | |
31 BREAK() => ref(token, 'break'); | |
32 CASE() => ref(token, 'case'); | |
33 CATCH() => ref(token, 'catch'); | |
34 CONST() => ref(token, 'const'); | |
35 CONTINUE() => ref(token, 'continue'); | |
36 DEFAULT() => ref(token, 'default'); | |
37 DO() => ref(token, 'do'); | |
38 ELSE() => ref(token, 'else'); | |
39 FALSE() => ref(token, 'false'); | |
40 FINAL() => ref(token, 'final'); | |
41 FINALLY() => ref(token, 'finally'); | |
42 FOR() => ref(token, 'for'); | |
43 IF() => ref(token, 'if'); | |
44 IN() => ref(token, 'in'); | |
45 NEW() => ref(token, 'new'); | |
46 NULL() => ref(token, 'null'); | |
47 RETURN() => ref(token, 'return'); | |
48 SUPER() => ref(token, 'super'); | |
49 SWITCH() => ref(token, 'switch'); | |
50 THIS() => ref(token, 'this'); | |
51 THROW() => ref(token, 'throw'); | |
52 TRUE() => ref(token, 'true'); | |
53 TRY() => ref(token, 'try'); | |
54 VAR() => ref(token, 'var'); | |
55 VOID() => ref(token, 'void'); | |
56 WHILE() => ref(token, 'while'); | |
57 | |
58 // Pseudo-keywords that should also be valid identifiers. | |
59 ABSTRACT() => ref(token, 'abstract'); | |
60 ASSERT() => ref(token, 'assert'); | |
61 CLASS() => ref(token, 'class'); | |
62 EXTENDS() => ref(token, 'extends'); | |
63 FACTORY() => ref(token, 'factory'); | |
64 GET() => ref(token, 'get'); | |
65 IMPLEMENTS() => ref(token, 'implements'); | |
66 IMPORT() => ref(token, 'import'); | |
67 INTERFACE() => ref(token, 'interface'); | |
68 IS() => ref(token, 'is'); | |
69 LIBRARY() => ref(token, 'library'); | |
70 NATIVE() => ref(token, 'native'); | |
71 NEGATE() => ref(token, 'negate'); | |
72 OPERATOR() => ref(token, 'operator'); | |
73 SET() => ref(token, 'set'); | |
74 SOURCE() => ref(token, 'source'); | |
75 STATIC() => ref(token, 'static'); | |
76 TYPEDEF() => ref(token, 'typedef'); | |
77 | |
78 // ----------------------------------------------------------------- | |
79 // Grammar productions. | |
80 // ----------------------------------------------------------------- | |
81 start() => ref(compilationUnit).end(); | |
82 | |
83 compilationUnit() => | |
84 ref(HASHBANG).optional() | |
85 & ref(directive).star() | |
86 & ref(topLevelDefinition).star(); | |
87 | |
88 directive() => | |
89 ref(token, '#') | |
90 & ref(identifier) | |
91 & ref(arguments) | |
92 & ref(token, ';'); | |
93 | |
94 topLevelDefinition() => | |
95 ref(classDefinition) | |
96 | ref(interfaceDefinition) | |
97 | ref(functionTypeAlias) | |
98 | ref(functionDeclaration) & ref(functionBodyOrNative) | |
99 | ref(returnType).optional() & ref(getOrSet) & ref(identifier) & ref(forma
lParameterList) & ref(functionBodyOrNative) | |
100 | ref(FINAL) & ref(type).optional() & ref(staticFinalDeclarationList) & re
f(token, ';') | |
101 | ref(constInitializedVariableDeclaration) & ref(token, ';'); | |
102 | |
103 classDefinition() => | |
104 ref(CLASS) & ref(identifier) & ref(typeParameters).optional() & ref(supe
rclass).optional() & ref(interfaces).optional() & | |
105 ref(token, '{') & ref(classMemberDefinition).star() & ref(token, '}') | |
106 | ref(CLASS) & ref(identifier) & ref(typeParameters).optional() & ref(inte
rfaces).optional() & ref(NATIVE) & ref(token, STRING) & | |
107 ref(token, '{') & ref(classMemberDefinition).star() & ref(token, '}'); | |
108 | |
109 typeParameter() => ref(identifier) & (ref(EXTENDS) & ref(type)).optional(); | |
110 | |
111 typeParameters() => ref(token, '<') & ref(typeParameter) & (ref(token, ',') &
ref(typeParameter)).star() & ref(token, '>'); | |
112 | |
113 superclass() => ref(EXTENDS) & ref(type); | |
114 | |
115 interfaces() => ref(IMPLEMENTS) & ref(typeList); | |
116 | |
117 superinterfaces() => ref(EXTENDS) & ref(typeList); | |
118 | |
119 // This rule is organized in a way that may not be most readable, but | |
120 // gives the best error messages. | |
121 classMemberDefinition() => | |
122 ref(declaration) & ref(token, ';') | |
123 | ref(constructorDeclaration) & ref(token, ';') | |
124 | ref(methodDeclaration) & ref(functionBodyOrNative) | |
125 | ref(CONST) & ref(factoryConstructorDeclaration) & ref(functionNative); | |
126 | |
127 functionBodyOrNative() => | |
128 ref(NATIVE) & ref(functionBody) | |
129 | ref(functionNative) | |
130 | ref(functionBody); | |
131 | |
132 functionNative() => ref(NATIVE) & ref(token, STRING).optional() & ref(token, '
;'); | |
133 | |
134 // A method, operator, or constructor (which all should be followed by | |
135 // a block of code). | |
136 methodDeclaration() => | |
137 ref(factoryConstructorDeclaration) | |
138 | ref(STATIC) & ref(functionDeclaration) | |
139 | ref(specialSignatureDefinition) | |
140 | ref(functionDeclaration) & ref(initializers).optional() | |
141 | ref(namedConstructorDeclaration) & ref(initializers).optional(); | |
142 | |
143 // An abstract method/operator, a field, or const constructor (which | |
144 // all should be followed by a semicolon). | |
145 declaration() => | |
146 ref(constantConstructorDeclaration) & (ref(redirection) | ref(initialize
rs)).optional() | |
147 | ref(functionDeclaration) & ref(redirection) | |
148 | ref(namedConstructorDeclaration) & ref(redirection) | |
149 | ref(ABSTRACT) & ref(specialSignatureDefinition) | |
150 | ref(ABSTRACT) & ref(functionDeclaration) | |
151 | ref(STATIC) & ref(FINAL) & ref(type).optional() & ref(staticFinalDeclara
tionList) | |
152 | ref(STATIC).optional() & ref(constInitializedVariableDeclaration); | |
153 | |
154 initializers() => ref(token, ':') & ref(superCallOrFieldInitializer) & (ref(to
ken, ',') & ref(superCallOrFieldInitializer)).star(); | |
155 | |
156 redirection() => ref(token, ':') & ref(THIS) & (ref(token, '.') & ref(identifi
er)).optional() & ref(arguments); | |
157 | |
158 fieldInitializer() => (ref(THIS) & ref(token, '.')).optional() & ref(identifie
r) & ref(token, '=') & ref(conditionalExpression); | |
159 | |
160 superCallOrFieldInitializer() => | |
161 ref(SUPER) & ref(arguments) | |
162 | ref(SUPER) & ref(token, '.') & ref(identifier) & ref(arguments) | |
163 | ref(fieldInitializer); | |
164 | |
165 staticFinalDeclarationList() => ref(staticFinalDeclaration) & (ref(token, ',')
& ref(staticFinalDeclaration)).star(); | |
166 | |
167 staticFinalDeclaration() => ref(identifier) & ref(token, '=') & ref(constantEx
pression); | |
168 | |
169 interfaceDefinition() => ref(INTERFACE) & ref(identifier) & ref(typeParameters
).optional() & | |
170 ref(superinterfaces).optional() & ref(factorySpecification).optional() & r
ef(token, '{') & | |
171 ref(interfaceMemberDefinition).star() & ref(token, '}'); | |
172 | |
173 factorySpecification() => ref(FACTORY) & ref(type); | |
174 | |
175 functionTypeAlias() => ref(TYPEDEF) & ref(functionPrefix) & ref(typeParameters
).optional() & | |
176 ref(formalParameterList) & ref(token, ';'); | |
177 | |
178 interfaceMemberDefinition() => | |
179 ref(STATIC) & ref(FINAL) & ref(type).optional() & ref(initializedIdentif
ierList) & ref(token, ';') | |
180 | ref(functionDeclaration) & ref(token, ';') | |
181 | ref(constantConstructorDeclaration) & ref(token, ';') | |
182 | ref(namedConstructorDeclaration) & ref(token, ';') | |
183 | ref(specialSignatureDefinition) & ref(token, ';') | |
184 | ref(variableDeclaration) & ref(token, ';'); | |
185 | |
186 factoryConstructorDeclaration() => ref(FACTORY) & ref(qualified) & ref(typePar
ameters).optional() & | |
187 (ref(token, '.') & ref(identifier)).optional() & ref(formalParameterList); | |
188 | |
189 namedConstructorDeclaration() => ref(identifier) & ref(token, '.') & ref(ident
ifier) & | |
190 ref(formalParameterList); | |
191 | |
192 constructorDeclaration() => | |
193 ref(identifier) & ref(formalParameterList) & (ref(redirection) | ref(ini
tializers)).optional() | |
194 | ref(namedConstructorDeclaration) & (ref(redirection) | ref(initializers)
).optional(); | |
195 | |
196 constantConstructorDeclaration() => ref(CONST) & ref(qualified) & ref(formalPa
rameterList); | |
197 | |
198 specialSignatureDefinition() => | |
199 ref(STATIC).optional() & ref(returnType).optional() & ref(getOrSet) & re
f(identifier) & ref(formalParameterList) | |
200 | ref(returnType).optional() & ref(OPERATOR) & ref(userDefinableOperator)
& ref(formalParameterList); | |
201 | |
202 getOrSet() => ref(GET) | ref(SET); | |
203 | |
204 userDefinableOperator() => | |
205 ref(multiplicativeOperator) | |
206 | ref(additiveOperator) | |
207 | ref(shiftOperator) | |
208 | ref(relationalOperator) | |
209 | ref(bitwiseOperator) | |
210 | ref(token, '==') // Disallow negative and === equality checks. | |
211 | ref(token, '~') // Disallow ! operator. | |
212 | ref(NEGATE) | |
213 | ref(token, '[') & ref(token, ']') | |
214 | ref(token, '[') & ref(token, ']') & ref(token, '='); | |
215 | |
216 prefixOperator() => | |
217 ref(additiveOperator) | |
218 | ref(negateOperator); | |
219 | |
220 postfixOperator() => | |
221 ref(incrementOperator); | |
222 | |
223 negateOperator() => | |
224 ref(token, '!') | |
225 | ref(token, '~'); | |
226 | |
227 multiplicativeOperator() => | |
228 ref(token, '*') | |
229 | ref(token, '/') | |
230 | ref(token, '%') | |
231 | ref(token, '~/'); | |
232 | |
233 assignmentOperator() => | |
234 ref(token, '=') | |
235 | ref(token, '*=') | |
236 | ref(token, '/=') | |
237 | ref(token, '~/=') | |
238 | ref(token, '%=') | |
239 | ref(token, '+=') | |
240 | ref(token, '-=') | |
241 | ref(token, '<<=') | |
242 | ref(token, '>>>=') | |
243 | ref(token, '>>=') | |
244 | ref(token, '&=') | |
245 | ref(token, '^=') | |
246 | ref(token, '|='); | |
247 | |
248 additiveOperator() => | |
249 ref(token, '+') | |
250 | ref(token, '-'); | |
251 | |
252 incrementOperator() => | |
253 ref(token, '++') | |
254 | ref(token, '--'); | |
255 | |
256 shiftOperator() => | |
257 ref(token, '<<') | |
258 | ref(token, '>>>') | |
259 | ref(token, '>>'); | |
260 | |
261 relationalOperator() => | |
262 ref(token, '>=') | |
263 | ref(token, '>') | |
264 | ref(token, '<=') | |
265 | ref(token, '<'); | |
266 | |
267 equalityOperator() => | |
268 ref(token, '===') | |
269 | ref(token, '!==') | |
270 | ref(token, '==') | |
271 | ref(token, '!='); | |
272 | |
273 bitwiseOperator() => | |
274 ref(token, '&') | |
275 | ref(token, '^') | |
276 | ref(token, '|'); | |
277 | |
278 formalParameterList() => | |
279 ref(token, '(') & ref(namedFormalParameters).optional() & ref(token, ')'
) | |
280 | ref(token, '(') & ref(normalFormalParameter) & ref(normalFormalParameter
Tail).optional() & ref(token, ')'); | |
281 | |
282 normalFormalParameterTail() => | |
283 ref(token, ',') & ref(namedFormalParameters) | |
284 | ref(token, ',') & ref(normalFormalParameter) & ref(normalFormalParameter
Tail).optional(); | |
285 | |
286 normalFormalParameter() => | |
287 ref(functionDeclaration) | |
288 | ref(fieldFormalParameter) | |
289 | ref(simpleFormalParameter); | |
290 | |
291 simpleFormalParameter() => | |
292 ref(declaredIdentifier) | |
293 | ref(identifier); | |
294 | |
295 fieldFormalParameter() => | |
296 ref(finalVarOrType).optional() & ref(THIS) & ref(token, '.') & ref(ident
ifier); | |
297 | |
298 namedFormalParameters() => | |
299 ref(token, '[') & ref(defaultFormalParameter) & (ref(token, ',') & ref(d
efaultFormalParameter)).star() & ref(token, ']'); | |
300 | |
301 defaultFormalParameter() => | |
302 ref(normalFormalParameter) & (ref(token, '=') & ref(constantExpression))
.optional(); | |
303 | |
304 returnType() => | |
305 ref(VOID) | |
306 | ref(type); | |
307 | |
308 finalVarOrType() => | |
309 ref(FINAL) & ref(type).optional() | |
310 | ref(VAR) | |
311 | ref(type) | |
312 ; | |
313 | |
314 // We have to introduce a separate rule for 'declared' identifiers to | |
315 // allow ANTLR to decide if the first identifier we encounter after | |
316 // final is a type or an identifier. Before this change, we used the | |
317 // production 'finalVarOrType identifier' in numerous places. | |
318 declaredIdentifier() => | |
319 ref(FINAL) & ref(type).optional() & ref(identifier) | |
320 | ref(VAR) & ref(identifier) | |
321 | ref(type) & ref(identifier) | |
322 ; | |
323 | |
324 identifier() => ref(token, ref(IDENTIFIER)); | |
325 | |
326 qualified() => | |
327 ref(identifier) & (ref(token, '.') & ref(identifier)).optional() | |
328 ; | |
329 | |
330 type() => | |
331 ref(qualified) & ref(typeArguments).optional() | |
332 ; | |
333 | |
334 typeArguments() => | |
335 ref(token, '<') & ref(typeList) & ref(token, '>') | |
336 ; | |
337 | |
338 typeList() => | |
339 ref(type) & (ref(token, ',') & ref(type)).star() | |
340 ; | |
341 | |
342 block() => | |
343 ref(token, '{') & ref(statements) & ref(token, '}') | |
344 ; | |
345 | |
346 statements() => | |
347 ref(statement).star() | |
348 ; | |
349 | |
350 statement() => | |
351 ref(label).star() & ref(nonLabelledStatement) | |
352 ; | |
353 | |
354 nonLabelledStatement() => | |
355 ref(block) | |
356 | ref(initializedVariableDeclaration) & ref(token, ';') | |
357 | ref(iterationStatement) | |
358 | ref(selectionStatement) | |
359 | ref(tryStatement) | |
360 | ref(BREAK) & ref(identifier).optional() & ref(token, ';') | |
361 | ref(CONTINUE) & ref(identifier).optional() & ref(token, ';') | |
362 | ref(RETURN) & ref(expression).optional() & ref(token, ';') | |
363 | ref(THROW) & ref(expression).optional() & ref(token, ';') | |
364 | ref(expression).optional() & ref(token, ';') | |
365 | ref(ASSERT) & ref(token, '(') & ref(conditionalExpression) & ref(token,
')') & ref(token, ';') | |
366 | ref(functionDeclaration) & ref(functionBody) | |
367 ; | |
368 | |
369 label() => | |
370 ref(identifier) & ref(token, ':') | |
371 ; | |
372 | |
373 iterationStatement() => | |
374 ref(WHILE) & ref(token, '(') & ref(expression) & ref(token, ')') & ref(s
tatement) | |
375 | ref(DO) & ref(statement) & ref(WHILE) & ref(token, '(') & ref(expression
) & ref(token, ')') & ref(token, ';') | |
376 | ref(FOR) & ref(token, '(') & ref(forLoopParts) & ref(token, ')') & ref(s
tatement) | |
377 ; | |
378 | |
379 forLoopParts() => | |
380 ref(forInitializerStatement) & ref(expression).optional() & ref(token, '
;') & ref(expressionList).optional() | |
381 | ref(declaredIdentifier) & ref(IN) & ref(expression) | |
382 | ref(identifier) & ref(IN) & ref(expression) | |
383 ; | |
384 | |
385 forInitializerStatement() => | |
386 ref(initializedVariableDeclaration) & ref(token, ';') | |
387 | ref(expression).optional() & ref(token, ';') | |
388 ; | |
389 | |
390 selectionStatement() => | |
391 ref(IF) & ref(token, '(') & ref(expression) & ref(token, ')') & ref(stat
ement) & (ref(ELSE) & ref(statement)).optional() | |
392 | ref(SWITCH) & ref(token, '(') & ref(expression) & ref(token, ')') & ref(
token, '{') & ref(switchCase).star() & ref(defaultCase).optional() & ref(token,
'}') | |
393 ; | |
394 | |
395 switchCase() => | |
396 ref(label).optional() & (ref(CASE) & ref(expression) & ref(token, ':')).
plus() & ref(statements) | |
397 ; | |
398 | |
399 defaultCase() => | |
400 ref(label).optional() & (ref(CASE) & ref(expression) & ref(token, ':')).
star() & ref(DEFAULT) & ref(token, ':') & ref(statements) | |
401 ; | |
402 | |
403 tryStatement() => | |
404 ref(TRY) & ref(block) & (ref(catchPart).plus() & ref(finallyPart).option
al() | ref(finallyPart)) | |
405 ; | |
406 | |
407 catchPart() => | |
408 ref(CATCH) & ref(token, '(') & ref(declaredIdentifier) & (ref(token, ','
) & ref(declaredIdentifier)).optional() & ref(token, ')') & ref(block) | |
409 ; | |
410 | |
411 finallyPart() => | |
412 ref(FINALLY) & ref(block) | |
413 ; | |
414 | |
415 variableDeclaration() => | |
416 ref(declaredIdentifier) & (ref(token, ',') & ref(identifier)).star() | |
417 ; | |
418 | |
419 initializedVariableDeclaration() => | |
420 ref(declaredIdentifier) & (ref(token, '=') & ref(expression)).optional()
& (ref(token, ',') & ref(initializedIdentifier)).star() | |
421 ; | |
422 | |
423 initializedIdentifierList() => | |
424 ref(initializedIdentifier) & (ref(token, ',') & ref(initializedIdentifie
r)).star() | |
425 ; | |
426 | |
427 initializedIdentifier() => | |
428 ref(identifier) & (ref(token, '=') & ref(expression)).optional() | |
429 ; | |
430 | |
431 constInitializedVariableDeclaration() => | |
432 ref(declaredIdentifier) & (ref(token, '=') & ref(constantExpression)).op
tional() & | |
433 (ref(token, ',') & ref(constInitializedIdentifier)).star() | |
434 ; | |
435 | |
436 constInitializedIdentifier() => | |
437 ref(identifier) & (ref(token, '=') & ref(constantExpression)).optional() | |
438 ; | |
439 | |
440 // The constant expression production is used to mark certain expressions | |
441 // as only being allowed to hold a compile-time constant. The grammar cannot | |
442 // express these restrictions (yet), so this will have to be enforced by a | |
443 // separate analysis phase. | |
444 constantExpression() => | |
445 ref(expression) | |
446 ; | |
447 | |
448 expression() => | |
449 ref(assignableExpression) & ref(assignmentOperator) & ref(expression) | |
450 | ref(conditionalExpression) | |
451 ; | |
452 | |
453 expressionList() => | |
454 ref(expression) & (ref(token, ',') & ref(expression)).star() | |
455 ; | |
456 | |
457 arguments() => | |
458 ref(token, '(') & ref(argumentList).optional() & ref(token, ')') | |
459 ; | |
460 | |
461 argumentList() => | |
462 ref(namedArgument) & (ref(token, ',') & ref(namedArgument)).star() | |
463 | ref(expressionList) & (ref(token, ',') & ref(namedArgument)).star() | |
464 ; | |
465 | |
466 namedArgument() => | |
467 ref(label) & ref(expression) | |
468 ; | |
469 | |
470 assignableExpression() => | |
471 ref(primary) & (ref(arguments).star() & ref(assignableSelector)).plus() | |
472 | ref(SUPER) & ref(assignableSelector) | |
473 | ref(identifier) | |
474 ; | |
475 | |
476 conditionalExpression() => | |
477 ref(logicalOrExpression) & (ref(token, '?') & ref(expression) & ref(toke
n, ':') & ref(expression)).optional() | |
478 ; | |
479 | |
480 logicalOrExpression() => | |
481 ref(logicalAndExpression) & (ref(token, '||') & ref(logicalAndExpression
)).star() | |
482 ; | |
483 | |
484 logicalAndExpression() => | |
485 ref(bitwiseOrExpression) & (ref(token, '&&') & ref(bitwiseOrExpression))
.star() | |
486 ; | |
487 | |
488 bitwiseOrExpression() => | |
489 ref(bitwiseXorExpression) & (ref(token, '|') & ref(bitwiseXorExpression)
).star() | |
490 | ref(SUPER) & (ref(token, '|') & ref(bitwiseXorExpression)).plus() | |
491 ; | |
492 | |
493 bitwiseXorExpression() => | |
494 ref(bitwiseAndExpression) & (ref(token, '^') & ref(bitwiseAndExpression)
).star() | |
495 | ref(SUPER) & (ref(token, '^') & ref(bitwiseAndExpression)).plus() | |
496 ; | |
497 | |
498 bitwiseAndExpression() => | |
499 ref(equalityExpression) & (ref(token, '&') & ref(equalityExpression)).st
ar() | |
500 | ref(SUPER) & (ref(token, '&') & ref(equalityExpression)).plus() | |
501 ; | |
502 | |
503 equalityExpression() => | |
504 ref(relationalExpression) & (ref(equalityOperator) & ref(relationalExpre
ssion)).optional() | |
505 | ref(SUPER) & ref(equalityOperator) & ref(relationalExpression) | |
506 ; | |
507 | |
508 relationalExpression() => | |
509 ref(shiftExpression) & (ref(isOperator) & ref(type) | ref(relationalOper
ator) & ref(shiftExpression)).optional() | |
510 | ref(SUPER) & ref(relationalOperator) & ref(shiftExpression) | |
511 ; | |
512 | |
513 isOperator() => | |
514 ref(IS) & ref(token, '!').optional() | |
515 ; | |
516 | |
517 shiftExpression() => | |
518 ref(additiveExpression) & (ref(shiftOperator) & ref(additiveExpression))
.star() | |
519 | ref(SUPER) & (ref(shiftOperator) & ref(additiveExpression)).plus() | |
520 ; | |
521 | |
522 additiveExpression() => | |
523 ref(multiplicativeExpression) & (ref(additiveOperator) & ref(multiplicat
iveExpression)).star() | |
524 | ref(SUPER) & (ref(additiveOperator) & ref(multiplicativeExpression)).plu
s() | |
525 ; | |
526 | |
527 multiplicativeExpression() => | |
528 ref(unaryExpression) & (ref(multiplicativeOperator) & ref(unaryExpressio
n)).star() | |
529 | ref(SUPER) & (ref(multiplicativeOperator) & ref(unaryExpression)).plus() | |
530 ; | |
531 | |
532 unaryExpression() => | |
533 ref(postfixExpression) | |
534 | ref(prefixOperator) & ref(unaryExpression) | |
535 | ref(negateOperator) & ref(SUPER) | |
536 | ref(token, '-') & ref(SUPER) | |
537 | ref(incrementOperator) & ref(assignableExpression) | |
538 ; | |
539 | |
540 postfixExpression() => | |
541 ref(assignableExpression) & ref(postfixOperator) | |
542 | ref(primary) & ref(selector).star() | |
543 ; | |
544 | |
545 selector() => | |
546 ref(assignableSelector) | |
547 | ref(arguments) | |
548 ; | |
549 | |
550 assignableSelector() => | |
551 ref(token, '[') & ref(expression) & ref(token, ']') | |
552 | ref(token, '.') & ref(identifier) | |
553 ; | |
554 | |
555 primary() => | |
556 ref(primaryNoFE) | |
557 | ref(primaryFE) | |
558 ; | |
559 | |
560 primaryFE() => | |
561 ref(functionExpression) | |
562 | ref(primaryNoFE) | |
563 ; | |
564 | |
565 primaryNoFE() => | |
566 ref(THIS) | |
567 | ref(SUPER) & ref(assignableSelector) | |
568 | ref(literal) | |
569 | ref(identifier) | |
570 | ref(CONST).optional() & ref(typeArguments).optional() & ref(compoundLite
ral) | |
571 | (ref(NEW) | ref(CONST)) & ref(type) & (ref(token, '.') & ref(identifier)
).optional() & ref(arguments) | |
572 | ref(expressionInParentheses) | |
573 ; | |
574 | |
575 expressionInParentheses() => | |
576 ref(token, '(') & ref(expression) & ref(token, ')') | |
577 ; | |
578 | |
579 literal() => ref(token, | |
580 ref(NULL) | |
581 | ref(TRUE) | |
582 | ref(FALSE) | |
583 | ref(HEX_NUMBER) | |
584 | ref(NUMBER) | |
585 | ref(STRING)) | |
586 ; | |
587 | |
588 compoundLiteral() => | |
589 ref(listLiteral) | |
590 | ref(mapLiteral) | |
591 ; | |
592 | |
593 listLiteral() => | |
594 ref(token, '[') & (ref(expressionList) & ref(token, ',').optional()).opt
ional() & ref(token, ']') | |
595 ; | |
596 | |
597 mapLiteral() => | |
598 ref(token, '{') & (ref(mapLiteralEntry) & (ref(token, ',') & ref(mapLite
ralEntry)).star() & ref(token, ',').optional()).optional() & ref(token, '}') | |
599 ; | |
600 | |
601 mapLiteralEntry() => | |
602 ref(token, STRING) & ref(token, ':') & ref(expression) | |
603 ; | |
604 | |
605 functionExpression() => | |
606 (ref(returnType).optional() & ref(identifier)).optional() & ref(formalPa
rameterList) & ref(functionExpressionBody) | |
607 ; | |
608 | |
609 functionDeclaration() => | |
610 ref(returnType).optional() & ref(identifier) & ref(formalParameterList) | |
611 ; | |
612 | |
613 functionPrefix() => | |
614 ref(returnType).optional() & ref(identifier) | |
615 ; | |
616 | |
617 functionBody() => | |
618 ref(token, '=>') & ref(expression) & ref(token, ';') | |
619 | ref(block) | |
620 ; | |
621 | |
622 functionExpressionBody() => | |
623 ref(token, '=>') & ref(expression) | |
624 | ref(block) | |
625 ; | |
626 | |
627 // ----------------------------------------------------------------- | |
628 // Library files. | |
629 // ----------------------------------------------------------------- | |
630 libraryUnit() => | |
631 ref(libraryDefinition).end() | |
632 ; | |
633 | |
634 libraryDefinition() => | |
635 ref(LIBRARY) & ref(token, '{') & ref(libraryBody) & ref(token, '}') | |
636 ; | |
637 | |
638 libraryBody() => | |
639 ref(libraryImport).optional() & ref(librarySource).optional() | |
640 ; | |
641 | |
642 libraryImport() => | |
643 ref(IMPORT) & ref(token, '=') & ref(token, '[') & ref(importReferences).
optional() & ref(token, ']') | |
644 ; | |
645 | |
646 importReferences() => | |
647 ref(importReference) & (ref(token, ',') & ref(importReference)).star() &
ref(token, ',').optional() | |
648 ; | |
649 | |
650 importReference() => | |
651 (ref(token, IDENTIFIER) & ref(token, ':')).optional() & ref(token, STRIN
G) | |
652 ; | |
653 | |
654 librarySource() => | |
655 ref(SOURCE) & ref(token, '=') & ref(token, '[') & ref(sourceUrls).option
al() & ref(token, ']') | |
656 ; | |
657 | |
658 sourceUrls() => | |
659 ref(token, STRING) & (ref(token, ',') & ref(token, STRING)).star() & ref
(token, ',').optional() | |
660 ; | |
661 | |
662 | |
663 // ----------------------------------------------------------------- | |
664 // Lexical tokens. | |
665 // ----------------------------------------------------------------- | |
666 IDENTIFIER_NO_DOLLAR() => | |
667 ref(IDENTIFIER_START_NO_DOLLAR) & ref(IDENTIFIER_PART_NO_DOLLAR).star() | |
668 ; | |
669 | |
670 IDENTIFIER() => | |
671 ref(IDENTIFIER_START) & ref(IDENTIFIER_PART).star() | |
672 ; | |
673 | |
674 HEX_NUMBER() => | |
675 string('0x') & ref(HEX_DIGIT).plus() | |
676 | string('0X') & ref(HEX_DIGIT).plus() | |
677 ; | |
678 | |
679 NUMBER() => | |
680 ref(DIGIT).plus() & ref(NUMBER_OPT_FRACTIONAL_PART) & ref(EXPONENT).opti
onal() & ref(NUMBER_OPT_ILLEGAL_END) | |
681 | char('.') & ref(DIGIT).plus() & ref(EXPONENT).optional() & ref(NUMBER_OP
T_ILLEGAL_END) | |
682 ; | |
683 | |
684 NUMBER_OPT_FRACTIONAL_PART() => | |
685 char('.') & ref(DIGIT).plus() | |
686 | epsilon() | |
687 ; | |
688 | |
689 NUMBER_OPT_ILLEGAL_END() => epsilon(); | |
690 // ref(IDENTIFIER_START).end() | |
691 // | epsilon() | |
692 // ; | |
693 | |
694 HEX_DIGIT() => pattern('0-9a-fA-F'); | |
695 | |
696 IDENTIFIER_START() => ref(IDENTIFIER_START_NO_DOLLAR) | char('\$'); | |
697 | |
698 IDENTIFIER_START_NO_DOLLAR() => ref(LETTER) | char('_'); | |
699 | |
700 IDENTIFIER_PART_NO_DOLLAR() => ref(IDENTIFIER_START_NO_DOLLAR) | ref(DIGIT); | |
701 | |
702 IDENTIFIER_PART() => ref(IDENTIFIER_START) | ref(DIGIT); | |
703 | |
704 LETTER() => letter(); | |
705 | |
706 DIGIT() => digit(); | |
707 | |
708 EXPONENT() => pattern('eE') & pattern('+-').optional() & ref(DIGIT).plus(); | |
709 | |
710 STRING() => | |
711 char('@').optional() & ref(MULTI_LINE_STRING) | |
712 | ref(SINGLE_LINE_STRING) | |
713 ; | |
714 | |
715 MULTI_LINE_STRING() => | |
716 string('"""') & any().starLazy(string('"""')) & string('"""') | |
717 | string("'''") & any().starLazy(string("'''")) & string("'''") | |
718 ; | |
719 | |
720 SINGLE_LINE_STRING() => | |
721 char('"') & ref(STRING_CONTENT_DQ).star() & char('"') | |
722 | char("'") & ref(STRING_CONTENT_SQ).star() & char("'") | |
723 | string('@"') & pattern('^"\n\r').star() & char('"') | |
724 | string("@'") & pattern("^'\n\r").star() & char("'") | |
725 ; | |
726 | |
727 STRING_CONTENT_DQ() => | |
728 pattern('^\\"\n\r') | |
729 | char('\\') & pattern('\n\r') | |
730 ; | |
731 | |
732 STRING_CONTENT_SQ() => | |
733 pattern("^\\'\n\r") | |
734 | char('\\') & pattern('\n\r') | |
735 ; | |
736 | |
737 NEWLINE() => pattern('\n\r'); | |
738 | |
739 HASHBANG() => string('#!') & pattern('^\n\r').star() & ref(NEWLINE).optional()
; | |
740 | |
741 | |
742 // ----------------------------------------------------------------- | |
743 // Whitespace and comments. | |
744 // ----------------------------------------------------------------- | |
745 HIDDEN() => ref(HIDDEN_STUFF).plus(); | |
746 | |
747 HIDDEN_STUFF() => ref(WHITESPACE) | |
748 | ref(SINGLE_LINE_COMMENT) | |
749 | ref(MULTI_LINE_COMMENT) | |
750 ; | |
751 | |
752 WHITESPACE() => whitespace(); | |
753 | |
754 SINGLE_LINE_COMMENT() => string('//') | |
755 & ref(NEWLINE).neg().star() | |
756 & ref(NEWLINE).optional() | |
757 ; | |
758 | |
759 MULTI_LINE_COMMENT() => string('/*') | |
760 & (ref(MULTI_LINE_COMMENT) | string('*/').neg()).star() & string('*/') | |
761 ; | |
762 | |
763 } | |
OLD | NEW |