| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434 | import { FSM, makeTransition } from "@webassemblyjs/helper-fsm";import { codeFrameFromSource } from "@webassemblyjs/helper-code-frame";// eslint-disable-next-linefunction getCodeFrame(source, line, column) {  var loc = {    start: {      line: line,      column: column    }  };  return "\n" + codeFrameFromSource(source, loc) + "\n";}var WHITESPACE = /\s/;var PARENS = /\(|\)/;var LETTERS = /[a-z0-9_/]/i;var idchar = /[a-z0-9!#$%&*+./:<=>?@\\[\]^_`|~-]/i;var valtypes = ["i32", "i64", "f32", "f64"];var NUMBERS = /[0-9|.|_]/;var NUMBER_KEYWORDS = /nan|inf/;function isNewLine(char) {  return char.charCodeAt(0) === 10 || char.charCodeAt(0) === 13;}function Token(type, value, start, end) {  var opts = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};  var token = {    type: type,    value: value,    loc: {      start: start,      end: end    }  };  if (Object.keys(opts).length > 0) {    // $FlowIgnore    token["opts"] = opts;  }  return token;}var tokenTypes = {  openParen: "openParen",  closeParen: "closeParen",  number: "number",  string: "string",  name: "name",  identifier: "identifier",  valtype: "valtype",  dot: "dot",  comment: "comment",  equal: "equal",  keyword: "keyword"};export var keywords = {  module: "module",  func: "func",  param: "param",  result: "result",  export: "export",  loop: "loop",  block: "block",  if: "if",  then: "then",  else: "else",  call: "call",  call_indirect: "call_indirect",  import: "import",  memory: "memory",  table: "table",  global: "global",  anyfunc: "anyfunc",  mut: "mut",  data: "data",  type: "type",  elem: "elem",  start: "start",  offset: "offset"};var NUMERIC_SEPARATOR = "_";/** * Build the FSM for number literals */var numberLiteralFSM = new FSM({  START: [makeTransition(/-|\+/, "AFTER_SIGN"), makeTransition(/nan:0x/, "NAN_HEX", {    n: 6  }), makeTransition(/nan|inf/, "STOP", {    n: 3  }), makeTransition(/0x/, "HEX", {    n: 2  }), makeTransition(/[0-9]/, "DEC"), makeTransition(/\./, "DEC_FRAC")],  AFTER_SIGN: [makeTransition(/nan:0x/, "NAN_HEX", {    n: 6  }), makeTransition(/nan|inf/, "STOP", {    n: 3  }), makeTransition(/0x/, "HEX", {    n: 2  }), makeTransition(/[0-9]/, "DEC"), makeTransition(/\./, "DEC_FRAC")],  DEC_FRAC: [makeTransition(/[0-9]/, "DEC_FRAC", {    allowedSeparator: NUMERIC_SEPARATOR  }), makeTransition(/e|E/, "DEC_SIGNED_EXP")],  DEC: [makeTransition(/[0-9]/, "DEC", {    allowedSeparator: NUMERIC_SEPARATOR  }), makeTransition(/\./, "DEC_FRAC"), makeTransition(/e|E/, "DEC_SIGNED_EXP")],  DEC_SIGNED_EXP: [makeTransition(/\+|-/, "DEC_EXP"), makeTransition(/[0-9]/, "DEC_EXP")],  DEC_EXP: [makeTransition(/[0-9]/, "DEC_EXP", {    allowedSeparator: NUMERIC_SEPARATOR  })],  HEX: [makeTransition(/[0-9|A-F|a-f]/, "HEX", {    allowedSeparator: NUMERIC_SEPARATOR  }), makeTransition(/\./, "HEX_FRAC"), makeTransition(/p|P/, "HEX_SIGNED_EXP")],  HEX_FRAC: [makeTransition(/[0-9|A-F|a-f]/, "HEX_FRAC", {    allowedSeparator: NUMERIC_SEPARATOR  }), makeTransition(/p|P|/, "HEX_SIGNED_EXP")],  HEX_SIGNED_EXP: [makeTransition(/[0-9|+|-]/, "HEX_EXP")],  HEX_EXP: [makeTransition(/[0-9]/, "HEX_EXP", {    allowedSeparator: NUMERIC_SEPARATOR  })],  NAN_HEX: [makeTransition(/[0-9|A-F|a-f]/, "NAN_HEX", {    allowedSeparator: NUMERIC_SEPARATOR  })],  STOP: []}, "START", "STOP");export function tokenize(input) {  var current = 0;  var char = input[current]; // Used by SourceLocation  var column = 1;  var line = 1;  var tokens = [];  /**   * Creates a pushToken function for a given type   */  function pushToken(type) {    return function (v) {      var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};      var startColumn = opts.startColumn || column - String(v).length;      delete opts.startColumn;      var endColumn = opts.endColumn || startColumn + String(v).length - 1;      delete opts.endColumn;      var start = {        line: line,        column: startColumn      };      var end = {        line: line,        column: endColumn      };      tokens.push(Token(type, v, start, end, opts));    };  }  /**   * Functions to save newly encountered tokens   */  var pushCloseParenToken = pushToken(tokenTypes.closeParen);  var pushOpenParenToken = pushToken(tokenTypes.openParen);  var pushNumberToken = pushToken(tokenTypes.number);  var pushValtypeToken = pushToken(tokenTypes.valtype);  var pushNameToken = pushToken(tokenTypes.name);  var pushIdentifierToken = pushToken(tokenTypes.identifier);  var pushKeywordToken = pushToken(tokenTypes.keyword);  var pushDotToken = pushToken(tokenTypes.dot);  var pushStringToken = pushToken(tokenTypes.string);  var pushCommentToken = pushToken(tokenTypes.comment);  var pushEqualToken = pushToken(tokenTypes.equal);  /**   * Can be used to look at the next character(s).   *   * The default behavior `lookahead()` simply returns the next character without consuming it.   * Letters are always returned in lowercase.   *   * @param {number} length How many characters to query. Default = 1   * @param {number} offset How many characters to skip forward from current one. Default = 1   *   */  function lookahead() {    var length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;    var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;    return input.substring(current + offset, current + offset + length).toLowerCase();  }  /**   * Advances the cursor in the input by a certain amount   *   * @param {number} amount How many characters to consume. Default = 1   */  function eatCharacter() {    var amount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;    column += amount;    current += amount;    char = input[current];  }  while (current < input.length) {    // ;;    if (char === ";" && lookahead() === ";") {      var startColumn = column;      eatCharacter(2);      var text = "";      while (!isNewLine(char)) {        text += char;        eatCharacter();        if (char === undefined) {          break;        }      }      var endColumn = column;      pushCommentToken(text, {        type: "leading",        startColumn: startColumn,        endColumn: endColumn      });      continue;    } // (;    if (char === "(" && lookahead() === ";") {      var _startColumn = column;      eatCharacter(2);      var _text = ""; // ;)      while (true) {        char = input[current];        if (char === ";" && lookahead() === ")") {          eatCharacter(2);          break;        }        _text += char;        eatCharacter();        if (isNewLine(char)) {          line++;          column = 0;        }      }      var _endColumn = column;      pushCommentToken(_text, {        type: "block",        startColumn: _startColumn,        endColumn: _endColumn      });      continue;    }    if (char === "(") {      pushOpenParenToken(char);      eatCharacter();      continue;    }    if (char === "=") {      pushEqualToken(char);      eatCharacter();      continue;    }    if (char === ")") {      pushCloseParenToken(char);      eatCharacter();      continue;    }    if (isNewLine(char)) {      line++;      eatCharacter();      column = 0;      continue;    }    if (WHITESPACE.test(char)) {      eatCharacter();      continue;    }    if (char === "$") {      var _startColumn2 = column;      eatCharacter();      var value = "";      while (idchar.test(char)) {        value += char;        eatCharacter();      }      var _endColumn2 = column;      pushIdentifierToken(value, {        startColumn: _startColumn2,        endColumn: _endColumn2      });      continue;    }    if (NUMBERS.test(char) || NUMBER_KEYWORDS.test(lookahead(3, 0)) || char === "-" || char === "+") {      var _startColumn3 = column;      var _value = numberLiteralFSM.run(input.slice(current));      if (_value === "") {        throw new Error(getCodeFrame(input, line, column) + "Unexpected character " + JSON.stringify(char));      }      pushNumberToken(_value, {        startColumn: _startColumn3      });      eatCharacter(_value.length);      if (char && !PARENS.test(char) && !WHITESPACE.test(char)) {        throw new Error(getCodeFrame(input, line, column) + "Unexpected character " + JSON.stringify(char));      }      continue;    }    if (char === '"') {      var _startColumn4 = column;      var _value2 = "";      eatCharacter(); // "      while (char !== '"') {        if (isNewLine(char)) {          throw new Error(getCodeFrame(input, line, column) + "Unexpected character " + JSON.stringify(char));        }        _value2 += char;        eatCharacter(); // char      }      eatCharacter(); // "      var _endColumn3 = column;      pushStringToken(_value2, {        startColumn: _startColumn4,        endColumn: _endColumn3      });      continue;    }    if (LETTERS.test(char)) {      var _value3 = "";      var _startColumn5 = column;      while (char && LETTERS.test(char)) {        _value3 += char;        eatCharacter();      }      /*       * Handle MemberAccess       */      if (char === ".") {        var dotStartColumn = column;        if (valtypes.indexOf(_value3) !== -1) {          pushValtypeToken(_value3, {            startColumn: _startColumn5          });        } else {          pushNameToken(_value3);        }        eatCharacter();        _value3 = "";        var nameStartColumn = column;        while (LETTERS.test(char)) {          _value3 += char;          eatCharacter();        }        pushDotToken(".", {          startColumn: dotStartColumn        });        pushNameToken(_value3, {          startColumn: nameStartColumn        });        continue;      }      /*       * Handle keywords       */      // $FlowIgnore      if (typeof keywords[_value3] === "string") {        pushKeywordToken(_value3, {          startColumn: _startColumn5        });        continue;      }      /*       * Handle types       */      if (valtypes.indexOf(_value3) !== -1) {        pushValtypeToken(_value3, {          startColumn: _startColumn5        });        continue;      }      /*       * Handle literals       */      pushNameToken(_value3, {        startColumn: _startColumn5      });      continue;    }    throw new Error(getCodeFrame(input, line, column) + "Unexpected character " + JSON.stringify(char));  }  return tokens;}export var tokens = tokenTypes;
 |