UNPKG

@ibyar/expressions

Version:

Aurora expression, an template expression and evaluation, An 100% spec compliant ES2022 JavaScript toolchain,

760 lines 19.1 kB
import { isSloppy, } from './language.js'; export class Token { name; precedence; /** * ___ ? ___ : ___ */ static CONDITIONAL = new Token('?', 3); /** * ___ ?? ___ */ static NULLISH = new Token('??', 3); /** * ___ |> ___ : ___ : ? * ___ |> ___ ( ___, ___ , ?) */ static PIPELINE = new Token('|>', 3); /** * ___ || ___ */ static OR = new Token('||', 4); /** * ___ && ___ */ static AND = new Token('&&', 5); /** * ___ | ___ */ static BIT_OR = new Token('|', 6); /** * ___ ^ ___ */ static BIT_XOR = new Token('^', 7); /** * ___ | ___ */ static BIT_AND = new Token('&', 8); /** * ___ << ___ */ static SHL = new Token('<<', 11); /** * ___ >> ___ */ static SAR = new Token('>>', 11); /** * ___ >>> ___ */ static SHR = new Token('>>>', 11); /** * ___ * ___ */ static MUL = new Token('*', 13); /** * ___ / ___ */ static DIV = new Token('/', 13); /** * ___ % ___ */ static MOD = new Token('%', 13); /** * ___ %% ___ */ static MODULO = new Token('%%', 13); /** * ___ > ___ */ static LARGER = new Token('>?', 13); /** * ___ > ___ */ static SMALLER = new Token('<?', 13); /** * ___ ** ___ */ static EXP = new Token('**', 14); /** * ___ + ___ */ static ADD = new Token('+', 12); /** * ___ - ___ */ static SUB = new Token('-', 12); /** * ! ___ */ static NOT = new Token('!', 0); /** * ~ ___ */ static BIT_NOT = new Token('~', 0); /** * ___ < ___ */ static LT = new Token('<', 10); /** * ___ > ___ */ static GT = new Token('>', 10); /** * ___++ * * ++___ */ static INC = new Token('++', 0); /** * ___-- * * --___ */ static DEC = new Token('--', 0); /** * ___ == ___ */ static EQ = new Token('==', 9); /** * ___ === ___ */ static EQ_STRICT = new Token('===', 9); /** * ___ != ___ */ static NE = new Token('!=', 9); /** * ___ !== ___ */ static NE_STRICT = new Token('!==', 9); /** * ___ <= ___ */ static LTE = new Token('<=', 10); /** * ___ >= ___ */ static GTE = new Token('>=', 10); /** * ___ <=> ___ */ static SPACESHIP = new Token('<=>', 10); /** * ___ = ___ */ static ASSIGN = new Token('=', 2); /** * ___ += ___ */ static ADD_ASSIGN = new Token('+=', 2); /** * ___ -= ___ */ static SUB_ASSIGN = new Token('-=', 2); /** * ___ *= ___ */ static MUL_ASSIGN = new Token('*=', 2); /** * ___ /= ___ */ static DIV_ASSIGN = new Token('/=', 2); /** * ___ %= ___ */ static MOD_ASSIGN = new Token('%=', 2); /** * ___ %% ___ */ static MODULO_ASSIGN = new Token('%%=', 2); /** * ___ > ___ */ static LARGER_ASSIGN = new Token('>?=', 2); /** * ___ > ___ */ static SMALLER_ASSIGN = new Token('<?=', 2); /** * ___ **= ___ */ static EXP_ASSIGN = new Token('**=', 2); /** * ___ ^= ___ */ static BIT_XOR_ASSIGN = new Token('^=', 2); /** * ___ &= ___ */ static BIT_AND_ASSIGN = new Token('&=', 2); /** * ___ |= ___ */ static BIT_OR_ASSIGN = new Token('|=', 2); /** * ___ &&= ___ */ static AND_ASSIGN = new Token('&&=', 2); /** * ___ ||= ___ */ static OR_ASSIGN = new Token('||=', 2); /** * ___ ??= ___ */ static NULLISH_ASSIGN = new Token('??=', 2); /** * ___ <<= ___ */ static SHL_ASSIGN = new Token('<<=', 2); /** * ___ >>= ___ */ static SAR_ASSIGN = new Token('>>=', 2); /** * ___ >>>= ___ */ static SHR_ASSIGN = new Token('>>>=', 2); /** * ___ . ___ */ static PERIOD = new Token('.', 0); /** * ___ ?. ___ * * ___?.[___] * * ___?.() */ static QUESTION_PERIOD = new Token('?.', 0); /** * ___ :: ___ */ static BIND = new Token('::', 0); /** * ___ ?:: ___ * * ___?::[___] * * ___?::() */ static QUESTION_BIND = new Token('?::', 0); /** * ( */ static LPAREN = new Token('(', 0); /** * ) */ static RPAREN = new Token(')', 0); /** * [ */ static LBRACK = new Token('[', 0); /** * ] */ static RBRACK = new Token(']', 0); /** * { */ static LBRACE = new Token('{', 0); /** * } */ static RBRACE = new Token('}', 0); /** * : */ static COLON = new Token(':', 0); /** * ... */ static ELLIPSIS = new Token('...', 0); /** * ; */ static SEMICOLON = new Token(';', 0); /** * end of source */ static EOS = new Token('EOS', 0); /** * => */ static ARROW = new Token('=>', 0); /** * ___, ___, ___ */ static COMMA = new Token(',', 1); static ASYNC = new Token('async', 0); static AWAIT = new Token('await', 0); static BREAK = new Token('break', 0); static CASE = new Token('case', 0); static CATCH = new Token('catch', 0); static CLASS = new Token('class', 0); static CONST = new Token('const', 0); static CONTINUE = new Token('continue', 0); static DEBUGGER = new Token('debugger', 0); static DEFAULT = new Token('default', 0); static DELETE = new Token('delete', 0); static DO = new Token('do', 0); static ELSE = new Token('else', 0); static ENUM = new Token('enum', 0); static EXPORT = new Token('export', 0); static EXTENDS = new Token('extends', 0); static FALSE_LITERAL = new Token('false', 0); static FINALLY = new Token('finally', 0); static FOR = new Token('for', 0); static FUNCTION = new Token('function', 0); static GET = new Token('get', 0); static IF = new Token('if', 0); static IMPLEMENTS = new Token('implements', 0); static IMPORT = new Token('import', 0); static PRIVATE_NAME = new Token('PRIVATE_NAME', 0); static IN = new Token('in', 10); static INSTANCEOF = new Token('instanceof', 10); static LET = new Token('let', 0); static NEW = new Token('new', 0); static NULL_LITERAL = new Token('null', 0); static UNDEFINED_LITERAL = new Token('undefined', 0); static PACKAGE = new Token('package', 0); static INTERFACE = new Token('interface', 0); static PRIVATE = new Token('private', 0); static PROTECTED = new Token('protected', 0); static PUBLIC = new Token('public', 0); static RETURN = new Token('return', 0); static SET = new Token('set', 0); static STATIC = new Token('static', 0); static SUPER = new Token('super', 0); static SWITCH = new Token('switch', 0); static THIS = new Token('this', 0); static THROW = new Token('throw', 0); static TRUE_LITERAL = new Token('true', 0); static TRY = new Token('try', 0); static TYPEOF = new Token('typeof', 0); static VAR = new Token('var', 0); static VOID = new Token('void', 0); static WHILE = new Token('while', 0); static WITH = new Token('with', 0); static YIELD = new Token('yield', 0); static NUMBER = new Token('NUMBER', 0); static BIGINT = new Token('BIGINT', 0); static STRING = new Token('STRING', 0); static IDENTIFIER = new Token('IDENTIFIER', 0); /** * TEMPLATE_SPAN :: * * ` LiteralChars* ${ * | } LiteralChars* ${ */ static TEMPLATE_SPAN = new Token('TEMPLATE_SPAN', 0); /** * TEMPLATE_TAIL :: * * ` LiteralChars* ` * | } LiteralChar* ` */ static TEMPLATE_TAIL = new Token('TEMPLATE_TAIL', 0); static ILLEGAL = new Token('ILLEGAL', 0); static ESCAPED_KEYWORD = new Token('ESCAPED_KEYWORD', 0); static WHITESPACE = new Token('WHITESPACE', 0); static REGEXP_LITERAL = new Token('REGEXP_LITERAL', 0); static isPair(token) { switch (token) { case Token.LPAREN: case Token.LBRACK: case Token.LBRACE: case Token.RBRACE: case Token.RBRACK: case Token.RPAREN: return true; default: return false; } } static isOpenPair(token) { switch (token) { case Token.LPAREN: case Token.LBRACK: case Token.LBRACE: return true; default: return false; } } static isClosePair(token) { switch (token) { case Token.RBRACE: case Token.RBRACK: case Token.RPAREN: return true; default: return false; } } static openOf(token) { switch (token) { case Token.RBRACE: return Token.LBRACE; case Token.RBRACK: return Token.LBRACK; case Token.RPAREN: return Token.LPAREN; } return token; } static closeOf(token) { switch (token) { case Token.LBRACE: return Token.RBRACE; case Token.LBRACK: return Token.RBRACK; case Token.LPAREN: return Token.RPAREN; } return token; } static isAnyIdentifier(token) { switch (token) { case Token.IDENTIFIER: case Token.GET: case Token.SET: case Token.ASYNC: case Token.AWAIT: case Token.YIELD: case Token.LET: case Token.STATIC: return true; } return false; } static isIdentifier(token) { switch (token) { case Token.IDENTIFIER: case Token.GET: case Token.SET: case Token.ASYNC: return true; } return false; } static isLiteral(token) { switch (token) { case Token.UNDEFINED_LITERAL: case Token.NULL_LITERAL: case Token.TRUE_LITERAL: case Token.FALSE_LITERAL: case Token.NUMBER: case Token.BIGINT: case Token.STRING: case Token.REGEXP_LITERAL: // case Token.SMI: return true; } return false; } static isArrowOrAssignmentOp(token) { return token === Token.ARROW || this.isAssignment(token); } static isAssignment(token) { switch (token) { case Token.ASSIGN: case Token.ADD_ASSIGN: case Token.SUB_ASSIGN: case Token.MUL_ASSIGN: case Token.DIV_ASSIGN: case Token.MOD_ASSIGN: case Token.MODULO_ASSIGN: case Token.EXP_ASSIGN: case Token.BIT_XOR_ASSIGN: case Token.BIT_AND_ASSIGN: case Token.BIT_OR_ASSIGN: case Token.AND_ASSIGN: case Token.OR_ASSIGN: case Token.NULLISH_ASSIGN: case Token.SHL_ASSIGN: case Token.SAR_ASSIGN: case Token.SHR_ASSIGN: return true; } return false; } static isLogicalAssignmentOp(token) { switch (token) { case Token.AND_ASSIGN: case Token.OR_ASSIGN: case Token.NULLISH_ASSIGN: return true; } return false; } static isAutoSemicolon(token) { switch (token) { case Token.SEMICOLON: case Token.RBRACE: case Token.EOS: return true; } return false; } static isMember(token) { switch (token) { case Token.TEMPLATE_SPAN: case Token.TEMPLATE_TAIL: case Token.PERIOD: case Token.LBRACK: return true; } return false; } static isTemplate(token) { switch (token) { case Token.TEMPLATE_SPAN: case Token.TEMPLATE_TAIL: return true; } return false; } static isNextLetKeyword(token) { switch (token) { case Token.LBRACE: case Token.LBRACK: case Token.IDENTIFIER: case Token.STATIC: case Token.LET: // `let let;` is disallowed by static semantics, but the // token must be first interpreted as a keyword in order // for those semantics to apply. This ensures that ASI is // not honored when a LineTerminator separates the tokens. case Token.YIELD: case Token.AWAIT: case Token.GET: case Token.SET: case Token.ASYNC: return true; // case Token.FUTURE_STRICT_RESERVED_WORD: // return is_sloppy(language_mode()); default: return false; } } static isInRangeIdentifierAndAsync(token) { switch (token) { case Token.IDENTIFIER: case Token.GET: case Token.SET: case Token.ASYNC: return true; default: return false; } } static isPropertyOrCall(token) { switch (token) { case Token.TEMPLATE_SPAN: case Token.TEMPLATE_TAIL: case Token.PERIOD: case Token.LBRACK: case Token.QUESTION_PERIOD: case Token.LPAREN: return true; } return false; } static isPropertyName(token) { return /\w/.test(token.getName()); } static isInRange(op, start, end) { return op >= start.precedence && op <= end.precedence; } static isProperty(token) { if (token instanceof Token) { token = token.precedence; } return Token.isInRange(token, Token.PERIOD, Token.LBRACK); } static isBinary(token) { if (token instanceof Token) { token = token.precedence; } return Token.isInRange(token, Token.COMMA, Token.SUB); } static isCompare(token) { switch (token) { case Token.EQ: case Token.EQ_STRICT: case Token.NE: case Token.NE_STRICT: case Token.LT: case Token.GT: case Token.LTE: case Token.GTE: case Token.SPACESHIP: case Token.INSTANCEOF: case Token.IN: return true; } return false; } static isOrderedRelationalCompare(token) { switch (token) { case Token.LT: case Token.GT: case Token.LTE: case Token.GTE: case Token.SPACESHIP: return true; } return false; } static isEquality(token) { switch (token) { case Token.EQ: case Token.EQ_STRICT: return true; } return false; } static binaryOpForAssignment(token) { if (Token.isInRange(token.precedence, Token.NULLISH_ASSIGN, Token.SUB_ASSIGN)) { const result = token.precedence - Token.NULLISH_ASSIGN.precedence + Token.NULLISH.precedence; return Token.isBinary(result); } return false; } static isBitOp(token) { switch (token) { case Token.BIT_NOT: case Token.BIT_OR: case Token.BIT_XOR: case Token.BIT_AND: case Token.SHL: case Token.SAR: case Token.SHR: return true; } return false; } static isUnary(token) { switch (token) { case Token.ADD: case Token.SUB: case Token.NOT: case Token.BIT_NOT: case Token.DELETE: case Token.AWAIT: case Token.TYPEOF: case Token.VOID: return true; } return false; } static isCount(token) { switch (token) { case Token.INC: case Token.DEC: return true; } return false; } static isUnaryOrCount(token) { switch (token) { case Token.ADD: case Token.SUB: case Token.INC: case Token.DEC: case Token.NOT: case Token.BIT_NOT: case Token.DELETE: case Token.AWAIT: case Token.TYPEOF: case Token.VOID: return true; } return false; } static isShift(token) { switch (token) { case Token.SHL: case Token.SAR: case Token.SHR: return true; } return false; } static isStrictReservedWord(token) { switch (token) { case Token.IMPLEMENTS: case Token.INTERFACE: case Token.LET: case Token.PACKAGE: case Token.PRIVATE: case Token.PROTECTED: case Token.PUBLIC: case Token.STATIC: return true; } return false; } static isPipelineOperator(token) { switch (token) { case Token.PIPELINE: return true; } return false; } static isValidIdentifier(token, mode, isGenerator, disallowAwait) { if (Token.isInRangeIdentifierAndAsync(token)) return true; if (token == Token.AWAIT) return !disallowAwait; if (token == Token.YIELD) return !isGenerator; return Token.isStrictReservedWord(token) && isSloppy(mode); } static precedence(token, acceptIN) { if (!acceptIN && Token.IN === token) { return 0; } return token.getPrecedence(); } constructor(name, precedence) { this.name = name; this.precedence = precedence; } getName() { return this.name; } getPrecedence() { return this.precedence; } equal(token) { return this === token || this.name === token.name; } } export class TokenExpression { token; range; value; constructor(token, range, value) { this.token = token; this.range = range; this.value = value; } getValue() { return this.value; } isType(type) { return this.token === type; } isNotType(type) { return this.token !== type; } test(func) { return func(this.token, this.value); } toString() { return JSON.stringify(this); } } //# sourceMappingURL=token.js.map