mirror of https://github.com/t1meshift/js.git
				
				
				
			Initial commit
						commit
						812f5107c3
					
				|  | @ -0,0 +1,108 @@ | ||||||
|  | .idea | ||||||
|  | 
 | ||||||
|  | ### Python ### | ||||||
|  | # Byte-compiled / optimized / DLL files | ||||||
|  | __pycache__/ | ||||||
|  | *.py[cod] | ||||||
|  | *$py.class | ||||||
|  | 
 | ||||||
|  | # C extensions | ||||||
|  | *.so | ||||||
|  | 
 | ||||||
|  | # Distribution / packaging | ||||||
|  | .Python | ||||||
|  | build/ | ||||||
|  | develop-eggs/ | ||||||
|  | dist/ | ||||||
|  | downloads/ | ||||||
|  | eggs/ | ||||||
|  | .eggs/ | ||||||
|  | lib/ | ||||||
|  | lib64/ | ||||||
|  | parts/ | ||||||
|  | sdist/ | ||||||
|  | var/ | ||||||
|  | wheels/ | ||||||
|  | pip-wheel-metadata/ | ||||||
|  | share/python-wheels/ | ||||||
|  | *.egg-info/ | ||||||
|  | .installed.cfg | ||||||
|  | *.egg | ||||||
|  | MANIFEST | ||||||
|  | 
 | ||||||
|  | # PyInstaller | ||||||
|  | #  Usually these files are written by a python script from a template | ||||||
|  | #  before PyInstaller builds the exe, so as to inject date/other infos into it. | ||||||
|  | *.manifest | ||||||
|  | *.spec | ||||||
|  | 
 | ||||||
|  | # Installer logs | ||||||
|  | pip-log.txt | ||||||
|  | pip-delete-this-directory.txt | ||||||
|  | 
 | ||||||
|  | # Unit test / coverage reports | ||||||
|  | htmlcov/ | ||||||
|  | .tox/ | ||||||
|  | .nox/ | ||||||
|  | .coverage | ||||||
|  | .coverage.* | ||||||
|  | .cache | ||||||
|  | nosetests.xml | ||||||
|  | coverage.xml | ||||||
|  | *.cover | ||||||
|  | .hypothesis/ | ||||||
|  | .pytest_cache/ | ||||||
|  | 
 | ||||||
|  | # Translations | ||||||
|  | *.mo | ||||||
|  | *.pot | ||||||
|  | 
 | ||||||
|  | # Scrapy stuff: | ||||||
|  | .scrapy | ||||||
|  | 
 | ||||||
|  | # Sphinx documentation | ||||||
|  | docs/_build/ | ||||||
|  | 
 | ||||||
|  | # PyBuilder | ||||||
|  | target/ | ||||||
|  | 
 | ||||||
|  | # pyenv | ||||||
|  | .python-version | ||||||
|  | 
 | ||||||
|  | # pipenv | ||||||
|  | #   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. | ||||||
|  | #   However, in case of collaboration, if having platform-specific dependencies or dependencies | ||||||
|  | #   having no cross-platform support, pipenv may install dependencies that don't work, or not | ||||||
|  | #   install all needed dependencies. | ||||||
|  | #Pipfile.lock | ||||||
|  | 
 | ||||||
|  | # celery beat schedule file | ||||||
|  | celerybeat-schedule | ||||||
|  | 
 | ||||||
|  | # SageMath parsed files | ||||||
|  | *.sage.py | ||||||
|  | 
 | ||||||
|  | # Spyder project settings | ||||||
|  | .spyderproject | ||||||
|  | .spyproject | ||||||
|  | 
 | ||||||
|  | # Rope project settings | ||||||
|  | .ropeproject | ||||||
|  | 
 | ||||||
|  | # Mr Developer | ||||||
|  | .mr.developer.cfg | ||||||
|  | .project | ||||||
|  | .pydevproject | ||||||
|  | 
 | ||||||
|  | # mkdocs documentation | ||||||
|  | /site | ||||||
|  | 
 | ||||||
|  | # mypy | ||||||
|  | .mypy_cache/ | ||||||
|  | .dmypy.json | ||||||
|  | dmypy.json | ||||||
|  | 
 | ||||||
|  | # Pyre type checker | ||||||
|  | .pyre/ | ||||||
|  | 
 | ||||||
|  | venv | ||||||
|  | @ -0,0 +1,21 @@ | ||||||
|  | MIT License | ||||||
|  | 
 | ||||||
|  | Copyright (c) 2020 Yury Kurlykov | ||||||
|  | 
 | ||||||
|  | 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. | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | # Jasmine Snake | ||||||
|  | Another JavaScript interpreter written on Python 3. | ||||||
|  | 
 | ||||||
|  | [](https://github.com/psf/black) | ||||||
|  | [](https://semver.org/spec/v2.0.0.html) | ||||||
|  | 
 | ||||||
|  | ## Requirements | ||||||
|  | 
 | ||||||
|  | - ANTLR 4 | ||||||
|  | - Colorama | ||||||
|  | 
 | ||||||
|  | To run tests: | ||||||
|  | 
 | ||||||
|  | - pylint | ||||||
|  | - Tox | ||||||
|  | 
 | ||||||
|  | You can get ANTLR [here](https://www.antlr.org/), other dependencies could be installed with pip: | ||||||
|  | ```bash | ||||||
|  | pip install -r requirements.txt # Use requirements-dev.txt if you want to run tests | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Running | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | antlr4 -o jasminesnake/lex -package lex -Dlanguage=Python3 grammars/*.g4 | ||||||
|  | python -m jasminesnake | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ## Credits | ||||||
|  | 
 | ||||||
|  | JavaScript grammar source:  | ||||||
|  | [https://github.com/antlr/grammars-v4/tree/master/javascript/javascript](https://github.com/antlr/grammars-v4/tree/master/javascript/javascript) | ||||||
|  | @ -0,0 +1,711 @@ | ||||||
|  | /* | ||||||
|  |  * 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. | ||||||
|  |  */ | ||||||
|  | lexer grammar JavaScriptLexer; | ||||||
|  | 
 | ||||||
|  | channels { ERROR } | ||||||
|  | 
 | ||||||
|  | options { superClass=JavaScriptBaseLexer; } | ||||||
|  | 
 | ||||||
|  | HashBangLine:                   { self.isStartOfFile()}? '#!' ~[\r\n\u2028\u2029]*; // only allowed at start | ||||||
|  | MultiLineComment:               '/*' .*? '*/'             -> channel(HIDDEN); | ||||||
|  | SingleLineComment:              '//' ~[\r\n\u2028\u2029]* -> channel(HIDDEN); | ||||||
|  | RegularExpressionLiteral:       '/' RegularExpressionFirstChar RegularExpressionChar* {self.isRegexPossible()}? '/' IdentifierPart*; | ||||||
|  | 
 | ||||||
|  | OpenBracket:                    '['; | ||||||
|  | CloseBracket:                   ']'; | ||||||
|  | OpenParen:                      '('; | ||||||
|  | CloseParen:                     ')'; | ||||||
|  | OpenBrace:                      '{' {self.processOpenBrace()}; | ||||||
|  | CloseBrace:                     '}' {self.processCloseBrace()}; | ||||||
|  | SemiColon:                      ';'; | ||||||
|  | Comma:                          ','; | ||||||
|  | Assign:                         '='; | ||||||
|  | QuestionMark:                   '?'; | ||||||
|  | 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:                    '**='; | ||||||
|  | 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-7]+ {not self.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'; | ||||||
|  | Typeof:                         'typeof'; | ||||||
|  | Else:                           'else'; | ||||||
|  | New:                            'new'; | ||||||
|  | Var:                            'var'; | ||||||
|  | Return:                         'return'; | ||||||
|  | Void:                           'void'; | ||||||
|  | Continue:                       'continue'; | ||||||
|  | For:                            'for'; | ||||||
|  | While:                          'while'; | ||||||
|  | Function:                       'function'; | ||||||
|  | This:                           'this'; | ||||||
|  | Default:                        'default'; | ||||||
|  | If:                             'if'; | ||||||
|  | Throw:                          'throw'; | ||||||
|  | Delete:                         'delete'; | ||||||
|  | In:                             'in'; | ||||||
|  | As:                             'as'; | ||||||
|  | From:                           'from'; | ||||||
|  | 
 | ||||||
|  | /// Unused words in this project | ||||||
|  | 
 | ||||||
|  | //Instanceof:                     'instanceof'; | ||||||
|  | //Case:                           'case'; | ||||||
|  | //Catch:                          'catch'; | ||||||
|  | //Finally:                        'finally'; | ||||||
|  | //Switch:                         'switch'; | ||||||
|  | //Debugger:                       'debugger'; | ||||||
|  | //With:                           'with'; | ||||||
|  | //Try:                            'try'; | ||||||
|  | 
 | ||||||
|  | /// 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' {self.isStrictMode()}?; | ||||||
|  | StrictLet:                      'let' {self.isStrictMode()}?; | ||||||
|  | NonStrictLet:                   'let' {not self.isStrictMode()}?; | ||||||
|  | Private:                        'private' {self.isStrictMode()}?; | ||||||
|  | Public:                         'public' {self.isStrictMode()}?; | ||||||
|  | Interface:                      'interface' {self.isStrictMode()}?; | ||||||
|  | Package:                        'package' {self.isStrictMode()}?; | ||||||
|  | Protected:                      'protected' {self.isStrictMode()}?; | ||||||
|  | Static:                         'static' {self.isStrictMode()}?; | ||||||
|  | //Yield:                          'yield' {self.isStrictMode()}?; | ||||||
|  | 
 | ||||||
|  | /// Identifier Names and Identifiers | ||||||
|  | 
 | ||||||
|  | Identifier:                     IdentifierStart IdentifierPart*; | ||||||
|  | /// String Literals | ||||||
|  | StringLiteral:                 ('"' DoubleStringCharacter* '"' | ||||||
|  |              |                  '\'' SingleStringCharacter* '\'') {self.processStringLiteral()} | ||||||
|  |              ; | ||||||
|  | 
 | ||||||
|  | // TODO: `${`tmp`}` | ||||||
|  | TemplateStringLiteral:          '`' ('\\`' | ~'`')* '`'; | ||||||
|  | 
 | ||||||
|  | WhiteSpaces:                    [\t\u000B\u000C\u0020\u00A0]+ -> channel(HIDDEN); | ||||||
|  | 
 | ||||||
|  | LineTerminator:                 [\r\n\u2028\u2029] -> channel(HIDDEN); | ||||||
|  | 
 | ||||||
|  | /// Comments | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | HtmlComment:                    '<!--' .*? '-->' -> channel(HIDDEN); | ||||||
|  | CDataComment:                   '<![CDATA[' .*? ']]>' -> channel(HIDDEN); | ||||||
|  | UnexpectedCharacter:            . -> channel(ERROR); | ||||||
|  | 
 | ||||||
|  | // Fragment rules | ||||||
|  | 
 | ||||||
|  | fragment DoubleStringCharacter | ||||||
|  |     : ~["\\\r\n] | ||||||
|  |     | '\\' EscapeSequence | ||||||
|  |     | LineContinuation | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment SingleStringCharacter | ||||||
|  |     : ~['\\\r\n] | ||||||
|  |     | '\\' EscapeSequence | ||||||
|  |     | LineContinuation | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment EscapeSequence | ||||||
|  |     : CharacterEscapeSequence | ||||||
|  |     | '0' // no digit ahead! TODO | ||||||
|  |     | HexEscapeSequence | ||||||
|  |     | UnicodeEscapeSequence | ||||||
|  |     | ExtendedUnicodeEscapeSequence | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment CharacterEscapeSequence | ||||||
|  |     : SingleEscapeCharacter | ||||||
|  |     | NonEscapeCharacter | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment HexEscapeSequence | ||||||
|  |     : 'x' HexDigit HexDigit | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment UnicodeEscapeSequence | ||||||
|  |     : 'u' HexDigit HexDigit HexDigit HexDigit | ||||||
|  |     | 'u' '{' HexDigit HexDigit+ '}' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment ExtendedUnicodeEscapeSequence | ||||||
|  |     : 'u' '{' HexDigit+ '}' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment SingleEscapeCharacter | ||||||
|  |     : ['"\\bfnrtv] | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment NonEscapeCharacter | ||||||
|  |     : ~['"\\bfnrtv0-9xu\r\n] | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment EscapeCharacter | ||||||
|  |     : SingleEscapeCharacter | ||||||
|  |     | [0-9] | ||||||
|  |     | [xu] | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | 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 | ||||||
|  |     | UnicodeCombiningMark | ||||||
|  |     | UnicodeDigit | ||||||
|  |     | UnicodeConnectorPunctuation | ||||||
|  |     | '\u200C' | ||||||
|  |     | '\u200D' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment IdentifierStart | ||||||
|  |     : UnicodeLetter | ||||||
|  |     | [$_] | ||||||
|  |     | '\\' UnicodeEscapeSequence | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment UnicodeLetter | ||||||
|  |     : [\u0041-\u005A] | ||||||
|  |     | [\u0061-\u007A] | ||||||
|  |     | [\u00AA] | ||||||
|  |     | [\u00B5] | ||||||
|  |     | [\u00BA] | ||||||
|  |     | [\u00C0-\u00D6] | ||||||
|  |     | [\u00D8-\u00F6] | ||||||
|  |     | [\u00F8-\u021F] | ||||||
|  |     | [\u0222-\u0233] | ||||||
|  |     | [\u0250-\u02AD] | ||||||
|  |     | [\u02B0-\u02B8] | ||||||
|  |     | [\u02BB-\u02C1] | ||||||
|  |     | [\u02D0-\u02D1] | ||||||
|  |     | [\u02E0-\u02E4] | ||||||
|  |     | [\u02EE] | ||||||
|  |     | [\u037A] | ||||||
|  |     | [\u0386] | ||||||
|  |     | [\u0388-\u038A] | ||||||
|  |     | [\u038C] | ||||||
|  |     | [\u038E-\u03A1] | ||||||
|  |     | [\u03A3-\u03CE] | ||||||
|  |     | [\u03D0-\u03D7] | ||||||
|  |     | [\u03DA-\u03F3] | ||||||
|  |     | [\u0400-\u0481] | ||||||
|  |     | [\u048C-\u04C4] | ||||||
|  |     | [\u04C7-\u04C8] | ||||||
|  |     | [\u04CB-\u04CC] | ||||||
|  |     | [\u04D0-\u04F5] | ||||||
|  |     | [\u04F8-\u04F9] | ||||||
|  |     | [\u0531-\u0556] | ||||||
|  |     | [\u0559] | ||||||
|  |     | [\u0561-\u0587] | ||||||
|  |     | [\u05D0-\u05EA] | ||||||
|  |     | [\u05F0-\u05F2] | ||||||
|  |     | [\u0621-\u063A] | ||||||
|  |     | [\u0640-\u064A] | ||||||
|  |     | [\u0671-\u06D3] | ||||||
|  |     | [\u06D5] | ||||||
|  |     | [\u06E5-\u06E6] | ||||||
|  |     | [\u06FA-\u06FC] | ||||||
|  |     | [\u0710] | ||||||
|  |     | [\u0712-\u072C] | ||||||
|  |     | [\u0780-\u07A5] | ||||||
|  |     | [\u0905-\u0939] | ||||||
|  |     | [\u093D] | ||||||
|  |     | [\u0950] | ||||||
|  |     | [\u0958-\u0961] | ||||||
|  |     | [\u0985-\u098C] | ||||||
|  |     | [\u098F-\u0990] | ||||||
|  |     | [\u0993-\u09A8] | ||||||
|  |     | [\u09AA-\u09B0] | ||||||
|  |     | [\u09B2] | ||||||
|  |     | [\u09B6-\u09B9] | ||||||
|  |     | [\u09DC-\u09DD] | ||||||
|  |     | [\u09DF-\u09E1] | ||||||
|  |     | [\u09F0-\u09F1] | ||||||
|  |     | [\u0A05-\u0A0A] | ||||||
|  |     | [\u0A0F-\u0A10] | ||||||
|  |     | [\u0A13-\u0A28] | ||||||
|  |     | [\u0A2A-\u0A30] | ||||||
|  |     | [\u0A32-\u0A33] | ||||||
|  |     | [\u0A35-\u0A36] | ||||||
|  |     | [\u0A38-\u0A39] | ||||||
|  |     | [\u0A59-\u0A5C] | ||||||
|  |     | [\u0A5E] | ||||||
|  |     | [\u0A72-\u0A74] | ||||||
|  |     | [\u0A85-\u0A8B] | ||||||
|  |     | [\u0A8D] | ||||||
|  |     | [\u0A8F-\u0A91] | ||||||
|  |     | [\u0A93-\u0AA8] | ||||||
|  |     | [\u0AAA-\u0AB0] | ||||||
|  |     | [\u0AB2-\u0AB3] | ||||||
|  |     | [\u0AB5-\u0AB9] | ||||||
|  |     | [\u0ABD] | ||||||
|  |     | [\u0AD0] | ||||||
|  |     | [\u0AE0] | ||||||
|  |     | [\u0B05-\u0B0C] | ||||||
|  |     | [\u0B0F-\u0B10] | ||||||
|  |     | [\u0B13-\u0B28] | ||||||
|  |     | [\u0B2A-\u0B30] | ||||||
|  |     | [\u0B32-\u0B33] | ||||||
|  |     | [\u0B36-\u0B39] | ||||||
|  |     | [\u0B3D] | ||||||
|  |     | [\u0B5C-\u0B5D] | ||||||
|  |     | [\u0B5F-\u0B61] | ||||||
|  |     | [\u0B85-\u0B8A] | ||||||
|  |     | [\u0B8E-\u0B90] | ||||||
|  |     | [\u0B92-\u0B95] | ||||||
|  |     | [\u0B99-\u0B9A] | ||||||
|  |     | [\u0B9C] | ||||||
|  |     | [\u0B9E-\u0B9F] | ||||||
|  |     | [\u0BA3-\u0BA4] | ||||||
|  |     | [\u0BA8-\u0BAA] | ||||||
|  |     | [\u0BAE-\u0BB5] | ||||||
|  |     | [\u0BB7-\u0BB9] | ||||||
|  |     | [\u0C05-\u0C0C] | ||||||
|  |     | [\u0C0E-\u0C10] | ||||||
|  |     | [\u0C12-\u0C28] | ||||||
|  |     | [\u0C2A-\u0C33] | ||||||
|  |     | [\u0C35-\u0C39] | ||||||
|  |     | [\u0C60-\u0C61] | ||||||
|  |     | [\u0C85-\u0C8C] | ||||||
|  |     | [\u0C8E-\u0C90] | ||||||
|  |     | [\u0C92-\u0CA8] | ||||||
|  |     | [\u0CAA-\u0CB3] | ||||||
|  |     | [\u0CB5-\u0CB9] | ||||||
|  |     | [\u0CDE] | ||||||
|  |     | [\u0CE0-\u0CE1] | ||||||
|  |     | [\u0D05-\u0D0C] | ||||||
|  |     | [\u0D0E-\u0D10] | ||||||
|  |     | [\u0D12-\u0D28] | ||||||
|  |     | [\u0D2A-\u0D39] | ||||||
|  |     | [\u0D60-\u0D61] | ||||||
|  |     | [\u0D85-\u0D96] | ||||||
|  |     | [\u0D9A-\u0DB1] | ||||||
|  |     | [\u0DB3-\u0DBB] | ||||||
|  |     | [\u0DBD] | ||||||
|  |     | [\u0DC0-\u0DC6] | ||||||
|  |     | [\u0E01-\u0E30] | ||||||
|  |     | [\u0E32-\u0E33] | ||||||
|  |     | [\u0E40-\u0E46] | ||||||
|  |     | [\u0E81-\u0E82] | ||||||
|  |     | [\u0E84] | ||||||
|  |     | [\u0E87-\u0E88] | ||||||
|  |     | [\u0E8A] | ||||||
|  |     | [\u0E8D] | ||||||
|  |     | [\u0E94-\u0E97] | ||||||
|  |     | [\u0E99-\u0E9F] | ||||||
|  |     | [\u0EA1-\u0EA3] | ||||||
|  |     | [\u0EA5] | ||||||
|  |     | [\u0EA7] | ||||||
|  |     | [\u0EAA-\u0EAB] | ||||||
|  |     | [\u0EAD-\u0EB0] | ||||||
|  |     | [\u0EB2-\u0EB3] | ||||||
|  |     | [\u0EBD-\u0EC4] | ||||||
|  |     | [\u0EC6] | ||||||
|  |     | [\u0EDC-\u0EDD] | ||||||
|  |     | [\u0F00] | ||||||
|  |     | [\u0F40-\u0F6A] | ||||||
|  |     | [\u0F88-\u0F8B] | ||||||
|  |     | [\u1000-\u1021] | ||||||
|  |     | [\u1023-\u1027] | ||||||
|  |     | [\u1029-\u102A] | ||||||
|  |     | [\u1050-\u1055] | ||||||
|  |     | [\u10A0-\u10C5] | ||||||
|  |     | [\u10D0-\u10F6] | ||||||
|  |     | [\u1100-\u1159] | ||||||
|  |     | [\u115F-\u11A2] | ||||||
|  |     | [\u11A8-\u11F9] | ||||||
|  |     | [\u1200-\u1206] | ||||||
|  |     | [\u1208-\u1246] | ||||||
|  |     | [\u1248] | ||||||
|  |     | [\u124A-\u124D] | ||||||
|  |     | [\u1250-\u1256] | ||||||
|  |     | [\u1258] | ||||||
|  |     | [\u125A-\u125D] | ||||||
|  |     | [\u1260-\u1286] | ||||||
|  |     | [\u1288] | ||||||
|  |     | [\u128A-\u128D] | ||||||
|  |     | [\u1290-\u12AE] | ||||||
|  |     | [\u12B0] | ||||||
|  |     | [\u12B2-\u12B5] | ||||||
|  |     | [\u12B8-\u12BE] | ||||||
|  |     | [\u12C0] | ||||||
|  |     | [\u12C2-\u12C5] | ||||||
|  |     | [\u12C8-\u12CE] | ||||||
|  |     | [\u12D0-\u12D6] | ||||||
|  |     | [\u12D8-\u12EE] | ||||||
|  |     | [\u12F0-\u130E] | ||||||
|  |     | [\u1310] | ||||||
|  |     | [\u1312-\u1315] | ||||||
|  |     | [\u1318-\u131E] | ||||||
|  |     | [\u1320-\u1346] | ||||||
|  |     | [\u1348-\u135A] | ||||||
|  |     | [\u13A0-\u13B0] | ||||||
|  |     | [\u13B1-\u13F4] | ||||||
|  |     | [\u1401-\u1676] | ||||||
|  |     | [\u1681-\u169A] | ||||||
|  |     | [\u16A0-\u16EA] | ||||||
|  |     | [\u1780-\u17B3] | ||||||
|  |     | [\u1820-\u1877] | ||||||
|  |     | [\u1880-\u18A8] | ||||||
|  |     | [\u1E00-\u1E9B] | ||||||
|  |     | [\u1EA0-\u1EE0] | ||||||
|  |     | [\u1EE1-\u1EF9] | ||||||
|  |     | [\u1F00-\u1F15] | ||||||
|  |     | [\u1F18-\u1F1D] | ||||||
|  |     | [\u1F20-\u1F39] | ||||||
|  |     | [\u1F3A-\u1F45] | ||||||
|  |     | [\u1F48-\u1F4D] | ||||||
|  |     | [\u1F50-\u1F57] | ||||||
|  |     | [\u1F59] | ||||||
|  |     | [\u1F5B] | ||||||
|  |     | [\u1F5D] | ||||||
|  |     | [\u1F5F-\u1F7D] | ||||||
|  |     | [\u1F80-\u1FB4] | ||||||
|  |     | [\u1FB6-\u1FBC] | ||||||
|  |     | [\u1FBE] | ||||||
|  |     | [\u1FC2-\u1FC4] | ||||||
|  |     | [\u1FC6-\u1FCC] | ||||||
|  |     | [\u1FD0-\u1FD3] | ||||||
|  |     | [\u1FD6-\u1FDB] | ||||||
|  |     | [\u1FE0-\u1FEC] | ||||||
|  |     | [\u1FF2-\u1FF4] | ||||||
|  |     | [\u1FF6-\u1FFC] | ||||||
|  |     | [\u207F] | ||||||
|  |     | [\u2102] | ||||||
|  |     | [\u2107] | ||||||
|  |     | [\u210A-\u2113] | ||||||
|  |     | [\u2115] | ||||||
|  |     | [\u2119-\u211D] | ||||||
|  |     | [\u2124] | ||||||
|  |     | [\u2126] | ||||||
|  |     | [\u2128] | ||||||
|  |     | [\u212A-\u212D] | ||||||
|  |     | [\u212F-\u2131] | ||||||
|  |     | [\u2133-\u2139] | ||||||
|  |     | [\u2160-\u2183] | ||||||
|  |     | [\u3005-\u3007] | ||||||
|  |     | [\u3021-\u3029] | ||||||
|  |     | [\u3031-\u3035] | ||||||
|  |     | [\u3038-\u303A] | ||||||
|  |     | [\u3041-\u3094] | ||||||
|  |     | [\u309D-\u309E] | ||||||
|  |     | [\u30A1-\u30FA] | ||||||
|  |     | [\u30FC-\u30FE] | ||||||
|  |     | [\u3105-\u312C] | ||||||
|  |     | [\u3131-\u318E] | ||||||
|  |     | [\u31A0-\u31B7] | ||||||
|  |     | [\u3400-\u4DBF] | ||||||
|  |     | [\u4E00-\u9FFF] | ||||||
|  |     | [\uA000-\uA48C] | ||||||
|  |     | [\uAC00] | ||||||
|  |     | [\uD7A3] | ||||||
|  |     | [\uF900-\uFA2D] | ||||||
|  |     | [\uFB00-\uFB06] | ||||||
|  |     | [\uFB13-\uFB17] | ||||||
|  |     | [\uFB1D] | ||||||
|  |     | [\uFB1F-\uFB28] | ||||||
|  |     | [\uFB2A-\uFB36] | ||||||
|  |     | [\uFB38-\uFB3C] | ||||||
|  |     | [\uFB3E] | ||||||
|  |     | [\uFB40-\uFB41] | ||||||
|  |     | [\uFB43-\uFB44] | ||||||
|  |     | [\uFB46-\uFBB1] | ||||||
|  |     | [\uFBD3-\uFD3D] | ||||||
|  |     | [\uFD50-\uFD8F] | ||||||
|  |     | [\uFD92-\uFDC7] | ||||||
|  |     | [\uFDF0-\uFDFB] | ||||||
|  |     | [\uFE70-\uFE72] | ||||||
|  |     | [\uFE74] | ||||||
|  |     | [\uFE76-\uFEFC] | ||||||
|  |     | [\uFF21-\uFF3A] | ||||||
|  |     | [\uFF41-\uFF5A] | ||||||
|  |     | [\uFF66-\uFFBE] | ||||||
|  |     | [\uFFC2-\uFFC7] | ||||||
|  |     | [\uFFCA-\uFFCF] | ||||||
|  |     | [\uFFD2-\uFFD7] | ||||||
|  |     | [\uFFDA-\uFFDC] | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment UnicodeCombiningMark | ||||||
|  |     : [\u0300-\u034E] | ||||||
|  |     | [\u0360-\u0362] | ||||||
|  |     | [\u0483-\u0486] | ||||||
|  |     | [\u0591-\u05A1] | ||||||
|  |     | [\u05A3-\u05B9] | ||||||
|  |     | [\u05BB-\u05BD] | ||||||
|  |     | [\u05BF] | ||||||
|  |     | [\u05C1-\u05C2] | ||||||
|  |     | [\u05C4] | ||||||
|  |     | [\u064B-\u0655] | ||||||
|  |     | [\u0670] | ||||||
|  |     | [\u06D6-\u06DC] | ||||||
|  |     | [\u06DF-\u06E4] | ||||||
|  |     | [\u06E7-\u06E8] | ||||||
|  |     | [\u06EA-\u06ED] | ||||||
|  |     | [\u0711] | ||||||
|  |     | [\u0730-\u074A] | ||||||
|  |     | [\u07A6-\u07B0] | ||||||
|  |     | [\u0901-\u0903] | ||||||
|  |     | [\u093C] | ||||||
|  |     | [\u093E-\u094D] | ||||||
|  |     | [\u0951-\u0954] | ||||||
|  |     | [\u0962-\u0963] | ||||||
|  |     | [\u0981-\u0983] | ||||||
|  |     | [\u09BC-\u09C4] | ||||||
|  |     | [\u09C7-\u09C8] | ||||||
|  |     | [\u09CB-\u09CD] | ||||||
|  |     | [\u09D7] | ||||||
|  |     | [\u09E2-\u09E3] | ||||||
|  |     | [\u0A02] | ||||||
|  |     | [\u0A3C] | ||||||
|  |     | [\u0A3E-\u0A42] | ||||||
|  |     | [\u0A47-\u0A48] | ||||||
|  |     | [\u0A4B-\u0A4D] | ||||||
|  |     | [\u0A70-\u0A71] | ||||||
|  |     | [\u0A81-\u0A83] | ||||||
|  |     | [\u0ABC] | ||||||
|  |     | [\u0ABE-\u0AC5] | ||||||
|  |     | [\u0AC7-\u0AC9] | ||||||
|  |     | [\u0ACB-\u0ACD] | ||||||
|  |     | [\u0B01-\u0B03] | ||||||
|  |     | [\u0B3C] | ||||||
|  |     | [\u0B3E-\u0B43] | ||||||
|  |     | [\u0B47-\u0B48] | ||||||
|  |     | [\u0B4B-\u0B4D] | ||||||
|  |     | [\u0B56-\u0B57] | ||||||
|  |     | [\u0B82-\u0B83] | ||||||
|  |     | [\u0BBE-\u0BC2] | ||||||
|  |     | [\u0BC6-\u0BC8] | ||||||
|  |     | [\u0BCA-\u0BCD] | ||||||
|  |     | [\u0BD7] | ||||||
|  |     | [\u0C01-\u0C03] | ||||||
|  |     | [\u0C3E-\u0C44] | ||||||
|  |     | [\u0C46-\u0C48] | ||||||
|  |     | [\u0C4A-\u0C4D] | ||||||
|  |     | [\u0C55-\u0C56] | ||||||
|  |     | [\u0C82-\u0C83] | ||||||
|  |     | [\u0CBE-\u0CC4] | ||||||
|  |     | [\u0CC6-\u0CC8] | ||||||
|  |     | [\u0CCA-\u0CCD] | ||||||
|  |     | [\u0CD5-\u0CD6] | ||||||
|  |     | [\u0D02-\u0D03] | ||||||
|  |     | [\u0D3E-\u0D43] | ||||||
|  |     | [\u0D46-\u0D48] | ||||||
|  |     | [\u0D4A-\u0D4D] | ||||||
|  |     | [\u0D57] | ||||||
|  |     | [\u0D82-\u0D83] | ||||||
|  |     | [\u0DCA] | ||||||
|  |     | [\u0DCF-\u0DD4] | ||||||
|  |     | [\u0DD6] | ||||||
|  |     | [\u0DD8-\u0DDF] | ||||||
|  |     | [\u0DF2-\u0DF3] | ||||||
|  |     | [\u0E31] | ||||||
|  |     | [\u0E34-\u0E3A] | ||||||
|  |     | [\u0E47-\u0E4E] | ||||||
|  |     | [\u0EB1] | ||||||
|  |     | [\u0EB4-\u0EB9] | ||||||
|  |     | [\u0EBB-\u0EBC] | ||||||
|  |     | [\u0EC8-\u0ECD] | ||||||
|  |     | [\u0F18-\u0F19] | ||||||
|  |     | [\u0F35] | ||||||
|  |     | [\u0F37] | ||||||
|  |     | [\u0F39] | ||||||
|  |     | [\u0F3E-\u0F3F] | ||||||
|  |     | [\u0F71-\u0F84] | ||||||
|  |     | [\u0F86-\u0F87] | ||||||
|  |     | [\u0F90-\u0F97] | ||||||
|  |     | [\u0F99-\u0FBC] | ||||||
|  |     | [\u0FC6] | ||||||
|  |     | [\u102C-\u1032] | ||||||
|  |     | [\u1036-\u1039] | ||||||
|  |     | [\u1056-\u1059] | ||||||
|  |     | [\u17B4-\u17D3] | ||||||
|  |     | [\u18A9] | ||||||
|  |     | [\u20D0-\u20DC] | ||||||
|  |     | [\u20E1] | ||||||
|  |     | [\u302A-\u302F] | ||||||
|  |     | [\u3099-\u309A] | ||||||
|  |     | [\uFB1E] | ||||||
|  |     | [\uFE20-\uFE23] | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment UnicodeDigit | ||||||
|  |     : [\u0030-\u0039] | ||||||
|  |     | [\u0660-\u0669] | ||||||
|  |     | [\u06F0-\u06F9] | ||||||
|  |     | [\u0966-\u096F] | ||||||
|  |     | [\u09E6-\u09EF] | ||||||
|  |     | [\u0A66-\u0A6F] | ||||||
|  |     | [\u0AE6-\u0AEF] | ||||||
|  |     | [\u0B66-\u0B6F] | ||||||
|  |     | [\u0BE7-\u0BEF] | ||||||
|  |     | [\u0C66-\u0C6F] | ||||||
|  |     | [\u0CE6-\u0CEF] | ||||||
|  |     | [\u0D66-\u0D6F] | ||||||
|  |     | [\u0E50-\u0E59] | ||||||
|  |     | [\u0ED0-\u0ED9] | ||||||
|  |     | [\u0F20-\u0F29] | ||||||
|  |     | [\u1040-\u1049] | ||||||
|  |     | [\u1369-\u1371] | ||||||
|  |     | [\u17E0-\u17E9] | ||||||
|  |     | [\u1810-\u1819] | ||||||
|  |     | [\uFF10-\uFF19] | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | fragment UnicodeConnectorPunctuation | ||||||
|  |     : [\u005F] | ||||||
|  |     | [\u203F-\u2040] | ||||||
|  |     | [\u30FB] | ||||||
|  |     | [\uFE33-\uFE34] | ||||||
|  |     | [\uFE4D-\uFE4F] | ||||||
|  |     | [\uFF3F] | ||||||
|  |     | [\uFF65] | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | 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] | ||||||
|  |     ; | ||||||
|  | @ -0,0 +1,511 @@ | ||||||
|  | /* | ||||||
|  |  * 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. | ||||||
|  |  */ | ||||||
|  | parser grammar JavaScriptParser; | ||||||
|  | 
 | ||||||
|  | options { | ||||||
|  |     tokenVocab=JavaScriptLexer; | ||||||
|  |     superClass=JavaScriptBaseParser; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | program | ||||||
|  |     : HashBangLine? sourceElements? EOF | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | sourceElement | ||||||
|  |     : statement | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | statement | ||||||
|  |     : block | ||||||
|  |     | variableStatement | ||||||
|  |     | importStatement | ||||||
|  |     | exportStatement | ||||||
|  |     | emptyStatement | ||||||
|  |     | classDeclaration | ||||||
|  |     | expressionStatement | ||||||
|  |     | ifStatement | ||||||
|  |     | iterationStatement | ||||||
|  |     | continueStatement | ||||||
|  |     | breakStatement | ||||||
|  |     | returnStatement | ||||||
|  |     //| yieldStatement | ||||||
|  |     //| withStatement | ||||||
|  |     //| labelledStatement | ||||||
|  |     //| switchStatement | ||||||
|  |     //| throwStatement | ||||||
|  |     //| tryStatement | ||||||
|  |     //| debuggerStatement | ||||||
|  |     | functionDeclaration | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | block | ||||||
|  |     : '{' statementList? '}' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | statementList | ||||||
|  |     : statement+ | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | importStatement | ||||||
|  |     : Import importFromBlock | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | importFromBlock | ||||||
|  |     : importDefault? (importNamespace | moduleItems) importFrom eos | ||||||
|  |     | StringLiteral eos | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | moduleItems | ||||||
|  |     : '{' (aliasName ',')* (aliasName ','?)? '}' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | importDefault | ||||||
|  |     : aliasName ',' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | importNamespace | ||||||
|  |     : ('*' | identifierName) (As identifierName)? | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | importFrom | ||||||
|  |     : From StringLiteral | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | aliasName | ||||||
|  |     : identifierName (As identifierName)? | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | exportStatement | ||||||
|  |     : Export (exportFromBlock | declaration) eos    # ExportDeclaration | ||||||
|  |     | Export Default singleExpression eos           # ExportDefaultDeclaration | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | exportFromBlock | ||||||
|  |     : importNamespace importFrom eos | ||||||
|  |     | moduleItems importFrom? eos | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | declaration | ||||||
|  |     : variableStatement | ||||||
|  |     | classDeclaration | ||||||
|  |     | functionDeclaration | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | variableStatement | ||||||
|  |     : variableDeclarationList eos | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | variableDeclarationList | ||||||
|  |     : varModifier variableDeclaration (',' variableDeclaration)* | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | variableDeclaration | ||||||
|  |     : assignable ('=' singleExpression)? // ECMAScript 6: Array & Object Matching | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | emptyStatement | ||||||
|  |     : SemiColon | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | expressionStatement | ||||||
|  |     : {self.notOpenBraceAndNotFunction()}? expressionSequence eos | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | ifStatement | ||||||
|  |     : If '(' expressionSequence ')' statement (Else statement)? | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | iterationStatement | ||||||
|  |     : Do statement While '(' expressionSequence ')' eos                                                                       # DoStatement | ||||||
|  |     | While '(' expressionSequence ')' statement                                                                              # WhileStatement | ||||||
|  |     | For '(' (expressionSequence | variableDeclarationList)? ';' expressionSequence? ';' expressionSequence? ')' statement   # ForStatement | ||||||
|  |     | For '(' (singleExpression | variableDeclarationList) In expressionSequence ')' statement                                # ForInStatement | ||||||
|  |     // strange, 'of' is an identifier. and self.p("of") not work in sometime. | ||||||
|  |     | For /*Await?*/ '(' (singleExpression | variableDeclarationList) identifier{self.p("of")}? expressionSequence ')' statement  # ForOfStatement | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | varModifier  // let, const - ECMAScript 6 | ||||||
|  |     : Var | ||||||
|  |     | let | ||||||
|  |     | Const | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | continueStatement | ||||||
|  |     : Continue ({self.notLineTerminator()}? identifier)? eos | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | breakStatement | ||||||
|  |     : Break ({self.notLineTerminator()}? identifier)? eos | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | returnStatement | ||||||
|  |     : Return ({self.notLineTerminator()}? expressionSequence)? eos | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | //yieldStatement | ||||||
|  | //    : Yield ({self.notLineTerminator()}? expressionSequence)? eos | ||||||
|  | //    ; | ||||||
|  | // | ||||||
|  | //withStatement | ||||||
|  | //    : With '(' expressionSequence ')' statement | ||||||
|  | //    ; | ||||||
|  | // | ||||||
|  | //switchStatement | ||||||
|  | //    : Switch '(' expressionSequence ')' caseBlock | ||||||
|  | //    ; | ||||||
|  | 
 | ||||||
|  | //caseBlock | ||||||
|  | //    : '{' caseClauses? (defaultClause caseClauses?)? '}' | ||||||
|  | //    ; | ||||||
|  | // | ||||||
|  | //caseClauses | ||||||
|  | //    : caseClause+ | ||||||
|  | //    ; | ||||||
|  | // | ||||||
|  | //caseClause | ||||||
|  | //    : Case expressionSequence ':' statementList? | ||||||
|  | //    ; | ||||||
|  | // | ||||||
|  | //defaultClause | ||||||
|  | //    : Default ':' statementList? | ||||||
|  | //    ; | ||||||
|  | // | ||||||
|  | //labelledStatement | ||||||
|  | //    : identifier ':' statement | ||||||
|  | //    ; | ||||||
|  | // | ||||||
|  | //throwStatement | ||||||
|  | //    : Throw {self.notLineTerminator()}? expressionSequence eos | ||||||
|  | //    ; | ||||||
|  | // | ||||||
|  | //tryStatement | ||||||
|  | //    : Try block (catchProduction finallyProduction? | finallyProduction) | ||||||
|  | //    ; | ||||||
|  | // | ||||||
|  | //catchProduction | ||||||
|  | //    : Catch ('(' assignable? ')')? block | ||||||
|  | //    ; | ||||||
|  | // | ||||||
|  | //finallyProduction | ||||||
|  | //    : Finally block | ||||||
|  | //    ; | ||||||
|  | // | ||||||
|  | //debuggerStatement | ||||||
|  | //    : Debugger eos | ||||||
|  | //    ; | ||||||
|  | 
 | ||||||
|  | functionDeclaration | ||||||
|  |     : /*Async?*/ Function '*'? identifier '(' formalParameterList? ')' '{' functionBody '}' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | classDeclaration | ||||||
|  |     : Class identifier classTail | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | classTail | ||||||
|  |     : (Extends singleExpression)? '{' classElement* '}' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | classElement | ||||||
|  |     : (Static | {self.n("static")}? identifier /*| Async*/)* (methodDefinition | assignable '=' objectLiteral ';') | ||||||
|  |     | emptyStatement | ||||||
|  |     | '#'? propertyName '=' singleExpression | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | methodDefinition | ||||||
|  |     : '*'? '#'? propertyName '(' formalParameterList? ')' '{' functionBody '}' | ||||||
|  |     | '*'? '#'? getter '(' ')' '{' functionBody '}' | ||||||
|  |     | '*'? '#'? setter '(' formalParameterList? ')' '{' functionBody '}' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | formalParameterList | ||||||
|  |     : formalParameterArg (',' formalParameterArg)* (',' lastFormalParameterArg)? | ||||||
|  |     | lastFormalParameterArg | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | formalParameterArg | ||||||
|  |     : assignable ('=' singleExpression)?      // ECMAScript 6: Initialization | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | lastFormalParameterArg                        // ECMAScript 6: Rest Parameter | ||||||
|  |     : Ellipsis singleExpression | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | functionBody | ||||||
|  |     : sourceElements? | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | sourceElements | ||||||
|  |     : sourceElement+ | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | arrayLiteral | ||||||
|  |     : ('[' elementList ']') | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | elementList | ||||||
|  |     : ','* arrayElement? (','+ arrayElement)* ','* // Yes, everything is optional | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | arrayElement | ||||||
|  |     : Ellipsis? singleExpression | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | propertyAssignment | ||||||
|  |     : propertyName ':' singleExpression                                             # PropertyExpressionAssignment | ||||||
|  |     | '[' singleExpression ']' ':' singleExpression                                 # ComputedPropertyExpressionAssignment | ||||||
|  |     | /*Async?*/ '*'? propertyName '(' formalParameterList?  ')'  '{' functionBody '}'  # FunctionProperty | ||||||
|  |     | getter '(' ')' '{' functionBody '}'                                           # PropertyGetter | ||||||
|  |     | setter '(' formalParameterArg ')' '{' functionBody '}'                        # PropertySetter | ||||||
|  |     | Ellipsis? singleExpression                                                    # PropertyShorthand | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | propertyName | ||||||
|  |     : identifierName | ||||||
|  |     | StringLiteral | ||||||
|  |     | numericLiteral | ||||||
|  |     | '[' singleExpression ']' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | arguments | ||||||
|  |     : '('(argument (',' argument)* ','?)?')' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | argument | ||||||
|  |     : Ellipsis? (singleExpression | identifier) | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | expressionSequence | ||||||
|  |     : singleExpression (',' singleExpression)* | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | singleExpression | ||||||
|  |     : anoymousFunction                                                      # FunctionExpression | ||||||
|  |     | Class identifier? classTail                                           # ClassExpression | ||||||
|  |     | singleExpression '[' expressionSequence ']'                           # MemberIndexExpression | ||||||
|  |     | singleExpression '?'? '.' '#'? identifierName                         # MemberDotExpression | ||||||
|  |     | singleExpression arguments                                            # ArgumentsExpression | ||||||
|  |     | New singleExpression arguments?                                       # NewExpression | ||||||
|  |     | New '.' identifier                                                    # MetaExpression // new.target | ||||||
|  |     | singleExpression {self.notLineTerminator()}? '++'                     # PostIncrementExpression | ||||||
|  |     | singleExpression {self.notLineTerminator()}? '--'                     # PostDecreaseExpression | ||||||
|  |     | Delete singleExpression                                               # DeleteExpression | ||||||
|  |     | Void singleExpression                                                 # VoidExpression | ||||||
|  |     | Typeof singleExpression                                               # TypeofExpression | ||||||
|  |     | '++' singleExpression                                                 # PreIncrementExpression | ||||||
|  |     | '--' singleExpression                                                 # PreDecreaseExpression | ||||||
|  |     | '+' singleExpression                                                  # UnaryPlusExpression | ||||||
|  |     | '-' singleExpression                                                  # UnaryMinusExpression | ||||||
|  |     | '~' singleExpression                                                  # BitNotExpression | ||||||
|  |     | '!' singleExpression                                                  # NotExpression | ||||||
|  | //    | Await singleExpression                                                # AwaitExpression | ||||||
|  |     | <assoc=right> singleExpression '**' singleExpression                  # PowerExpression | ||||||
|  |     | singleExpression ('*' | '/' | '%') singleExpression                   # MultiplicativeExpression | ||||||
|  |     | singleExpression ('+' | '-') singleExpression                         # AdditiveExpression | ||||||
|  |     | singleExpression '??' singleExpression                                # CoalesceExpression | ||||||
|  |     | singleExpression ('<<' | '>>' | '>>>') singleExpression               # BitShiftExpression | ||||||
|  |     | singleExpression ('<' | '>' | '<=' | '>=') singleExpression           # RelationalExpression | ||||||
|  | //    | singleExpression Instanceof singleExpression                          # InstanceofExpression | ||||||
|  |     | singleExpression In singleExpression                                  # InExpression | ||||||
|  |     | singleExpression ('==' | '!=' | '===' | '!==') singleExpression       # EqualityExpression | ||||||
|  |     | singleExpression '&' singleExpression                                 # BitAndExpression | ||||||
|  |     | singleExpression '^' singleExpression                                 # BitXOrExpression | ||||||
|  |     | singleExpression '|' singleExpression                                 # BitOrExpression | ||||||
|  |     | singleExpression '&&' singleExpression                                # LogicalAndExpression | ||||||
|  |     | singleExpression '||' singleExpression                                # LogicalOrExpression | ||||||
|  |     | singleExpression '?' singleExpression ':' singleExpression            # TernaryExpression | ||||||
|  |     | <assoc=right> singleExpression '=' singleExpression                   # AssignmentExpression | ||||||
|  |     | <assoc=right> singleExpression assignmentOperator singleExpression    # AssignmentOperatorExpression | ||||||
|  |     | Import '(' singleExpression ')'                                       # ImportExpression | ||||||
|  |     | singleExpression TemplateStringLiteral                                # TemplateStringExpression  // ECMAScript 6 | ||||||
|  | //    | yieldStatement                                                        # YieldExpression // ECMAScript 6 | ||||||
|  |     | This                                                                  # ThisExpression | ||||||
|  |     | identifier                                                            # IdentifierExpression | ||||||
|  |     | Super                                                                 # SuperExpression | ||||||
|  |     | literal                                                               # LiteralExpression | ||||||
|  |     | arrayLiteral                                                          # ArrayLiteralExpression | ||||||
|  |     | objectLiteral                                                         # ObjectLiteralExpression | ||||||
|  |     | '(' expressionSequence ')'                                            # ParenthesizedExpression | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | assignable | ||||||
|  |     : identifier | ||||||
|  |     | arrayLiteral | ||||||
|  |     | objectLiteral | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | objectLiteral | ||||||
|  |     : '{' (propertyAssignment (',' propertyAssignment)*)? ','? '}' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | anoymousFunction | ||||||
|  |     : functionDeclaration                                                       # FunctionDecl | ||||||
|  |     | /*Async?*/ Function '*'? '(' formalParameterList? ')' '{' functionBody '}'    # AnoymousFunctionDecl | ||||||
|  |     | /*Async?*/ arrowFunctionParameters '=>' arrowFunctionBody                     # ArrowFunction | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | arrowFunctionParameters | ||||||
|  |     : identifier | ||||||
|  |     | '(' formalParameterList? ')' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | arrowFunctionBody | ||||||
|  |     : singleExpression | ||||||
|  |     | '{' functionBody '}' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | assignmentOperator | ||||||
|  |     : '*=' | ||||||
|  |     | '/=' | ||||||
|  |     | '%=' | ||||||
|  |     | '+=' | ||||||
|  |     | '-=' | ||||||
|  |     | '<<=' | ||||||
|  |     | '>>=' | ||||||
|  |     | '>>>=' | ||||||
|  |     | '&=' | ||||||
|  |     | '^=' | ||||||
|  |     | '|=' | ||||||
|  |     | '**=' | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | literal | ||||||
|  |     : NullLiteral | ||||||
|  |     | BooleanLiteral | ||||||
|  |     | StringLiteral | ||||||
|  |     | TemplateStringLiteral | ||||||
|  |     | RegularExpressionLiteral | ||||||
|  |     | numericLiteral | ||||||
|  |     | bigintLiteral | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | numericLiteral | ||||||
|  |     : DecimalLiteral | ||||||
|  | //    | HexIntegerLiteral | ||||||
|  | //    | OctalIntegerLiteral | ||||||
|  | //    | OctalIntegerLiteral2 | ||||||
|  | //    | BinaryIntegerLiteral | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | bigintLiteral | ||||||
|  |     : BigDecimalIntegerLiteral | ||||||
|  | //    | BigHexIntegerLiteral | ||||||
|  | //    | BigOctalIntegerLiteral | ||||||
|  | //    | BigBinaryIntegerLiteral | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | getter | ||||||
|  |     : identifier {self.p("get")}? propertyName | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | setter | ||||||
|  |     : identifier {self.p("set")}? propertyName | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | identifierName | ||||||
|  |     : identifier | ||||||
|  |     | reservedWord | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | identifier | ||||||
|  |     : Identifier | ||||||
|  |     | NonStrictLet | ||||||
|  | //    | Async | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | reservedWord | ||||||
|  |     : keyword | ||||||
|  |     | NullLiteral | ||||||
|  |     | BooleanLiteral | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | keyword | ||||||
|  |     : Break | ||||||
|  |     | Do | ||||||
|  | //    | Instanceof | ||||||
|  |     | Typeof | ||||||
|  | //    | Case | ||||||
|  |     | Else | ||||||
|  |     | New | ||||||
|  |     | Var | ||||||
|  | //    | Catch | ||||||
|  | //    | Finally | ||||||
|  |     | Return | ||||||
|  |     | Void | ||||||
|  |     | Continue | ||||||
|  |     | For | ||||||
|  | //    | Switch | ||||||
|  |     | While | ||||||
|  | //    | Debugger | ||||||
|  |     | Function | ||||||
|  |     | This | ||||||
|  | //    | With | ||||||
|  |     | Default | ||||||
|  |     | If | ||||||
|  |     | Throw | ||||||
|  |     | Delete | ||||||
|  |     | In | ||||||
|  | //    | Try | ||||||
|  | 
 | ||||||
|  |     | Class | ||||||
|  |     | Enum | ||||||
|  |     | Extends | ||||||
|  |     | Super | ||||||
|  |     | Const | ||||||
|  |     | Export | ||||||
|  |     | Import | ||||||
|  |     | Implements | ||||||
|  |     | let | ||||||
|  |     | Private | ||||||
|  |     | Public | ||||||
|  |     | Interface | ||||||
|  |     | Package | ||||||
|  |     | Protected | ||||||
|  |     | Static | ||||||
|  | //    | Yield | ||||||
|  | //    | Async | ||||||
|  | //    | Await | ||||||
|  |     | From | ||||||
|  |     | As | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | let | ||||||
|  |     : NonStrictLet | ||||||
|  |     | StrictLet | ||||||
|  |     ; | ||||||
|  | 
 | ||||||
|  | eos | ||||||
|  |     : SemiColon | ||||||
|  |     | EOF | ||||||
|  |     | {self.lineTerminatorAhead()}? | ||||||
|  |     | {self.closeBrace()}? | ||||||
|  |     ; | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | __version__ = "0.0.1" | ||||||
|  | 
 | ||||||
|  | # TODO: make it usable as a module too | ||||||
|  | @ -0,0 +1,57 @@ | ||||||
|  | from jasminesnake import __version__ | ||||||
|  | 
 | ||||||
|  | from antlr4 import * | ||||||
|  | from .lex import JavaScriptLexer, JavaScriptParser | ||||||
|  | 
 | ||||||
|  | import argparse | ||||||
|  | import colorama | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | arg_parser = argparse.ArgumentParser( | ||||||
|  |     description="Jasmine Snake, another JS interpreter in Python", | ||||||
|  |     epilog="I hope you don't use it, **especially** in production.", | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | arg_parser.add_argument("--snake", action="store_true", help="Print a snake") | ||||||
|  | args = arg_parser.parse_args() | ||||||
|  | 
 | ||||||
|  | JSL = JavaScriptLexer.JavaScriptLexer | ||||||
|  | JSP = JavaScriptParser.JavaScriptParser | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class WriteTreeListener(ParseTreeListener): | ||||||
|  |     def visitTerminal(self, node: TerminalNode): | ||||||
|  |         print("Visit Terminal: " + str(node) + " - " + repr(node)) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     colorama.init() | ||||||
|  | 
 | ||||||
|  |     print("Jasmine Snake v{version}".format(version=__version__)) | ||||||
|  | 
 | ||||||
|  |     if args.snake: | ||||||
|  |         print( | ||||||
|  |             colorama.Style.DIM | ||||||
|  |             + "[snake is sleeping now, so you see this stub. pretend you see the snake, please.]" | ||||||
|  |         ) | ||||||
|  |         print( | ||||||
|  |             colorama.Fore.BLACK | ||||||
|  |             + colorama.Back.YELLOW | ||||||
|  |             + "Don't tread on me!" | ||||||
|  |             + colorama.Back.RESET | ||||||
|  |             + colorama.Fore.RESET | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     print() | ||||||
|  | 
 | ||||||
|  |     input_stream = InputStream('"use strict";var a;\na=2+a;') | ||||||
|  |     lexer = JSL(input_stream) | ||||||
|  |     stream = CommonTokenStream(lexer) | ||||||
|  |     parser = JSP(stream) | ||||||
|  |     print("Created parsers") | ||||||
|  |     tree = parser.program() | ||||||
|  |     ParseTreeWalker.DEFAULT.walk(WriteTreeListener(), tree) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main() | ||||||
|  | @ -0,0 +1,106 @@ | ||||||
|  | from antlr4 import * | ||||||
|  | 
 | ||||||
|  | relativeImport = False | ||||||
|  | if __name__ is not None and "." in __name__: | ||||||
|  |     relativeImport = True | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class JavaScriptBaseLexer(Lexer): | ||||||
|  |     def __init__(self, *args, **kwargs): | ||||||
|  |         print("JavaScriptBaseLexerInit") | ||||||
|  |         super(JavaScriptBaseLexer, self).__init__(*args, **kwargs) | ||||||
|  | 
 | ||||||
|  |         """Stores values of nested modes. By default mode is strict or | ||||||
|  |         defined externally (useStrictDefault)""" | ||||||
|  |         self.scopeStrictModes = [] | ||||||
|  |         self.lastToken: Token = None | ||||||
|  | 
 | ||||||
|  |         """Default value of strict mode | ||||||
|  |         Can be defined externally by setUseStrictDefault""" | ||||||
|  |         self.useStrictDefault = False | ||||||
|  | 
 | ||||||
|  |         """Current value of strict mode | ||||||
|  |         Can be defined during parsing, see StringFunctions.js and StringGlobal.js samples""" | ||||||
|  |         self.useStrictCurrent = False | ||||||
|  | 
 | ||||||
|  |     def getStrictDefault(self) -> bool: | ||||||
|  |         return self.useStrictDefault | ||||||
|  | 
 | ||||||
|  |     def setUseStrictDefault(self, value: bool): | ||||||
|  |         self.useStrictDefault = value | ||||||
|  |         self.useStrictCurrent = value | ||||||
|  | 
 | ||||||
|  |     def isStrictMode(self): | ||||||
|  |         return self.useStrictCurrent | ||||||
|  | 
 | ||||||
|  |     def isStartOfFile(self): | ||||||
|  |         return self.lastToken is None | ||||||
|  | 
 | ||||||
|  |     def nextToken(self) -> Token: | ||||||
|  |         """Return the next token from the character stream and records this last | ||||||
|  |         token in case it resides on the default channel. This recorded token | ||||||
|  |         is used to determine when the lexer could possibly match a regex | ||||||
|  |         literal. Also changes scopeStrictModes stack if tokenize special | ||||||
|  |         string 'use strict'; | ||||||
|  | 
 | ||||||
|  |         :return the next token from the character stream.""" | ||||||
|  |         next_token: Token = super(JavaScriptBaseLexer, self).nextToken() | ||||||
|  | 
 | ||||||
|  |         if next_token.channel == Token.DEFAULT_CHANNEL: | ||||||
|  |             self.lastToken = next_token | ||||||
|  | 
 | ||||||
|  |         return next_token | ||||||
|  | 
 | ||||||
|  |     def processOpenBrace(self): | ||||||
|  |         self.useStrictCurrent = bool(self.scopeStrictModes) and ( | ||||||
|  |             True if self.scopeStrictModes[-1] else self.useStrictDefault | ||||||
|  |         ) | ||||||
|  |         self.scopeStrictModes.append(self.useStrictCurrent) | ||||||
|  | 
 | ||||||
|  |     def processCloseBrace(self): | ||||||
|  |         self.useStrictCurrent = bool(self.scopeStrictModes) and ( | ||||||
|  |             True if self.scopeStrictModes.pop(-1) else self.useStrictDefault | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     def processStringLiteral(self): | ||||||
|  |         if relativeImport: | ||||||
|  |             from .JavaScriptLexer import JavaScriptLexer | ||||||
|  |         else: | ||||||
|  |             from JavaScriptLexer import JavaScriptLexer | ||||||
|  |         if not self.lastToken or self.lastToken.type == JavaScriptLexer.OpenBrace: | ||||||
|  |             text = self.text | ||||||
|  |             if text == '"use strict"' or text == "'use strict'": | ||||||
|  |                 if self.scopeStrictModes: | ||||||
|  |                     self.scopeStrictModes.pop(-1) | ||||||
|  |                 self.useStrictCurrent = True | ||||||
|  |                 self.scopeStrictModes.append(self.useStrictCurrent) | ||||||
|  | 
 | ||||||
|  |     def isRegexPossible(self) -> bool: | ||||||
|  |         """Returns {@code true} if the lexer can match a regex literal. """ | ||||||
|  |         if relativeImport: | ||||||
|  |             from .JavaScriptLexer import JavaScriptLexer | ||||||
|  |         else: | ||||||
|  |             from JavaScriptLexer import JavaScriptLexer | ||||||
|  | 
 | ||||||
|  |         if not self.lastToken: | ||||||
|  |             # No token has been produced yet: at the start of the input, | ||||||
|  |             # no division is possible, so a regex literal _is_ possible. | ||||||
|  |             return True | ||||||
|  | 
 | ||||||
|  |         if self.lastToken.type in [ | ||||||
|  |             JavaScriptLexer.Identifier, | ||||||
|  |             JavaScriptLexer.NullLiteral, | ||||||
|  |             JavaScriptLexer.BooleanLiteral, | ||||||
|  |             JavaScriptLexer.This, | ||||||
|  |             JavaScriptLexer.CloseBracket, | ||||||
|  |             JavaScriptLexer.CloseParen, | ||||||
|  |             JavaScriptLexer.OctalIntegerLiteral, | ||||||
|  |             JavaScriptLexer.DecimalLiteral, | ||||||
|  |             JavaScriptLexer.HexIntegerLiteral, | ||||||
|  |             JavaScriptLexer.StringLiteral, | ||||||
|  |             JavaScriptLexer.PlusPlus, | ||||||
|  |             JavaScriptLexer.MinusMinus, | ||||||
|  |         ]: | ||||||
|  |             return False | ||||||
|  | 
 | ||||||
|  |         return True | ||||||
|  | @ -0,0 +1,108 @@ | ||||||
|  | from antlr4 import * | ||||||
|  | 
 | ||||||
|  | relativeImport = False | ||||||
|  | if __name__ is not None and "." in __name__: | ||||||
|  |     relativeImport = True | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class JavaScriptBaseParser(Parser): | ||||||
|  |     @staticmethod | ||||||
|  |     def parser(): | ||||||
|  |         if relativeImport: | ||||||
|  |             from .JavaScriptParser import JavaScriptParser | ||||||
|  |         else: | ||||||
|  |             from JavaScriptParser import JavaScriptParser | ||||||
|  |         return JavaScriptParser | ||||||
|  | 
 | ||||||
|  |     def p(self, s: str) -> bool: | ||||||
|  |         return self.prev(s) | ||||||
|  | 
 | ||||||
|  |     def prev(self, s: str) -> bool: | ||||||
|  |         return self._input.LT(-1).text == s | ||||||
|  | 
 | ||||||
|  |     def n(self, s: str) -> bool: | ||||||
|  |         return self.next(s) | ||||||
|  | 
 | ||||||
|  |     def next(self, s: str) -> bool: | ||||||
|  |         return self._input.LT(1).text == s | ||||||
|  | 
 | ||||||
|  |     def notLineTerminator(self) -> bool: | ||||||
|  |         JavaScriptParser = self.parser() | ||||||
|  | 
 | ||||||
|  |         return not self.here(JavaScriptParser.LineTerminator) | ||||||
|  | 
 | ||||||
|  |     def notOpenBraceAndNotFunction(self) -> bool: | ||||||
|  |         JavaScriptParser = self.parser() | ||||||
|  | 
 | ||||||
|  |         nextTokenType = self._input.LT(1).type | ||||||
|  |         return ( | ||||||
|  |             nextTokenType != JavaScriptParser.OpenBrace | ||||||
|  |             and nextTokenType != JavaScriptParser.Function | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     def closeBrace(self) -> bool: | ||||||
|  |         JavaScriptParser = self.parser() | ||||||
|  | 
 | ||||||
|  |         return self._input.LT(1).type == JavaScriptParser.CloseBrace | ||||||
|  | 
 | ||||||
|  |     def here(self, tokenType: int) -> bool: | ||||||
|  |         """ | ||||||
|  |         Returns {@code true} iff on the current index of the parser's | ||||||
|  |         token stream a token of the given {@code type} exists on the | ||||||
|  |         {@code HIDDEN} channel. | ||||||
|  |         :param:type: | ||||||
|  |                    the type of the token on the {@code HIDDEN} channel | ||||||
|  |                    to check. | ||||||
|  |         :return:{@code true} iff on the current index of the parser's | ||||||
|  |             token stream a token of the given {@code type} exists on the | ||||||
|  |             {@code HIDDEN} channel. | ||||||
|  |         """ | ||||||
|  |         # Get the token ahead of the current index. | ||||||
|  |         assert isinstance(self.getCurrentToken(), Token) | ||||||
|  |         possibleIndexEosToken: Token = self.getCurrentToken().tokenIndex - 1 | ||||||
|  |         ahead = self._input.get(possibleIndexEosToken) | ||||||
|  | 
 | ||||||
|  |         # Check if the token resides on the HIDDEN channel and if it's of the | ||||||
|  |         # provided type. | ||||||
|  |         return (ahead.channel == Lexer.HIDDEN) and (ahead.type == tokenType) | ||||||
|  | 
 | ||||||
|  |     def lineTerminatorAhead(self) -> bool: | ||||||
|  |         """ | ||||||
|  |         Returns {@code true} iff on the current index of the parser's | ||||||
|  |         token stream a token exists on the {@code HIDDEN} channel which | ||||||
|  |         either is a line terminator, or is a multi line comment that | ||||||
|  |         contains a line terminator. | ||||||
|  | 
 | ||||||
|  |         :return: {@code true} iff on the current index of the parser's | ||||||
|  |         token stream a token exists on the {@code HIDDEN} channel which | ||||||
|  |         either is a line terminator, or is a multi line comment that | ||||||
|  |         contains a line terminator. | ||||||
|  |         """ | ||||||
|  |         JavaScriptParser = self.parser() | ||||||
|  | 
 | ||||||
|  |         # Get the token ahead of the current index. | ||||||
|  |         possibleIndexEosToken: Token = self.getCurrentToken().tokenIndex - 1 | ||||||
|  |         ahead: Token = self._input.get(possibleIndexEosToken) | ||||||
|  | 
 | ||||||
|  |         if ahead.channel != Lexer.HIDDEN: | ||||||
|  |             # We're only interested in tokens on the HIDDEN channel. | ||||||
|  |             return False | ||||||
|  | 
 | ||||||
|  |         if ahead.type == JavaScriptParser.LineTerminator: | ||||||
|  |             # There is definitely a line terminator ahead. | ||||||
|  |             return True | ||||||
|  | 
 | ||||||
|  |         if ahead.type == JavaScriptParser.WhiteSpaces: | ||||||
|  |             # Get the token ahead of the current whitespaces. | ||||||
|  |             possibleIndexEosToken = self.getCurrentToken().tokenIndex - 2 | ||||||
|  |             ahead = self._input.get(possibleIndexEosToken) | ||||||
|  | 
 | ||||||
|  |         # Get the token's text and type. | ||||||
|  |         text = ahead.text | ||||||
|  |         tokenType = ahead.type | ||||||
|  | 
 | ||||||
|  |         # Check if the token is, or contains a line terminator. | ||||||
|  |         return ( | ||||||
|  |             tokenType == JavaScriptParser.MultiLineComment | ||||||
|  |             and (text.contains("\r") or text.contains("\n")) | ||||||
|  |         ) or (tokenType == JavaScriptParser.LineTerminator) | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | -r requirements.txt | ||||||
|  | tox==3.14.6 | ||||||
|  | pytest==5.4.1 | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | antlr4-python3-runtime | ||||||
|  | colorama==0.4.3 | ||||||
|  | @ -0,0 +1,30 @@ | ||||||
|  | from setuptools import setup | ||||||
|  | from jasminesnake import __version__ | ||||||
|  | 
 | ||||||
|  | with open("README.md", "r") as fh: | ||||||
|  |     long_description = fh.read() | ||||||
|  | 
 | ||||||
|  | with open("requirements.txt") as f: | ||||||
|  |     requirements = f.readlines() | ||||||
|  | 
 | ||||||
|  | setup( | ||||||
|  |     name="jasminesnake", | ||||||
|  |     version=__version__, | ||||||
|  |     packages=["jasminesnake"], | ||||||
|  |     url="https://github.com/t1meshift/js", | ||||||
|  |     license="MIT", | ||||||
|  |     author="Yury Kurlykov", | ||||||
|  |     author_email="sh1ftr@protonmail.ch", | ||||||
|  |     description="Another JavaScript interpreter written in Python", | ||||||
|  |     long_description=long_description, | ||||||
|  |     long_description_content_type="text/markdown", | ||||||
|  |     classifiers=[ | ||||||
|  |         "Programming Language :: Python :: 3", | ||||||
|  |         # "Programming Language :: JavaScript", | ||||||
|  |         "License :: OSI Approved :: MIT License", | ||||||
|  |         "Development Status :: 2 - Pre-Alpha", | ||||||
|  |     ], | ||||||
|  |     python_requires=">=3.8", | ||||||
|  |     install_requires=requirements, | ||||||
|  |     entry_points={"console_scripts": ["jasminesnake = jasminesnake.__main__:main"]}, | ||||||
|  | ) | ||||||
		Loading…
	
		Reference in New Issue