| /* |
| * The MIT License (MIT) |
| * |
| * Copyright (c) 2014 by Bart Kiers (original author) and Alexandre Vitorelli (contributor -> ported to CSharp) |
| * Copyright (c) 2017-2020 by Ivan Kochurkin (Positive Technologies): |
| added ECMAScript 6 support, cleared and transformed to the universal grammar. |
| * Copyright (c) 2018 by Juan Alvarez (contributor -> ported to Go) |
| * Copyright (c) 2019 by Student Main (contributor -> ES2020) |
| * |
| * Permission is hereby granted, free of charge, to any person |
| * obtaining a copy of this software and associated documentation |
| * files (the "Software"), to deal in the Software without |
| * restriction, including without limitation the rights to use, |
| * copy, modify, merge, publish, distribute, sublicense, and/or sell |
| * copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following |
| * conditions: |
| * |
| * The above copyright notice and this permission notice shall be |
| * included in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
| * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
| * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
| * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| |
| // $antlr-format alignTrailingComments true, columnLimit 150, maxEmptyLinesToKeep 1, reflowComments false, useTab false |
| // $antlr-format allowShortRulesOnASingleLine true, allowShortBlocksOnASingleLine true, minEmptyLines 0, alignSemicolons ownLine |
| // $antlr-format alignColons trailing, singleLineOverrulesHangingColon true, alignLexerCommands true, alignLabels true, alignTrailers true |
| |
| lexer grammar JavaScriptLexer; |
| |
| @header { |
| import org.jetbrains.kotlin.js.parser.antlr.JavaScriptLexerBase; |
| } |
| |
| channels { |
| ERROR, |
| COMMENTS |
| } |
| |
| options { |
| superClass = JavaScriptLexerBase; |
| } |
| |
| // Insert here @header for C++ lexer. |
| |
| HashBangLine : { this.isStartOfFile()}? '#!' ~[\r\n\u2028\u2029]*; // only allowed at start |
| MultiLineComment : '/*' .*? '*/' -> channel(COMMENTS); |
| SingleLineComment : '//' ~[\r\n\u2028\u2029]* -> channel(COMMENTS); |
| RegularExpressionLiteral: |
| '/' RegularExpressionFirstChar RegularExpressionChar* {this.isRegexPossible()}? '/' IdentifierPart* |
| ; |
| |
| OpenBracket : '['; |
| CloseBracket : ']'; |
| OpenParen : '('; |
| CloseParen : ')'; |
| OpenBrace : '{' {this.processOpenBrace();}; |
| TemplateCloseBrace : {this.isInTemplateString()}? '}' // Break lines here to ensure proper transformation by Go/transformGrammar.py |
| {this.processTemplateCloseBrace();} -> popMode; |
| CloseBrace : '}' {this.processCloseBrace();}; |
| SemiColon : ';'; |
| Comma : ','; |
| Assign : '='; |
| QuestionMark : '?'; |
| QuestionMarkDot : '?.'; |
| Colon : ':'; |
| Ellipsis : '...'; |
| Dot : '.'; |
| PlusPlus : '++'; |
| MinusMinus : '--'; |
| Plus : '+'; |
| Minus : '-'; |
| BitNot : '~'; |
| Not : '!'; |
| Multiply : '*'; |
| Divide : '/'; |
| Modulus : '%'; |
| Power : '**'; |
| NullCoalesce : '??'; |
| Hashtag : '#'; |
| RightShiftArithmetic : '>>'; |
| LeftShiftArithmetic : '<<'; |
| RightShiftLogical : '>>>'; |
| LessThan : '<'; |
| MoreThan : '>'; |
| LessThanEquals : '<='; |
| GreaterThanEquals : '>='; |
| Equals_ : '=='; |
| NotEquals : '!='; |
| IdentityEquals : '==='; |
| IdentityNotEquals : '!=='; |
| BitAnd : '&'; |
| BitXOr : '^'; |
| BitOr : '|'; |
| And : '&&'; |
| Or : '||'; |
| MultiplyAssign : '*='; |
| DivideAssign : '/='; |
| ModulusAssign : '%='; |
| PlusAssign : '+='; |
| MinusAssign : '-='; |
| LeftShiftArithmeticAssign : '<<='; |
| RightShiftArithmeticAssign : '>>='; |
| RightShiftLogicalAssign : '>>>='; |
| BitAndAssign : '&='; |
| BitXorAssign : '^='; |
| BitOrAssign : '|='; |
| PowerAssign : '**='; |
| NullishCoalescingAssign : '??='; |
| ARROW : '=>'; |
| |
| /// Null Literals |
| |
| NullLiteral: 'null'; |
| |
| /// Boolean Literals |
| |
| BooleanLiteral: 'true' | 'false'; |
| |
| /// Numeric Literals |
| |
| DecimalLiteral: |
| DecimalIntegerLiteral '.' [0-9] [0-9_]* ExponentPart? |
| | '.' [0-9] [0-9_]* ExponentPart? |
| | DecimalIntegerLiteral ExponentPart? |
| ; |
| |
| /// Numeric Literals |
| |
| HexIntegerLiteral : '0' [xX] [0-9a-fA-F] HexDigit*; |
| OctalIntegerLiteral : '0' [0-9]+ {!this.isStrictMode()}?; |
| OctalIntegerLiteral2 : '0' [oO] [0-7] [_0-7]*; |
| BinaryIntegerLiteral : '0' [bB] [01] [_01]*; |
| |
| BigHexIntegerLiteral : '0' [xX] [0-9a-fA-F] HexDigit* 'n'; |
| BigOctalIntegerLiteral : '0' [oO] [0-7] [_0-7]* 'n'; |
| BigBinaryIntegerLiteral : '0' [bB] [01] [_01]* 'n'; |
| BigDecimalIntegerLiteral : DecimalIntegerLiteral 'n'; |
| |
| /// Keywords |
| |
| Break : 'break'; |
| Do : 'do'; |
| Instanceof : 'instanceof'; |
| Typeof : 'typeof'; |
| Case : 'case'; |
| Else : 'else'; |
| New : 'new'; |
| Var : 'var'; |
| Catch : 'catch'; |
| Finally : 'finally'; |
| Return : 'return'; |
| Void : 'void'; |
| Continue : 'continue'; |
| For : 'for'; |
| Switch : 'switch'; |
| While : 'while'; |
| Debugger : 'debugger'; |
| Function_ : 'function'; |
| This : 'this'; |
| With : 'with'; |
| Default : 'default'; |
| If : 'if'; |
| Throw : 'throw'; |
| Delete : 'delete'; |
| In : 'in'; |
| Try : 'try'; |
| As : 'as'; |
| From : 'from'; |
| Of : 'of'; |
| Yield : 'yield'; |
| YieldStar : 'yield*'; |
| |
| /// Future Reserved Words |
| |
| Class : 'class'; |
| Enum : 'enum'; |
| Extends : 'extends'; |
| Super : 'super'; |
| Const : 'const'; |
| Export : 'export'; |
| Import : 'import'; |
| |
| Async : 'async'; |
| Await : 'await'; |
| |
| /// The following tokens are also considered to be FutureReservedWords |
| /// when parsing strict mode |
| |
| Implements : 'implements' {this.isStrictMode()}?; |
| StrictLet : 'let' {this.isStrictMode()}?; |
| NonStrictLet : 'let' {!this.isStrictMode()}?; |
| Private : 'private' {this.isStrictMode()}?; |
| Public : 'public' {this.isStrictMode()}?; |
| Interface : 'interface' {this.isStrictMode()}?; |
| Package : 'package' {this.isStrictMode()}?; |
| Protected : 'protected' {this.isStrictMode()}?; |
| Static : 'static' {this.isStrictMode()}?; |
| |
| /// Special Identifiers |
| |
| Meta : 'meta'; |
| Target : 'target'; |
| |
| /// Identifier Names and Identifiers |
| |
| Identifier: IdentifierStart IdentifierPart*; |
| /// String Literals |
| StringLiteral: |
| ('"' DoubleStringCharacter* '"' | '\'' SingleStringCharacter* '\'') {this.processStringLiteral();} |
| ; |
| |
| BackTick: '`' -> pushMode(TEMPLATE); |
| |
| WhiteSpaces: [\t\u000B\u000C\u0020\u00A0]+ -> channel(HIDDEN); |
| |
| LineTerminator: [\r\n\u2028\u2029] -> channel(HIDDEN); |
| |
| /// Comments |
| |
| HtmlComment : '<!--' .*? '-->' -> channel(COMMENTS); |
| CDataComment : '<![CDATA[' .*? ']]>' -> channel(COMMENTS); |
| UnexpectedCharacter : . -> channel(ERROR); |
| |
| mode TEMPLATE; |
| |
| BackTickInside : '`' -> type(BackTick), popMode; |
| TemplateStringStartExpression : '${' {this.processTemplateOpenBrace();} -> pushMode(DEFAULT_MODE); |
| TemplateStringAtom : (~[`$\\] | '\\' . | '$' ~[{])+; |
| |
| // Fragment rules |
| |
| fragment DoubleStringCharacter: ~["\\\r\n] | '\\' EscapeSequence | LineContinuation; |
| |
| fragment SingleStringCharacter: ~['\\\r\n] | '\\' EscapeSequence | LineContinuation; |
| |
| fragment EscapeSequence: |
| CharacterEscapeSequence |
| | HexEscapeSequence |
| | UnicodeEscapeSequence |
| | ExtendedUnicodeEscapeSequence |
| | OctalEscapeSequence |
| ; |
| |
| fragment CharacterEscapeSequence: SingleEscapeCharacter | NonEscapeCharacter; |
| |
| fragment HexEscapeSequence: 'x' HexDigit HexDigit; |
| |
| fragment UnicodeEscapeSequence: |
| 'u' HexDigit HexDigit HexDigit HexDigit |
| | 'u' '{' HexDigit HexDigit+ '}' |
| ; |
| |
| fragment ExtendedUnicodeEscapeSequence: 'u' '{' HexDigit+ '}'; |
| |
| fragment OctalEscapeSequence: [0-9] [0-9]? [0-9]?; |
| |
| fragment SingleEscapeCharacter: ['"\\bfnrtv]; |
| |
| fragment NonEscapeCharacter: ~['"\\bfnrtv0-9xu\r\n]; |
| |
| fragment LineContinuation: '\\' [\r\n\u2028\u2029]+; |
| |
| fragment HexDigit: [_0-9a-fA-F]; |
| |
| fragment DecimalIntegerLiteral: '0' | [1-9] [0-9_]*; |
| |
| fragment ExponentPart: [eE] [+-]? [0-9_]+; |
| |
| fragment IdentifierPart: IdentifierStart | [\p{Mn}] | [\p{Nd}] | [\p{Pc}] | '\u200C' | '\u200D'; |
| |
| fragment IdentifierStart: [\p{L}] | [$_] | '\\' UnicodeEscapeSequence; |
| |
| fragment RegularExpressionFirstChar: |
| ~[*\r\n\u2028\u2029\\/[] |
| | RegularExpressionBackslashSequence |
| | '[' RegularExpressionClassChar* ']' |
| ; |
| |
| fragment RegularExpressionChar: |
| ~[\r\n\u2028\u2029\\/[] |
| | RegularExpressionBackslashSequence |
| | '[' RegularExpressionClassChar* ']' |
| ; |
| |
| fragment RegularExpressionClassChar: ~[\r\n\u2028\u2029\]\\] | RegularExpressionBackslashSequence; |
| |
| fragment RegularExpressionBackslashSequence: '\\' ~[\r\n\u2028\u2029]; |