1
+ /*
2
+ * The MIT License (MIT)
3
+ *
4
+ * Copyright (c) 2014 by Bart Kiers (original author) and Alexandre Vitorelli (contributor -> ported to CSharp)
5
+ * Copyright (c) 2017-2020 by Ivan Kochurkin (Positive Technologies):
6
+ added ECMAScript 6 support, cleared and transformed to the universal grammar.
7
+ * Copyright (c) 2018 by Juan Alvarez (contributor -> ported to Go)
8
+ * Copyright (c) 2019 by Student Main (contributor -> ES2020)
9
+ *
10
+ * Permission is hereby granted, free of charge, to any person
11
+ * obtaining a copy of this software and associated documentation
12
+ * files (the "Software"), to deal in the Software without
13
+ * restriction, including without limitation the rights to use,
14
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ * copies of the Software, and to permit persons to whom the
16
+ * Software is furnished to do so, subject to the following
17
+ * conditions:
18
+ *
19
+ * The above copyright notice and this permission notice shall be
20
+ * included in all copies or substantial portions of the Software.
21
+ *
22
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
24
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
27
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
29
+ * OTHER DEALINGS IN THE SOFTWARE.
30
+ */
31
+
32
+ // $antlr-format alignTrailingComments true, columnLimit 150, maxEmptyLinesToKeep 1, reflowComments false, useTab false
33
+ // $antlr-format allowShortRulesOnASingleLine true, allowShortBlocksOnASingleLine true, minEmptyLines 0, alignSemicolons ownLine
34
+ // $antlr-format alignColons trailing, singleLineOverrulesHangingColon true, alignLexerCommands true, alignLabels true, alignTrailers true
35
+
36
+ lexer grammar JavaScriptLexer;
37
+
38
+ channels {
39
+ ERROR
40
+ }
41
+
42
+ options {
43
+ superClass = JavaScriptLexerBase;
44
+ }
45
+
46
+ // Insert here @header for C++ lexer.
47
+
48
+ HashBangLine : { this.IsStartOfFile()} ? ' #!' ~[\r\n\u2028\u2029]*; // only allowed at start
49
+ MultiLineComment : ' /*' .*? ' */' -> channel(HIDDEN );
50
+ SingleLineComment : ' //' ~[\r\n\u2028\u2029]* -> channel(HIDDEN );
51
+ RegularExpressionLiteral :
52
+ ' /' RegularExpressionFirstChar RegularExpressionChar* {this.IsRegexPossible()} ? ' /' IdentifierPart*
53
+ ;
54
+
55
+ OpenBracket : ' [' ;
56
+ CloseBracket : ' ]' ;
57
+ OpenParen : ' (' ;
58
+ CloseParen : ' )' ;
59
+ OpenBrace : ' {' {this.ProcessOpenBrace();} ;
60
+ TemplateCloseBrace : {this.IsInTemplateString()} ? ' }' // Break lines here to ensure proper transformation by Go/transformGrammar.py
61
+ {this.ProcessTemplateCloseBrace();} -> popMode;
62
+ CloseBrace : ' }' {this.ProcessCloseBrace();} ;
63
+ SemiColon : ' ;' ;
64
+ Comma : ' ,' ;
65
+ Assign : ' =' ;
66
+ QuestionMark : ' ?' ;
67
+ QuestionMarkDot : ' ?.' ;
68
+ Colon : ' :' ;
69
+ Ellipsis : ' ...' ;
70
+ Dot : ' .' ;
71
+ PlusPlus : ' ++' ;
72
+ MinusMinus : ' --' ;
73
+ Plus : ' +' ;
74
+ Minus : ' -' ;
75
+ BitNot : ' ~' ;
76
+ Not : ' !' ;
77
+ Multiply : ' *' ;
78
+ Divide : ' /' ;
79
+ Modulus : ' %' ;
80
+ Power : ' **' ;
81
+ NullCoalesce : ' ??' ;
82
+ Hashtag : ' #' ;
83
+ RightShiftArithmetic : ' >>' ;
84
+ LeftShiftArithmetic : ' <<' ;
85
+ RightShiftLogical : ' >>>' ;
86
+ LessThan : ' <' ;
87
+ MoreThan : ' >' ;
88
+ LessThanEquals : ' <=' ;
89
+ GreaterThanEquals : ' >=' ;
90
+ Equals_ : ' ==' ;
91
+ NotEquals : ' !=' ;
92
+ IdentityEquals : ' ===' ;
93
+ IdentityNotEquals : ' !==' ;
94
+ BitAnd : ' &' ;
95
+ BitXOr : ' ^' ;
96
+ BitOr : ' |' ;
97
+ And : ' &&' ;
98
+ Or : ' ||' ;
99
+ MultiplyAssign : ' *=' ;
100
+ DivideAssign : ' /=' ;
101
+ ModulusAssign : ' %=' ;
102
+ PlusAssign : ' +=' ;
103
+ MinusAssign : ' -=' ;
104
+ LeftShiftArithmeticAssign : ' <<=' ;
105
+ RightShiftArithmeticAssign : ' >>=' ;
106
+ RightShiftLogicalAssign : ' >>>=' ;
107
+ BitAndAssign : ' &=' ;
108
+ BitXorAssign : ' ^=' ;
109
+ BitOrAssign : ' |=' ;
110
+ PowerAssign : ' **=' ;
111
+ NullishCoalescingAssign : ' ??=' ;
112
+ ARROW : ' =>' ;
113
+
114
+ // / Null Literals
115
+
116
+ NullLiteral : ' null' ;
117
+
118
+ // / Boolean Literals
119
+
120
+ BooleanLiteral : ' true' | ' false' ;
121
+
122
+ // / Numeric Literals
123
+
124
+ DecimalLiteral :
125
+ DecimalIntegerLiteral ' .' [0-9] [0-9_]* ExponentPart?
126
+ | ' .' [0-9] [0-9_]* ExponentPart?
127
+ | DecimalIntegerLiteral ExponentPart?
128
+ ;
129
+
130
+ // / Numeric Literals
131
+
132
+ HexIntegerLiteral : ' 0' [xX] [0-9a-fA-F ] HexDigit*;
133
+ OctalIntegerLiteral : ' 0' [0-7]+ {!this.IsStrictMode()} ?;
134
+ OctalIntegerLiteral2 : ' 0' [oO] [0-7] [_0 -7]*;
135
+ BinaryIntegerLiteral : ' 0' [bB] [01] [_01 ]*;
136
+
137
+ BigHexIntegerLiteral : ' 0' [xX] [0-9a-fA-F ] HexDigit* ' n' ;
138
+ BigOctalIntegerLiteral : ' 0' [oO] [0-7] [_0 -7]* ' n' ;
139
+ BigBinaryIntegerLiteral : ' 0' [bB] [01] [_01 ]* ' n' ;
140
+ BigDecimalIntegerLiteral : DecimalIntegerLiteral ' n' ;
141
+
142
+ // / Keywords
143
+
144
+ Break : ' break' ;
145
+ Do : ' do' ;
146
+ Instanceof : ' instanceof' ;
147
+ Typeof : ' typeof' ;
148
+ Case : ' case' ;
149
+ Else : ' else' ;
150
+ New : ' new' ;
151
+ Var : ' var' ;
152
+ Catch : ' catch' ;
153
+ Finally : ' finally' ;
154
+ Return : ' return' ;
155
+ Void : ' void' ;
156
+ Continue : ' continue' ;
157
+ For : ' for' ;
158
+ Switch : ' switch' ;
159
+ While : ' while' ;
160
+ Debugger : ' debugger' ;
161
+ Function_ : ' function' ;
162
+ This : ' this' ;
163
+ With : ' with' ;
164
+ Default : ' default' ;
165
+ If : ' if' ;
166
+ Throw : ' throw' ;
167
+ Delete : ' delete' ;
168
+ In : ' in' ;
169
+ Try : ' try' ;
170
+ As : ' as' ;
171
+ From : ' from' ;
172
+ Of : ' of' ;
173
+ Yield : ' yield' ;
174
+ YieldStar : ' yield*' ;
175
+
176
+ // / Future Reserved Words
177
+
178
+ Class : ' class' ;
179
+ Enum : ' enum' ;
180
+ Extends : ' extends' ;
181
+ Super : ' super' ;
182
+ Const : ' const' ;
183
+ Export : ' export' ;
184
+ Import : ' import' ;
185
+
186
+ Async : ' async' ;
187
+ Await : ' await' ;
188
+
189
+ // / The following tokens are also considered to be FutureReservedWords
190
+ // / when parsing strict mode
191
+
192
+ Implements : ' implements' {this.IsStrictMode()} ?;
193
+ StrictLet : ' let' {this.IsStrictMode()} ?;
194
+ NonStrictLet : ' let' {!this.IsStrictMode()} ?;
195
+ Private : ' private' {this.IsStrictMode()} ?;
196
+ Public : ' public' {this.IsStrictMode()} ?;
197
+ Interface : ' interface' {this.IsStrictMode()} ?;
198
+ Package : ' package' {this.IsStrictMode()} ?;
199
+ Protected : ' protected' {this.IsStrictMode()} ?;
200
+ Static : ' static' {this.IsStrictMode()} ?;
201
+
202
+ // / Identifier Names and Identifiers
203
+
204
+ Identifier : IdentifierStart IdentifierPart*;
205
+ // / String Literals
206
+ StringLiteral :
207
+ (' "' DoubleStringCharacter* ' "' | ' \' ' SingleStringCharacter* ' \' ' ) {this.ProcessStringLiteral();}
208
+ ;
209
+
210
+ BackTick : ' `' -> pushMode(TEMPLATE );
211
+
212
+ WhiteSpaces : [\t\u000B\u000C\u0020\u00A0]+ -> channel(HIDDEN );
213
+
214
+ LineTerminator : [\r\n\u2028\u2029] -> channel(HIDDEN );
215
+
216
+ // / Comments
217
+
218
+ HtmlComment : ' <!--' .*? ' -->' -> channel(HIDDEN );
219
+ CDataComment : ' <![CDATA[' .*? ' ]]>' -> channel(HIDDEN );
220
+ UnexpectedCharacter : . -> channel(ERROR );
221
+
222
+ mode TEMPLATE ;
223
+
224
+ BackTickInside : ' `' -> type(BackTick), popMode;
225
+ TemplateStringStartExpression : ' ${' {this.ProcessTemplateOpenBrace();} -> pushMode(DEFAULT_MODE );
226
+ TemplateStringAtom : ~[`];
227
+
228
+ // Fragment rules
229
+
230
+ fragment DoubleStringCharacter: ~[" \\\r\n ] | '\\ ' EscapeSequence | LineContinuation;
231
+
232
+ fragment SingleStringCharacter: ~['\\\r\n ] | '\\ ' EscapeSequence | LineContinuation;
233
+
234
+ fragment EscapeSequence:
235
+ CharacterEscapeSequence
236
+ | '0' // no digit ahead! TODO
237
+ | HexEscapeSequence
238
+ | UnicodeEscapeSequence
239
+ | ExtendedUnicodeEscapeSequence
240
+ ;
241
+
242
+ fragment CharacterEscapeSequence: SingleEscapeCharacter | NonEscapeCharacter;
243
+
244
+ fragment HexEscapeSequence: 'x' HexDigit HexDigit;
245
+
246
+ fragment UnicodeEscapeSequence:
247
+ 'u' HexDigit HexDigit HexDigit HexDigit
248
+ | 'u' '{' HexDigit HexDigit+ '}'
249
+ ;
250
+
251
+ fragment ExtendedUnicodeEscapeSequence: 'u' '{' HexDigit+ '}';
252
+
253
+ fragment SingleEscapeCharacter: ['" \\bfnrtv];
254
+
255
+ fragment NonEscapeCharacter: ~[' "\\ bfnrtv0-9xu\r\n ];
256
+
257
+ fragment EscapeCharacter: SingleEscapeCharacter | [0-9] | [xu];
258
+
259
+ fragment LineContinuation: ' \\' [\r\n\u2028\u2029 ]+;
260
+
261
+ fragment HexDigit: [_0-9a-fA-F];
262
+
263
+ fragment DecimalIntegerLiteral: ' 0' | [1-9] [0-9_]*;
264
+
265
+ fragment ExponentPart: [eE] [+-]? [0-9_]+;
266
+
267
+ fragment IdentifierPart: IdentifierStart | [\p {Mn}] | [\p {Nd}] | [\p {Pc}] | ' \u200C' | ' \u200D' ;
268
+
269
+ fragment IdentifierStart: [\p {L}] | [$_] | ' \\' UnicodeEscapeSequence;
270
+
271
+ fragment RegularExpressionFirstChar:
272
+ ~[*\r\n\u2028\u2029\\ /[]
273
+ | RegularExpressionBackslashSequence
274
+ | ' [' RegularExpressionClassChar* ' ]'
275
+ ;
276
+
277
+ fragment RegularExpressionChar:
278
+ ~[\r\n\u2028\u2029\\ /[]
279
+ | RegularExpressionBackslashSequence
280
+ | ' [' RegularExpressionClassChar* ' ]'
281
+ ;
282
+
283
+ fragment RegularExpressionClassChar: ~[\r\n\u2028\u2029\]\\ ] | RegularExpressionBackslashSequence;
284
+
285
+ fragment RegularExpressionBackslashSequence: ' \\' ~[\r\n\u2028\u2029 ];
0 commit comments