Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Side by Side Diff: docs/language/Dart.g

Issue 2688903004: Creating an ANTLR grammar for Dart, potentially the syntax spec.
Patch Set: Added support for generic function invocations Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tests/language/language_parser.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 // CHANGES:
6 //
7 // v1.0 First version available in the SDK github repository. Covers the
8 // Dart language as specified in the language specification based on the
9 // many grammar rule snippets. That grammar was then adjusted to remove
10 // known issues (e.g., misplaced metadata) and to resolve ambiguities.
11 // HERE!
12
13 grammar Dart;
14
15 /*
16 options {
17 backtrack=true;
18 memoize=true;
19 }
20 */
21
22 @parser::header{
23 import java.util.Stack;
24 }
25
26 @lexer::header{
27 import java.util.Stack;
28 }
29
30 @parser::members {
31 // Grammar debugging friendly output, 'The Definitive ANTLR Reference', p247.
32 public String getErrorMessage(RecognitionException e, String[] tokenNames) {
33 List stack = getRuleInvocationStack(e, this.getClass().getName());
34 String msg = null;
35 if ( e instanceof NoViableAltException ) {
36 NoViableAltException nvae = (NoViableAltException)e;
37 msg = "no viable alt; token=" + e.token +
38 " (decision=" + nvae.decisionNumber +
39 " state " + nvae.stateNumber + ")" +
40 " decision=<<" + nvae.grammarDecisionDescription + ">>";
41 }
42 else {
43 msg = super.getErrorMessage(e, tokenNames);
44 }
45 return stack + " " + msg;
46 }
47
48 public String getTokenErrorDisplay(Token t) {
49 return t.toString();
50 }
51
52 // Enable the parser to treat ASYNC/AWAIT/YIELD as keywords in the body of an
53 // `async`, `async*`, or `sync*` function. Access via methods below.
54 private Stack<Boolean> asyncEtcAreKeywords = new Stack<Boolean>();
55 { asyncEtcAreKeywords.push(false); }
56
57 // Use this to indicate that we are now entering an `async`, `async*`,
58 // or `sync*` function.
59 void startAsyncFunction() { asyncEtcAreKeywords.push(true); }
60
61 // Use this to indicate that we are now entering a function which is
62 // neither `async`, `async*`, nor `sync*`.
63 void startNonAsyncFunction() { asyncEtcAreKeywords.push(false); }
64
65 // Use this to indicate that we are now leaving any funciton.
66 void endFunction() { asyncEtcAreKeywords.pop(); }
67
68 // Whether we can recognize ASYNC/AWAIT/YIELD as an identifier/typeIdentifier.
69 boolean asyncEtcPredicate(int tokenId) {
70 if (tokenId == ASYNC || tokenId == AWAIT || tokenId == YIELD) {
71 return !asyncEtcAreKeywords.peek();
72 }
73 return false;
74 }
75
76 // Debugging support methods.
77 void dp(int indent, String method, String sep) {
78 for (int i = 0; i < indent; i++) {
79 System.out.print(" ");
80 }
81 System.out.println(method + sep + " " + input.LT(1) + " " + state.failed);
82 }
83
84 void dpBegin(int indent, String method) { dp(indent, method, ":"); }
85 void dpEnd(int indent, String method) { dp(indent, method, " END:"); }
86 void dpCall(int indent, String method) { dp(indent, method, "?"); }
87 void dpCalled(int indent, String method) { dp(indent, method, ".."); }
88 void dpResult(int indent, String method) { dp(indent, method, "!"); }
89 }
90
91 @lexer::members{
92 public static final int BRACE_NORMAL = 1;
93 public static final int BRACE_SINGLE = 2;
94 public static final int BRACE_DOUBLE = 3;
95 public static final int BRACE_THREE_SINGLE = 4;
96 public static final int BRACE_THREE_DOUBLE = 5;
97
98 // Enable the parser to handle string interpolations via brace matching.
99 // The top of the `braceLevels` stack describes the most recent unmatched
100 // '{'. This is needed in order to enable/disable certain lexer rules.
101 //
102 // NORMAL: Most recent unmatched '{' was not string literal related.
103 // SINGLE: Most recent unmatched '{' was `'...${`.
104 // DOUBLE: Most recent unmatched '{' was `"...${`.
105 // THREE_SINGLE: Most recent unmatched '{' was `'''...${`.
106 // THREE_DOUBLE: Most recent unmatched '{' was `"""...${`.
107 //
108 // Access via functions below.
109 private Stack<Integer> braceLevels = new Stack<Integer>();
110
111 // Whether we are currently in a string literal context, and which one.
112 boolean currentBraceLevel(int braceLevel) {
113 if (braceLevels.empty()) return false;
114 return braceLevels.peek() == braceLevel;
115 }
116
117 // Use this to indicate that we are now entering a specific '{...}'.
118 // Call it after accepting the '{'.
119 void enterBrace() {
120 braceLevels.push(BRACE_NORMAL);
121 }
122 void enterBraceSingleQuote() {
123 braceLevels.push(BRACE_SINGLE);
124 }
125 void enterBraceDoubleQuote() {
126 braceLevels.push(BRACE_DOUBLE);
127 }
128 void enterBraceThreeSingleQuotes() {
129 braceLevels.push(BRACE_THREE_SINGLE);
130 }
131 void enterBraceThreeDoubleQuotes() {
132 braceLevels.push(BRACE_THREE_DOUBLE);
133 }
134
135 // Use this to indicate that we are now exiting a specific '{...}',
136 // no matter which kind. Call it before accepting the '}'.
137 void exitBrace() {
138 // We might raise a parse error here if the stack is empty, but the
139 // parsing rules should ensure that we get a parse error anyway, and
140 // it is not a big problem for the spec parser even if it misinterprets
141 // the brace structure of some programs with syntax errors.
142 if (!braceLevels.empty()) braceLevels.pop();
143 }
144 }
145
146 // ---------------------------------------- Grammar rules.
147
148 libraryDefinition
149 : FEFF? SCRIPT_TAG?
150 ((metadata LIBRARY) => libraryName)?
151 ((metadata (IMPORT | EXPORT)) => importOrExport)*
152 ((metadata PART) => partDirective)*
153 (metadata topLevelDefinition)*
154 EOF
155 ;
156
157 // `functionSignature functionBody` is split into two alternatives because
158 // this eliminates an ambiguity.
159
160 topLevelDefinition
161 : classDefinition
162 | enumType
163 | (TYPEDEF typeIdentifier typeParameters? '=') => typeAlias
164 | (TYPEDEF functionPrefix ('<' | '(')) => typeAlias
165 | (EXTERNAL functionSignature ';') => EXTERNAL functionSignature ';'
166 | (EXTERNAL getterSignature) => EXTERNAL getterSignature ';'
167 | (EXTERNAL type? SET identifier '(') =>
168 EXTERNAL setterSignature ';'
169 | (getterSignature functionBodyPrefix) => getterSignature functionBody
170 | (type? SET identifier '(') => setterSignature functionBody
171 | (identifier typeParameters? '(') => functionSignature functionBody
172 | (type identifier typeParameters? '(') =>
173 functionSignature functionBody
174 | ((FINAL | CONST) type? identifier '=') =>
175 (FINAL | CONST) type? staticFinalDeclarationList ';'
176 | initializedVariableDeclaration ';'
177 ;
178
179 declaredIdentifier
180 : COVARIANT? finalConstVarOrType identifier
floitsch 2017/08/28 09:18:48 Why is Covariant allowed at the top-level (through
Lasse Reichstein Nielsen 2017/08/28 10:51:32 I believe we handle that in prose: It's an error i
eernst 2017/08/28 11:35:16 Right, it's quite "imprecise" to allow COVARIANT o
181 ;
182
183 finalConstVarOrType
184 : FINAL type?
185 | CONST type?
186 | varOrType
187 ;
188
189 varOrType
190 : VAR
191 | type
192 ;
193
194 initializedVariableDeclaration
195 : declaredIdentifier ('=' expression)? (',' initializedIdentifier)*
196 ;
197
198 initializedIdentifier
199 : identifier ('=' expression)?
200 ;
201
202 initializedIdentifierList
203 : initializedIdentifier (',' initializedIdentifier)*
204 ;
205
206 functionSignature
207 : (type identifier typeParameters? '(') =>
208 type identifier formalParameterPart
209 | identifier formalParameterPart
210 ;
211
212 functionBodyPrefix
213 : ASYNC? '=>'
214 | (ASYNC | ASYNC '*' | SYNC '*')? LBRACE
215 ;
216
217 functionBody
218 : '=>' { startNonAsyncFunction(); } expression { endFunction(); } ';'
219 | { startNonAsyncFunction(); } block { endFunction(); }
220 | ASYNC '=>'
221 { startAsyncFunction(); } expression { endFunction(); } ';'
222 | (ASYNC | ASYNC '*' | SYNC '*')
223 { startAsyncFunction(); } block { endFunction(); }
224 ;
225
226 block
227 : LBRACE statements RBRACE
228 ;
229
230 formalParameterPart
231 : typeParameters? formalParameterList
232 ;
233
234 formalParameterList
235 : '(' ')'
236 | '(' normalFormalParameters (','? | ',' optionalFormalParameters) ')'
237 | '(' optionalFormalParameters ')'
238 ;
239
240 normalFormalParameters
241 : normalFormalParameter (',' normalFormalParameter)*
242 ;
243
244 optionalFormalParameters
245 : optionalPositionalFormalParameters
246 | namedFormalParameters
247 ;
248
249 optionalPositionalFormalParameters
250 : '[' defaultFormalParameter (',' defaultFormalParameter)* ','? ']'
251 ;
252
253 namedFormalParameters
254 : LBRACE defaultNamedParameter (',' defaultNamedParameter)* ','? RBRACE
255 ;
256
257 normalFormalParameter
258 : metadata normalFormalParameterNoMetadata
259 ;
260
261 // `functionFormalParameter` is split into two alternatives because
262 // this eliminates an ambiguity.
263
264 normalFormalParameterNoMetadata
265 : (COVARIANT? identifier typeParameters? '(') => functionFormalParameter
266 | (COVARIANT? type identifier typeParameters? '(') =>
267 functionFormalParameter
268 | (finalConstVarOrType? THIS) => fieldFormalParameter
269 | simpleFormalParameter
270 ;
271
272 functionFormalParameter
273 : (COVARIANT? type identifier typeParameters? '(') =>
274 COVARIANT? type identifier formalParameterPart
275 | COVARIANT? identifier formalParameterPart
276 ;
277
278 simpleFormalParameter
279 : declaredIdentifier
280 | COVARIANT? identifier
281 ;
282
283 fieldFormalParameter
284 : finalConstVarOrType? THIS '.' identifier formalParameterPart?
285 ;
286
287 defaultFormalParameter
288 : normalFormalParameter ('=' expression)?
289 ;
290
291 defaultNamedParameter
292 : normalFormalParameter ((':' | '=') expression)?
293 ;
294
295 typeApplication
296 : typeIdentifier typeParameters?
297 ;
298
299 classDefinition
300 : (ABSTRACT? CLASS typeApplication (EXTENDS|IMPLEMENTS|LBRACE)) =>
301 ABSTRACT? CLASS typeApplication (superclass mixins?)? interfaces?
302 LBRACE (metadata classMemberDefinition)* RBRACE
303 | (ABSTRACT? CLASS typeApplication '=') =>
304 ABSTRACT? CLASS mixinApplicationClass
305 ;
306
307 mixins
308 : WITH typeNotVoidNotFunctionList
309 ;
310
311 classMemberDefinition
312 : (methodSignature functionBodyPrefix) => methodSignature functionBody
313 | declaration ';'
314 ;
315
316 // `STATIC? functionSignature` is split into two alternatives because this
317 // eliminates an ambiguity.
318
319 methodSignature
320 : (constructorName '(') => constructorSignature initializers?
321 | (FACTORY constructorName '(') => factoryConstructorSignature
322 | (STATIC? identifier typeParameters? '(') => STATIC? functionSignature
323 | (STATIC? type identifier typeParameters? '(') =>
324 STATIC? functionSignature
325 | (STATIC? type? GET) => STATIC? getterSignature
326 | (STATIC? type? SET) => STATIC? setterSignature
327 | operatorSignature
328 ;
329
330 // https://github.com/dart-lang/sdk/issues/29501 reports on the problem which
331 // was solved by adding a case for redirectingFactoryConstructorSignature.
332 // TODO(eernst): Close that issue when this is integrated into the spec.
333
334 // https://github.com/dart-lang/sdk/issues/29502 reports on the problem that
335 // than external const factory constructor declaration cannot be derived by
336 // the spec grammar (and also not by this grammar). The following fixes were
337 // introduced for that: Added the 'factoryConstructorSignature' case below in
338 // 'declaration'; also added 'CONST?' in the 'factoryConstructorSignature'
339 // rule, such that const factories in general are allowed.
340 // TODO(eernst): Close that issue when this is integrated into the spec.
341
342 declaration
343 : (EXTERNAL CONST? FACTORY constructorName '(') =>
344 EXTERNAL factoryConstructorSignature
345 | EXTERNAL constantConstructorSignature
346 | (EXTERNAL constructorName '(') => EXTERNAL constructorSignature
347 | ((EXTERNAL STATIC?)? type? GET) => (EXTERNAL STATIC?)? getterSignature
348 | ((EXTERNAL STATIC?)? type? SET) => (EXTERNAL STATIC?)? setterSignature
349 | (EXTERNAL? type? OPERATOR) => EXTERNAL? operatorSignature
350 | (STATIC (FINAL | CONST)) =>
351 STATIC (FINAL | CONST) type? staticFinalDeclarationList
352 | FINAL type? initializedIdentifierList
353 | ((STATIC | COVARIANT)? (VAR | type) identifier ('=' | ',' | ';')) =>
354 (STATIC | COVARIANT)? (VAR | type) initializedIdentifierList
355 | (EXTERNAL? STATIC? functionSignature ';') =>
356 EXTERNAL? STATIC? functionSignature
357 | (CONST? FACTORY constructorName formalParameterList '=') =>
358 redirectingFactoryConstructorSignature
359 | constantConstructorSignature (redirection | initializers)?
360 | constructorSignature (redirection | initializers)?
361 ;
362
363 staticFinalDeclarationList
364 : staticFinalDeclaration (',' staticFinalDeclaration)*
365 ;
366
367 staticFinalDeclaration
368 : identifier '=' expression
369 ;
370
371 operatorSignature
372 : type? OPERATOR operator formalParameterList
373 ;
374
375 operator
376 : '~'
377 | binaryOperator
378 | '[' ']'
379 | '[' ']' '='
380 ;
381
382 binaryOperator
383 : multiplicativeOperator
384 | additiveOperator
385 | (shiftOperator) => shiftOperator
386 | relationalOperator
387 | '=='
388 | bitwiseOperator
389 ;
390
391 getterSignature
392 : type? GET identifier
393 ;
394
395 setterSignature
396 : type? SET identifier formalParameterList
397 ;
398
399 constructorSignature
400 : constructorName formalParameterList
401 ;
402
403 constructorName
404 : typeIdentifier ('.' identifier)?
405 ;
406
407 redirection
408 : ':' THIS ('.' identifier)? arguments
409 ;
410
411 initializers
412 : ':' superCallOrFieldInitializer (',' superCallOrFieldInitializer)*
413 ;
414
415 superCallOrFieldInitializer
416 : SUPER arguments
417 | SUPER '.' identifier arguments
418 | fieldInitializer
419 | assertClause
420 ;
421
422 fieldInitializer
423 : (THIS '.')? identifier '=' conditionalExpression cascadeSection*
424 ;
425
426 factoryConstructorSignature
427 : CONST? FACTORY constructorName formalParameterList
428 ;
429
430 redirectingFactoryConstructorSignature
431 : CONST? FACTORY constructorName formalParameterList '='
432 constructorDesignation
433 ;
434
435 constantConstructorSignature
436 : CONST constructorName formalParameterList
437 ;
438
439 superclass
440 : EXTENDS typeNotVoidNotFunction
441 ;
442
443 interfaces
444 : IMPLEMENTS typeNotVoidNotFunctionList
445 ;
446
447 mixinApplicationClass
448 : typeApplication '=' mixinApplication ';'
449 ;
450
451 mixinApplication
452 : typeNotVoidNotFunction mixins interfaces?
453 ;
454
455 enumType
456 : ENUM typeIdentifier LBRACE identifier (',' identifier)* (',')? RBRACE
457 ;
458
459 typeParameter
460 : metadata typeIdentifier (EXTENDS typeNotVoid)?
461 ;
462
463 typeParameters
464 : '<' typeParameter (',' typeParameter)* '>'
465 ;
466
467 metadata
468 : ('@' metadatum)*
469 ;
470
471 metadatum
472 : constructorDesignation arguments
473 | qualified
474 ;
475
476 expression
477 : (formalParameterPart functionExpressionBodyPrefix) =>
478 functionExpression
479 | throwExpression
480 | (assignableExpression assignmentOperator) =>
481 assignableExpression assignmentOperator expression
482 | conditionalExpression cascadeSection*
483 ;
484
485 expressionWithoutCascade
486 : (formalParameterPart functionExpressionBodyPrefix) =>
487 functionExpressionWithoutCascade
488 | throwExpressionWithoutCascade
489 | (assignableExpression assignmentOperator) =>
490 assignableExpression assignmentOperator expressionWithoutCascade
491 | conditionalExpression
492 ;
493
494 expressionList
495 : expression (',' expression)*
496 ;
497
498 primary
499 : thisExpression
500 | SUPER unconditionalAssignableSelector
501 | (CONST constructorDesignation) => constObjectExpression
502 | newExpression
503 | (formalParameterPart functionPrimaryBodyPrefix) => functionPrimary
504 | '(' expression ')'
505 | literal
506 | identifier
507 ;
508
509 literal
510 : nullLiteral
511 | booleanLiteral
512 | numericLiteral
513 | stringLiteral
514 | symbolLiteral
515 | (CONST? typeArguments? LBRACE) => mapLiteral
516 | listLiteral
517 ;
518
519 nullLiteral
520 : NULL
521 ;
522
523 numericLiteral
524 : NUMBER
525 | HEX_NUMBER
526 ;
527
528 booleanLiteral
529 : TRUE
530 | FALSE
531 ;
532
533 stringLiteral
534 : (multiLineString | singleLineString)+
535 ;
536
537 stringLiteralWithoutInterpolation
538 : singleLineStringWithoutInterpolation+
539 ;
540
541 listLiteral
542 : CONST? typeArguments? '[' (expressionList ','?)? ']'
543 ;
544
545 mapLiteral
546 : CONST? typeArguments?
547 LBRACE (mapLiteralEntry (',' mapLiteralEntry)* ','?)? RBRACE
548 ;
549
550 mapLiteralEntry
551 : expression ':' expression
552 ;
553
554 throwExpression
555 : THROW expression
556 ;
557
558 throwExpressionWithoutCascade
559 : THROW expressionWithoutCascade
560 ;
561
562 functionExpression
563 : formalParameterPart functionExpressionBody
564 ;
565
566 functionExpressionBody
567 : '=>' { startNonAsyncFunction(); } expression { endFunction(); }
568 | ASYNC '=>' { startAsyncFunction(); } expression { endFunction(); }
569 ;
570
571 functionExpressionBodyPrefix
572 : ASYNC? '=>'
573 ;
574
575 functionExpressionWithoutCascade
576 : formalParameterPart functionExpressionWithoutCascadeBody
577 ;
578
579 functionExpressionWithoutCascadeBody
580 : '=>' { startNonAsyncFunction(); }
581 expressionWithoutCascade { endFunction(); }
582 | ASYNC '=>' { startAsyncFunction(); }
583 expressionWithoutCascade { endFunction(); }
584 ;
585
586 functionPrimary
587 : formalParameterPart functionPrimaryBody
588 ;
589
590 functionPrimaryBody
591 : { startNonAsyncFunction(); } block { endFunction(); }
592 | (ASYNC | ASYNC '*' | SYNC '*')
593 { startAsyncFunction(); } block { endFunction(); }
594 ;
595
596 functionPrimaryBodyPrefix
597 : (ASYNC | ASYNC '*' | SYNC '*')? LBRACE
598 ;
599
600 thisExpression
601 : THIS
602 ;
603
604 newExpression
605 : NEW constructorDesignation arguments
606 ;
607
608 constObjectExpression
609 : CONST constructorDesignation arguments
610 ;
611
612 arguments
613 : '(' (argumentList ','?)? ')'
614 ;
615
616 argumentList
617 : namedArgument (',' namedArgument)*
618 | expressionList (',' namedArgument)*
619 ;
620
621 namedArgument
622 : label expression
623 ;
624
625 cascadeSection
626 : '..'
627 (cascadeSelector argumentPart*)
628 (assignableSelector argumentPart*)*
629 (assignmentOperator expressionWithoutCascade)?
630 ;
631
632 cascadeSelector
633 : '[' expression ']'
634 | identifier
635 ;
636
637 assignmentOperator
638 : '='
639 | compoundAssignmentOperator
640 ;
641
642 compoundAssignmentOperator
643 : '*='
644 | '/='
645 | '~/='
646 | '%='
647 | '+='
648 | '-='
649 | '<<='
650 | '>' '>' '='
651 | '&='
652 | '^='
653 | '|='
654 | '??='
655 ;
656
657 conditionalExpression
658 : ifNullExpression
659 ('?' expressionWithoutCascade ':' expressionWithoutCascade)?
660 ;
661
662 ifNullExpression
663 : logicalOrExpression ('??' logicalOrExpression)*
664 ;
665
666 logicalOrExpression
667 : logicalAndExpression ('||' logicalAndExpression)*
668 ;
669
670 logicalAndExpression
671 : equalityExpression ('&&' equalityExpression)*
672 ;
673
674 equalityExpression
675 : relationalExpression (equalityOperator relationalExpression)?
676 | SUPER equalityOperator relationalExpression
677 ;
678
679 equalityOperator
680 : '=='
681 | '!='
682 ;
683
684 relationalExpression
685 : bitwiseOrExpression
686 (typeTest | typeCast | relationalOperator bitwiseOrExpression)?
687 | SUPER relationalOperator bitwiseOrExpression
688 ;
689
690 relationalOperator
691 : '>' '='
692 | '>'
693 | '<='
694 | '<'
695 ;
696
697 bitwiseOrExpression
698 : bitwiseXorExpression ('|' bitwiseXorExpression)*
699 | SUPER ('|' bitwiseXorExpression)+
700 ;
701
702 bitwiseXorExpression
703 : bitwiseAndExpression ('^' bitwiseAndExpression)*
704 | SUPER ('^' bitwiseAndExpression)+
705 ;
706
707 bitwiseAndExpression
708 : shiftExpression ('&' shiftExpression)*
709 | SUPER ('&' shiftExpression)+
710 ;
711
712 bitwiseOperator
713 : '&'
714 | '^'
715 | '|'
716 ;
717
718 shiftExpression
719 : additiveExpression (shiftOperator additiveExpression)*
720 | SUPER (shiftOperator additiveExpression)+
721 ;
722
723 shiftOperator
724 : '<<'
725 | '>' '>'
726 ;
727
728 additiveExpression
729 : multiplicativeExpression (additiveOperator multiplicativeExpression)*
730 | SUPER (additiveOperator multiplicativeExpression)+
731 ;
732
733 additiveOperator
734 : '+'
735 | '-'
736 ;
737
738 multiplicativeExpression
739 : unaryExpression (multiplicativeOperator unaryExpression)*
740 | SUPER (multiplicativeOperator unaryExpression)+
741 ;
742
743 multiplicativeOperator
744 : '*'
745 | '/'
746 | '%'
747 | '~/'
748 ;
749
750 unaryExpression
751 : (prefixOperator ~SUPER) => prefixOperator unaryExpression
752 | (awaitExpression) => awaitExpression
753 | postfixExpression
754 | (minusOperator | tildeOperator) SUPER
755 | incrementOperator assignableExpression
756 ;
757
758 prefixOperator
759 : minusOperator
760 | negationOperator
761 | tildeOperator
762 ;
763
764 minusOperator
765 : '-'
766 ;
767
768 negationOperator
769 : '!'
770 ;
771
772 tildeOperator
773 : '~'
774 ;
775
776 awaitExpression
777 : AWAIT unaryExpression
778 ;
779
780 // The `(selector)` predicate ensures that the parser commits to the longest
781 // possible chain of selectors, e.g., `a<b,c>(d)` as a call rather than as a
782 // sequence of two relational expressions.
783
784 postfixExpression
785 : (assignableExpression postfixOperator) =>
786 assignableExpression postfixOperator
787 | primary ((selector) => selector)*
788 ;
789
790 postfixOperator
791 : incrementOperator
792 ;
793
794 selector
795 : assignableSelector
796 | argumentPart
797 ;
798
799 argumentPart
800 : typeArguments? arguments
801 ;
802
803 incrementOperator
804 : '++'
805 | '--'
806 ;
807
808 // The `(assignableSelectorPart)` predicate ensures that the parser
809 // commits to the longest possible chain, e.g., `a<b,c>(d).e` as one rather
810 // than two expressions. The first `identifier` alternative handles all
811 // the simple cases; the final `identifier` alternative at the end catches
812 // the case where we have `identifier '<'` and the '<' is used as a
813 // relationalOperator, not the beginning of typeArguments.
814
815 assignableExpression
816 : (SUPER unconditionalAssignableSelector
817 ~('<' | '(' | '[' | '.' | '?.')) =>
818 SUPER unconditionalAssignableSelector
819 | (identifier ~('<' | '(' | '[' | '.' | '?.')) => identifier
820 | (primary argumentPart* assignableSelector) =>
821 primary ((assignableSelectorPart) => assignableSelectorPart)+
822 | identifier
823 ;
824
825 assignableSelectorPart
826 : argumentPart* assignableSelector
827 ;
828
829 unconditionalAssignableSelector
830 : '[' expression ']'
831 | '.' identifier
832 ;
833
834 assignableSelector
835 : unconditionalAssignableSelector
836 | '?.' identifier
837 ;
838
839 identifier
840 : IDENTIFIER
841 | ABSTRACT
842 | AS
843 | COVARIANT
844 | DEFERRED
845 | DYNAMIC
846 | EXPORT
847 | EXTERNAL
848 | FACTORY
849 | GET
850 | IMPLEMENTS
851 | IMPORT
852 | LIBRARY
853 | OPERATOR
854 | PART
855 | SET
856 | STATIC
857 | TYPEDEF
858 | HIDE // Not a built-in identifier.
859 | OF // Not a built-in identifier.
860 | ON // Not a built-in identifier.
861 | SHOW // Not a built-in identifier.
862 | SYNC // Not a built-in identifier.
863 | FUNCTION // Not a built-in identifier.
864 | { asyncEtcPredicate(input.LA(1)) }? (ASYNC|AWAIT|YIELD)
865 ;
866
867 qualified
868 : identifier ('.' identifier)?
869 ;
870
871 typeIdentifier
872 : IDENTIFIER
873 | DYNAMIC // The only built-in identifier that can be used as a type.
874 | HIDE // Not a built-in identifier.
875 | OF // Not a built-in identifier.
876 | ON // Not a built-in identifier.
877 | SHOW // Not a built-in identifier.
878 | SYNC // Not a built-in identifier.
879 | FUNCTION // Not a built-in identifier.
880 | { asyncEtcPredicate(input.LA(1)) }? (ASYNC|AWAIT|YIELD)
881 ;
882
883 typeTest
884 : isOperator typeNotVoid
885 ;
886
887 isOperator
888 : IS '!'?
889 ;
890
891 typeCast
892 : asOperator typeNotVoid
893 ;
894
895 asOperator
896 : AS
897 ;
898
899 statements
900 : statement*
901 ;
902
903 statement
904 : label* nonLabelledStatement
905 ;
906
907 // Exception in the language specification: An expressionStatement cannot
908 // start with LBRACE. We force anything that starts with LBRACE to be a block,
909 // which will prevent an expressionStatement from starting with LBRACE, and
910 // which will not interfere with the recognition of any other case. If we
911 // add another statement which can start with LBRACE we must adjust this
912 // check.
913 nonLabelledStatement
914 : (LBRACE) => block
915 | (declaredIdentifier ('='|','|';')) => localVariableDeclaration
916 | (AWAIT? FOR) => forStatement
917 | whileStatement
918 | doStatement
919 | switchStatement
920 | ifStatement
921 | rethrowStatement
922 | tryStatement
923 | breakStatement
924 | continueStatement
925 | returnStatement
926 | (functionSignature functionBodyPrefix) => localFunctionDeclaration
927 | assertStatement
928 | (YIELD ~'*') => yieldStatement
929 | yieldEachStatement
930 | expressionStatement
931 ;
932
933 expressionStatement
934 : expression? ';'
935 ;
936
937 localVariableDeclaration
938 : initializedVariableDeclaration ';'
939 ;
940
941 localFunctionDeclaration
942 : functionSignature functionBody
943 ;
944
945 ifStatement
946 : IF '(' expression ')' statement ((ELSE) => ELSE statement | ())
947 ;
948
949 forStatement
950 : AWAIT? FOR '(' forLoopParts ')' statement
951 ;
952
953 forLoopParts
954 : (declaredIdentifier IN) => declaredIdentifier IN expression
955 | (identifier IN) => identifier IN expression
956 | forInitializerStatement expression? ';' expressionList?
957 ;
958
959 // The localVariableDeclaration cannot be CONST, but that can
960 // be enforced in a later phase, and the grammar allows it.
961 forInitializerStatement
962 : (localVariableDeclaration) => localVariableDeclaration
963 | expression? ';'
964 ;
965
966 whileStatement
967 : WHILE '(' expression ')' statement
968 ;
969
970 doStatement
971 : DO statement WHILE '(' expression ')' ';'
972 ;
973
974 switchStatement
975 : SWITCH '(' expression ')' LBRACE switchCase* defaultCase? RBRACE
976 ;
977
978 switchCase
979 : label* CASE expression ':' statements
980 ;
981
982 defaultCase
983 : label* DEFAULT ':' statements
984 ;
985
986 rethrowStatement
987 : RETHROW ';'
988 ;
989
990 tryStatement
991 : TRY block (onParts finallyPart? | finallyPart)
992 ;
993
994 onPart
995 : catchPart block
996 | ON typeNotVoid catchPart? block
997 ;
998
999 onParts
1000 : (onPart (ON|CATCH)) => onPart onParts
1001 | onPart
1002 ;
1003
1004 catchPart
1005 : CATCH '(' identifier (',' identifier)? ')'
1006 ;
1007
1008 finallyPart
1009 : FINALLY block
1010 ;
1011
1012 returnStatement
1013 : RETURN expression? ';'
1014 ;
1015
1016 label
1017 : identifier ':'
1018 ;
1019
1020 breakStatement
1021 : BREAK identifier? ';'
1022 ;
1023
1024 continueStatement
1025 : CONTINUE identifier? ';'
1026 ;
1027
1028 yieldStatement
1029 : YIELD expression ';'
1030 ;
1031
1032 yieldEachStatement
1033 : YIELD '*' expression ';'
1034 ;
1035
1036 assertStatement
1037 : assertClause ';'
1038 ;
1039
1040 assertClause
1041 : ASSERT '(' expression (',' expression)? ')'
1042 ;
1043
1044 libraryName
1045 : metadata LIBRARY identifier ('.' identifier)* ';'
1046 ;
1047
1048 importOrExport
1049 : (metadata IMPORT) => libraryImport
1050 | (metadata EXPORT) => libraryExport
1051 ;
1052
1053 libraryImport
1054 : metadata importSpecification
1055 ;
1056
1057 importSpecification
1058 : IMPORT uri (AS identifier)? combinator* ';'
1059 | IMPORT uri DEFERRED AS identifier combinator* ';'
1060 ;
1061
1062 combinator
1063 : SHOW identifierList
1064 | HIDE identifierList
1065 ;
1066
1067 identifierList
1068 : identifier (',' identifier)*
1069 ;
1070
1071 libraryExport
1072 : metadata EXPORT uri combinator* ';'
1073 ;
1074
1075 partDirective
1076 : metadata PART uri ';'
1077 ;
1078
1079 partHeader
1080 : metadata PART OF identifier ('.' identifier)* ';'
1081 ;
1082
1083 partDeclaration
1084 : partHeader topLevelDefinition* EOF
1085 ;
1086
1087 uri
1088 : stringLiteralWithoutInterpolation
1089 ;
1090
1091 type
1092 : (FUNCTION ('('|'<')) => functionTypeTails
1093 | (typeNotFunction FUNCTION ('('|'<')) =>
1094 typeNotFunction functionTypeTails
1095 | typeNotFunction
1096 ;
1097
1098 typeNotFunction
1099 : typeNotVoidNotFunction
1100 | VOID
1101 ;
1102
1103 typeNotVoid
1104 : (typeNotFunction? FUNCTION ('('|'<')) => functionType
1105 | typeNotVoidNotFunction
1106 ;
1107
1108 typeNotVoidNotFunction
1109 : typeName typeArguments?
1110 ;
1111
1112 typeName
1113 : typeIdentifier ('.' typeIdentifier)?
1114 ;
1115
1116 typeArguments
1117 : '<' typeList '>'
1118 ;
1119
1120 typeList
1121 : type (',' type)*
1122 ;
1123
1124 typeNotVoidNotFunctionList
1125 : typeNotVoidNotFunction (',' typeNotVoidNotFunction)*
1126 ;
1127
1128 typeAlias
1129 : (TYPEDEF typeIdentifier typeParameters? '=') =>
1130 TYPEDEF typeIdentifier typeParameters? '=' functionType ';'
1131 | TYPEDEF functionTypeAlias
1132 ;
1133
1134 functionTypeAlias
1135 : functionPrefix formalParameterPart ';'
1136 ;
1137
1138 functionPrefix
1139 : (type identifier) => type identifier
1140 | identifier
1141 ;
1142
1143 functionTypeTail
1144 : FUNCTION typeParameters? parameterTypeList
1145 ;
1146
1147 functionTypeTails
1148 : (functionTypeTail FUNCTION ('<'|'(')) =>
1149 functionTypeTail functionTypeTails
1150 | functionTypeTail
1151 ;
1152
1153 functionType
1154 : (FUNCTION ('<'|'(')) => functionTypeTails
1155 | typeNotFunction functionTypeTails
1156 ;
1157
1158 parameterTypeList
1159 : ('(' ')') => '(' ')'
1160 | ('(' normalParameterTypes ',' ('['|'{')) =>
1161 '(' normalParameterTypes ',' optionalParameterTypes ')'
1162 | ('(' normalParameterTypes ','? ')') =>
1163 '(' normalParameterTypes ','? ')'
1164 | '(' optionalParameterTypes ')'
1165 ;
1166
1167 normalParameterTypes
1168 : normalParameterType (',' normalParameterType)*
1169 ;
1170
1171 normalParameterType
1172 : (typedIdentifier) => typedIdentifier
1173 | type
1174 ;
1175
1176 optionalParameterTypes
1177 : optionalPositionalParameterTypes
1178 | namedParameterTypes
1179 ;
1180
1181 optionalPositionalParameterTypes
1182 : '[' normalParameterTypes ','? ']'
1183 ;
1184
1185 namedParameterTypes
1186 : '{' typedIdentifier (',' typedIdentifier)* ','? '}'
1187 ;
1188
1189 typedIdentifier
1190 : type identifier
1191 ;
1192
1193 constructorDesignation
1194 : typeIdentifier
1195 | identifier '.' identifier
1196 | identifier '.' typeIdentifier '.' identifier
1197 | typeName typeArguments ('.' identifier)?
1198 ;
1199
1200 // Predicate: Force resolution as composite symbolLiteral as far as possible.
1201 symbolLiteral
1202 : '#' (operator | (identifier (('.' identifier) => '.' identifier)*))
1203 ;
1204
1205 singleLineStringWithoutInterpolation
1206 : RAW_SINGLE_LINE_STRING
1207 | SINGLE_LINE_STRING_DQ_BEGIN_END
1208 | SINGLE_LINE_STRING_SQ_BEGIN_END
1209 ;
1210
1211 singleLineString
1212 : RAW_SINGLE_LINE_STRING
1213 | SINGLE_LINE_STRING_SQ_BEGIN_END
1214 | SINGLE_LINE_STRING_SQ_BEGIN_MID expression
1215 (SINGLE_LINE_STRING_SQ_MID_MID expression)*
1216 SINGLE_LINE_STRING_SQ_MID_END
1217 | SINGLE_LINE_STRING_DQ_BEGIN_END
1218 | SINGLE_LINE_STRING_DQ_BEGIN_MID expression
1219 (SINGLE_LINE_STRING_DQ_MID_MID expression)*
1220 SINGLE_LINE_STRING_DQ_MID_END
1221 ;
1222
1223 multiLineString
1224 : RAW_MULTI_LINE_STRING
1225 | MULTI_LINE_STRING_SQ_BEGIN_END
1226 | MULTI_LINE_STRING_SQ_BEGIN_MID expression
1227 (MULTI_LINE_STRING_SQ_MID_MID expression)*
1228 MULTI_LINE_STRING_SQ_MID_END
1229 | MULTI_LINE_STRING_DQ_BEGIN_END
1230 | MULTI_LINE_STRING_DQ_BEGIN_MID expression
1231 (MULTI_LINE_STRING_DQ_MID_MID expression)*
1232 MULTI_LINE_STRING_DQ_MID_END
1233 ;
1234
1235 // ---------------------------------------- Lexer rules.
1236
1237 fragment
1238 LETTER
1239 : 'a' .. 'z'
1240 | 'A' .. 'Z'
1241 ;
1242
1243 fragment
1244 DIGIT
1245 : '0' .. '9'
1246 ;
1247
1248 fragment
1249 EXPONENT
1250 : ('e' | 'E') ('+' | '-')? DIGIT+
1251 ;
1252
1253 fragment
1254 HEX_DIGIT
1255 : ('a' | 'b' | 'c' | 'd' | 'e' | 'f')
1256 | ('A' | 'B' | 'C' | 'D' | 'E' | 'F')
1257 | DIGIT
1258 ;
1259
1260 FINAL
1261 : 'final'
1262 ;
1263
1264 CONST
1265 : 'const'
1266 ;
1267
1268 VAR
1269 : 'var'
1270 ;
1271
1272 VOID
1273 : 'void'
1274 ;
1275
1276 ASYNC
1277 : 'async'
1278 ;
1279
1280 THIS
1281 : 'this'
1282 ;
1283
1284 ABSTRACT
1285 : 'abstract'
1286 ;
1287
1288 AS
1289 : 'as'
1290 ;
1291
1292 SYNC
1293 : 'sync'
1294 ;
1295
1296 CLASS
1297 : 'class'
1298 ;
1299
1300 WITH
1301 : 'with'
1302 ;
1303
1304 STATIC
1305 : 'static'
1306 ;
1307
1308 DYNAMIC
1309 : 'dynamic'
1310 ;
1311
1312 EXTERNAL
1313 : 'external'
1314 ;
1315
1316 GET
1317 : 'get'
1318 ;
1319
1320 SET
1321 : 'set'
1322 ;
1323
1324 OPERATOR
1325 : 'operator'
1326 ;
1327
1328 SUPER
1329 : 'super'
1330 ;
1331
1332 FACTORY
1333 : 'factory'
1334 ;
1335
1336 EXTENDS
1337 : 'extends'
1338 ;
1339
1340 IMPLEMENTS
1341 : 'implements'
1342 ;
1343
1344 ENUM
1345 : 'enum'
1346 ;
1347
1348 NULL
1349 : 'null'
1350 ;
1351
1352 TRUE
1353 : 'true'
1354 ;
1355
1356 FALSE
1357 : 'false'
1358 ;
1359
1360 THROW
1361 : 'throw'
1362 ;
1363
1364 NEW
1365 : 'new'
1366 ;
1367
1368 AWAIT
1369 : 'await'
1370 ;
1371
1372 DEFERRED
1373 : 'deferred'
1374 ;
1375
1376 EXPORT
1377 : 'export'
1378 ;
1379
1380 IMPORT
1381 : 'import'
1382 ;
1383
1384 LIBRARY
1385 : 'library'
1386 ;
1387
1388 PART
1389 : 'part'
1390 ;
1391
1392 TYPEDEF
1393 : 'typedef'
1394 ;
1395
1396 IS
1397 : 'is'
1398 ;
1399
1400 IF
1401 : 'if'
1402 ;
1403
1404 ELSE
1405 : 'else'
1406 ;
1407
1408 WHILE
1409 : 'while'
1410 ;
1411
1412 FOR
1413 : 'for'
1414 ;
1415
1416 IN
1417 : 'in'
1418 ;
1419
1420 DO
1421 : 'do'
1422 ;
1423
1424 SWITCH
1425 : 'switch'
1426 ;
1427
1428 CASE
1429 : 'case'
1430 ;
1431
1432 DEFAULT
1433 : 'default'
1434 ;
1435
1436 RETHROW
1437 : 'rethrow'
1438 ;
1439
1440 TRY
1441 : 'try'
1442 ;
1443
1444 ON
1445 : 'on'
1446 ;
1447
1448 CATCH
1449 : 'catch'
1450 ;
1451
1452 FINALLY
1453 : 'finally'
1454 ;
1455
1456 RETURN
1457 : 'return'
1458 ;
1459
1460 BREAK
1461 : 'break'
1462 ;
1463
1464 CONTINUE
1465 : 'continue'
1466 ;
1467
1468 YIELD
1469 : 'yield'
1470 ;
1471
1472 SHOW
1473 : 'show'
1474 ;
1475
1476 HIDE
1477 : 'hide'
1478 ;
1479
1480 OF
1481 : 'of'
1482 ;
1483
1484 ASSERT
1485 : 'assert'
1486 ;
1487
1488 COVARIANT
1489 : 'covariant'
1490 ;
1491
1492 FUNCTION
1493 : 'Function'
1494 ;
1495
1496 NUMBER
1497 : (DIGIT+ '.' DIGIT) => DIGIT+ '.' DIGIT+ EXPONENT?
1498 | DIGIT+ EXPONENT?
1499 | '.' DIGIT+ EXPONENT?
1500 ;
1501
1502 HEX_NUMBER
1503 : '0x' HEX_DIGIT+
1504 | '0X' HEX_DIGIT+
1505 ;
1506
1507 RAW_SINGLE_LINE_STRING
1508 : 'r' '\'' (~('\'' | '\r' | '\n'))* '\''
1509 | 'r' '"' (~('"' | '\r' | '\n'))* '"'
1510 ;
1511
1512 RAW_MULTI_LINE_STRING
1513 : 'r' '"""' (options {greedy=false;} : .)* '"""'
1514 | 'r' '\'\'\'' (options {greedy=false;} : .)* '\'\'\''
1515 ;
1516
1517 fragment
1518 SIMPLE_STRING_INTERPOLATION
1519 : '$' IDENTIFIER_NO_DOLLAR
1520 ;
1521
1522 fragment
1523 STRING_CONTENT_SQ
1524 : ~('\\' | '\'' | '$' | '\r' | '\n')
1525 | '\\' ~( '\r' | '\n')
1526 | SIMPLE_STRING_INTERPOLATION
1527 ;
1528
1529 SINGLE_LINE_STRING_SQ_BEGIN_END
1530 : '\'' STRING_CONTENT_SQ* '\''
1531 ;
1532
1533 SINGLE_LINE_STRING_SQ_BEGIN_MID
1534 : '\'' STRING_CONTENT_SQ* '${' { enterBraceSingleQuote(); }
1535 ;
1536
1537 SINGLE_LINE_STRING_SQ_MID_MID
1538 : { currentBraceLevel(BRACE_SINGLE) }? =>
1539 ('}' STRING_CONTENT_SQ* '${') =>
1540 { exitBrace(); } '}' STRING_CONTENT_SQ* '${'
1541 { enterBraceSingleQuote(); }
1542 ;
1543
1544 SINGLE_LINE_STRING_SQ_MID_END
1545 : { currentBraceLevel(BRACE_SINGLE) }? =>
1546 ('}' STRING_CONTENT_SQ* '\'') =>
1547 { exitBrace(); } '}' STRING_CONTENT_SQ* '\''
1548 ;
1549
1550 fragment
1551 STRING_CONTENT_DQ
1552 : ~('\\' | '"' | '$' | '\r' | '\n')
1553 | '\\' ~('\r' | '\n')
1554 | SIMPLE_STRING_INTERPOLATION
1555 ;
1556
1557 SINGLE_LINE_STRING_DQ_BEGIN_END
1558 : '"' STRING_CONTENT_DQ* '"'
1559 ;
1560
1561 SINGLE_LINE_STRING_DQ_BEGIN_MID
1562 : '"' STRING_CONTENT_DQ* '${' { enterBraceDoubleQuote(); }
1563 ;
1564
1565 SINGLE_LINE_STRING_DQ_MID_MID
1566 : { currentBraceLevel(BRACE_DOUBLE) }? =>
1567 ('}' STRING_CONTENT_DQ* '${') =>
1568 { exitBrace(); } '}' STRING_CONTENT_DQ* '${'
1569 { enterBraceDoubleQuote(); }
1570 ;
1571
1572 SINGLE_LINE_STRING_DQ_MID_END
1573 : { currentBraceLevel(BRACE_DOUBLE) }? =>
1574 ('}' STRING_CONTENT_DQ* '"') =>
1575 { exitBrace(); } '}' STRING_CONTENT_DQ* '"'
1576 ;
1577
1578 fragment
1579 QUOTES_SQ
1580 :
1581 | '\''
1582 | '\'\''
1583 ;
1584
1585 // Read string contents, which may be almost anything, but stop when seeing
1586 // '\'\'\'' and when seeing '${'. We do this by allowing all other
1587 // possibilities including escapes, simple interpolation, and fewer than
1588 // three '\''.
1589 fragment
1590 STRING_CONTENT_TSQ
1591 : QUOTES_SQ
1592 (~('\\' | '$' | '\'') | '\\' . | SIMPLE_STRING_INTERPOLATION)
1593 ;
1594
1595 MULTI_LINE_STRING_SQ_BEGIN_END
1596 : '\'\'\'' STRING_CONTENT_TSQ* '\'\'\''
1597 ;
1598
1599 MULTI_LINE_STRING_SQ_BEGIN_MID
1600 : '\'\'\'' STRING_CONTENT_TSQ* QUOTES_SQ '${'
1601 { enterBraceThreeSingleQuotes(); }
1602 ;
1603
1604 MULTI_LINE_STRING_SQ_MID_MID
1605 : { currentBraceLevel(BRACE_THREE_SINGLE) }? =>
1606 ('}' STRING_CONTENT_TSQ* QUOTES_SQ '${') =>
1607 { exitBrace(); } '}' STRING_CONTENT_TSQ* QUOTES_SQ '${'
1608 { enterBraceThreeSingleQuotes(); }
1609 ;
1610
1611 MULTI_LINE_STRING_SQ_MID_END
1612 : { currentBraceLevel(BRACE_THREE_SINGLE) }? =>
1613 ('}' STRING_CONTENT_TSQ* '\'\'\'') =>
1614 { exitBrace(); } '}' STRING_CONTENT_TSQ* '\'\'\''
1615 ;
1616
1617 fragment
1618 QUOTES_DQ
1619 :
1620 | '"'
1621 | '""'
1622 ;
1623
1624 // Read string contents, which may be almost anything, but stop when seeing
1625 // '"""' and when seeing '${'. We do this by allowing all other possibilities
1626 // including escapes, simple interpolation, and fewer-than-three '"'.
1627 fragment
1628 STRING_CONTENT_TDQ
1629 : QUOTES_DQ
1630 (~('\\' | '$' | '"') | '\\' . | SIMPLE_STRING_INTERPOLATION)
1631 ;
1632
1633 MULTI_LINE_STRING_DQ_BEGIN_END
1634 : '"""' STRING_CONTENT_TDQ* '"""'
1635 ;
1636
1637 MULTI_LINE_STRING_DQ_BEGIN_MID
1638 : '"""' STRING_CONTENT_TDQ* QUOTES_DQ '${'
1639 { enterBraceThreeDoubleQuotes(); }
1640 ;
1641
1642 MULTI_LINE_STRING_DQ_MID_MID
1643 : { currentBraceLevel(BRACE_THREE_DOUBLE) }? =>
1644 ('}' STRING_CONTENT_TDQ* QUOTES_DQ '${') =>
1645 { exitBrace(); } '}' STRING_CONTENT_TDQ* QUOTES_DQ '${'
1646 { enterBraceThreeDoubleQuotes(); }
1647 ;
1648
1649 MULTI_LINE_STRING_DQ_MID_END
1650 : { currentBraceLevel(BRACE_THREE_DOUBLE) }? =>
1651 ('}' STRING_CONTENT_TDQ* '"""') =>
1652 { exitBrace(); } '}' STRING_CONTENT_TDQ* '"""'
1653 ;
1654
1655 LBRACE
1656 : '{' { enterBrace(); }
1657 ;
1658
1659 RBRACE
1660 : { currentBraceLevel(BRACE_NORMAL) }? => ('}') => { exitBrace(); } '}'
1661 ;
1662
1663 fragment
1664 IDENTIFIER_START_NO_DOLLAR
1665 : LETTER
1666 | '_'
1667 ;
1668
1669 fragment
1670 IDENTIFIER_PART_NO_DOLLAR
1671 : IDENTIFIER_START_NO_DOLLAR
1672 | DIGIT
1673 ;
1674
1675 fragment
1676 IDENTIFIER_NO_DOLLAR
1677 : IDENTIFIER_START_NO_DOLLAR IDENTIFIER_PART_NO_DOLLAR*
1678 ;
1679
1680 fragment
1681 IDENTIFIER_START
1682 : IDENTIFIER_START_NO_DOLLAR
1683 | '$'
1684 ;
1685
1686 fragment
1687 IDENTIFIER_PART
1688 : IDENTIFIER_START
1689 | DIGIT
1690 ;
1691
1692 SCRIPT_TAG
1693 : '#!' (~('\r' | '\n'))* NEWLINE
1694 ;
1695
1696 IDENTIFIER
1697 : IDENTIFIER_START IDENTIFIER_PART*
1698 ;
1699
1700 SINGLE_LINE_COMMENT
1701 : '//' (~('\r' | '\n'))* NEWLINE?
1702 { skip(); }
1703 ;
1704
1705 MULTI_LINE_COMMENT
1706 : '/*' (options {greedy=false;} : (MULTI_LINE_COMMENT | .))* '*/'
1707 { skip(); }
1708 ;
1709
1710 fragment
1711 NEWLINE
1712 : ('\r' | '\n' | '\r\n')
1713 ;
1714
1715 FEFF
1716 : '\uFEFF'
1717 ;
1718
1719 WS
1720 : (' ' | '\t' | '\r' | '\n')+
1721 { skip(); }
1722 ;
OLDNEW
« no previous file with comments | « no previous file | tests/language/language_parser.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698