chevrotain
Version:
Chevrotain is a high performance fault tolerant javascript parsing DSL for building recursive decent parsers
1,632 lines (1,626 loc) • 325 kB
JavaScript
var __commonJS = (callback, module2) => () => {
if (!module2) {
module2 = {exports: {}};
callback(module2.exports, module2);
}
return module2.exports;
};
// lib/src/version.js
var require_version = __commonJS((exports2) => {
"use strict";
Object.defineProperty(exports2, "__esModule", {value: true});
exports2.VERSION = void 0;
exports2.VERSION = "9.0.1";
});
// ../utils/lib/src/api.js
var require_api = __commonJS((exports, module) => {
"use strict";
var __spreadArray = exports && exports.__spreadArray || function(to, from) {
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
to[j] = from[i];
return to;
};
Object.defineProperty(exports, "__esModule", {value: true});
exports.toFastProperties = exports.timer = exports.peek = exports.isES2015MapSupported = exports.PRINT_WARNING = exports.PRINT_ERROR = exports.packArray = exports.IDENTITY = exports.NOOP = exports.merge = exports.groupBy = exports.defaults = exports.assignNoOverwrite = exports.assign = exports.zipObject = exports.sortBy = exports.indexOf = exports.some = exports.difference = exports.every = exports.isObject = exports.isRegExp = exports.isArray = exports.partial = exports.uniq = exports.compact = exports.reduce = exports.findAll = exports.find = exports.cloneObj = exports.cloneArr = exports.contains = exports.has = exports.pick = exports.reject = exports.filter = exports.dropRight = exports.drop = exports.isFunction = exports.isUndefined = exports.isString = exports.forEach = exports.last = exports.first = exports.flatten = exports.map = exports.mapValues = exports.values = exports.keys = exports.isEmpty = void 0;
function isEmpty(arr) {
return arr && arr.length === 0;
}
exports.isEmpty = isEmpty;
function keys(obj) {
if (obj === void 0 || obj === null) {
return [];
}
return Object.keys(obj);
}
exports.keys = keys;
function values(obj) {
var vals = [];
var keys2 = Object.keys(obj);
for (var i = 0; i < keys2.length; i++) {
vals.push(obj[keys2[i]]);
}
return vals;
}
exports.values = values;
function mapValues(obj, callback) {
var result = [];
var objKeys = keys(obj);
for (var idx = 0; idx < objKeys.length; idx++) {
var currKey = objKeys[idx];
result.push(callback.call(null, obj[currKey], currKey));
}
return result;
}
exports.mapValues = mapValues;
function map(arr, callback) {
var result = [];
for (var idx = 0; idx < arr.length; idx++) {
result.push(callback.call(null, arr[idx], idx));
}
return result;
}
exports.map = map;
function flatten(arr) {
var result = [];
for (var idx = 0; idx < arr.length; idx++) {
var currItem = arr[idx];
if (Array.isArray(currItem)) {
result = result.concat(flatten(currItem));
} else {
result.push(currItem);
}
}
return result;
}
exports.flatten = flatten;
function first(arr) {
return isEmpty(arr) ? void 0 : arr[0];
}
exports.first = first;
function last(arr) {
var len = arr && arr.length;
return len ? arr[len - 1] : void 0;
}
exports.last = last;
function forEach(collection, iteratorCallback) {
if (Array.isArray(collection)) {
for (var i = 0; i < collection.length; i++) {
iteratorCallback.call(null, collection[i], i);
}
} else if (isObject(collection)) {
var colKeys = keys(collection);
for (var i = 0; i < colKeys.length; i++) {
var key = colKeys[i];
var value = collection[key];
iteratorCallback.call(null, value, key);
}
} else {
throw Error("non exhaustive match");
}
}
exports.forEach = forEach;
function isString(item) {
return typeof item === "string";
}
exports.isString = isString;
function isUndefined(item) {
return item === void 0;
}
exports.isUndefined = isUndefined;
function isFunction(item) {
return item instanceof Function;
}
exports.isFunction = isFunction;
function drop(arr, howMuch) {
if (howMuch === void 0) {
howMuch = 1;
}
return arr.slice(howMuch, arr.length);
}
exports.drop = drop;
function dropRight(arr, howMuch) {
if (howMuch === void 0) {
howMuch = 1;
}
return arr.slice(0, arr.length - howMuch);
}
exports.dropRight = dropRight;
function filter(arr, predicate) {
var result = [];
if (Array.isArray(arr)) {
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (predicate.call(null, item)) {
result.push(item);
}
}
}
return result;
}
exports.filter = filter;
function reject(arr, predicate) {
return filter(arr, function(item) {
return !predicate(item);
});
}
exports.reject = reject;
function pick(obj, predicate) {
var keys2 = Object.keys(obj);
var result = {};
for (var i = 0; i < keys2.length; i++) {
var currKey = keys2[i];
var currItem = obj[currKey];
if (predicate(currItem)) {
result[currKey] = currItem;
}
}
return result;
}
exports.pick = pick;
function has(obj, prop) {
if (isObject(obj)) {
return obj.hasOwnProperty(prop);
}
return false;
}
exports.has = has;
function contains(arr, item) {
return find(arr, function(currItem) {
return currItem === item;
}) !== void 0 ? true : false;
}
exports.contains = contains;
function cloneArr(arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
newArr.push(arr[i]);
}
return newArr;
}
exports.cloneArr = cloneArr;
function cloneObj(obj) {
var clonedObj = {};
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
clonedObj[key] = obj[key];
}
}
return clonedObj;
}
exports.cloneObj = cloneObj;
function find(arr, predicate) {
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (predicate.call(null, item)) {
return item;
}
}
return void 0;
}
exports.find = find;
function findAll(arr, predicate) {
var found = [];
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (predicate.call(null, item)) {
found.push(item);
}
}
return found;
}
exports.findAll = findAll;
function reduce(arrOrObj, iterator, initial) {
var isArr = Array.isArray(arrOrObj);
var vals = isArr ? arrOrObj : values(arrOrObj);
var objKeys = isArr ? [] : keys(arrOrObj);
var accumulator = initial;
for (var i = 0; i < vals.length; i++) {
accumulator = iterator.call(null, accumulator, vals[i], isArr ? i : objKeys[i]);
}
return accumulator;
}
exports.reduce = reduce;
function compact(arr) {
return reject(arr, function(item) {
return item === null || item === void 0;
});
}
exports.compact = compact;
function uniq(arr, identity) {
if (identity === void 0) {
identity = function(item) {
return item;
};
}
var identities = [];
return reduce(arr, function(result, currItem) {
var currIdentity = identity(currItem);
if (contains(identities, currIdentity)) {
return result;
} else {
identities.push(currIdentity);
return result.concat(currItem);
}
}, []);
}
exports.uniq = uniq;
function partial(func) {
var restArgs = [];
for (var _i = 1; _i < arguments.length; _i++) {
restArgs[_i - 1] = arguments[_i];
}
var firstArg = [null];
var allArgs = firstArg.concat(restArgs);
return Function.bind.apply(func, allArgs);
}
exports.partial = partial;
function isArray(obj) {
return Array.isArray(obj);
}
exports.isArray = isArray;
function isRegExp(obj) {
return obj instanceof RegExp;
}
exports.isRegExp = isRegExp;
function isObject(obj) {
return obj instanceof Object;
}
exports.isObject = isObject;
function every(arr, predicate) {
for (var i = 0; i < arr.length; i++) {
if (!predicate(arr[i], i)) {
return false;
}
}
return true;
}
exports.every = every;
function difference(arr, values2) {
return reject(arr, function(item) {
return contains(values2, item);
});
}
exports.difference = difference;
function some(arr, predicate) {
for (var i = 0; i < arr.length; i++) {
if (predicate(arr[i])) {
return true;
}
}
return false;
}
exports.some = some;
function indexOf(arr, value) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] === value) {
return i;
}
}
return -1;
}
exports.indexOf = indexOf;
function sortBy(arr, orderFunc) {
var result = cloneArr(arr);
result.sort(function(a, b) {
return orderFunc(a) - orderFunc(b);
});
return result;
}
exports.sortBy = sortBy;
function zipObject(keys2, values2) {
if (keys2.length !== values2.length) {
throw Error("can't zipObject with different number of keys and values!");
}
var result = {};
for (var i = 0; i < keys2.length; i++) {
result[keys2[i]] = values2[i];
}
return result;
}
exports.zipObject = zipObject;
function assign(target) {
var sources = [];
for (var _i = 1; _i < arguments.length; _i++) {
sources[_i - 1] = arguments[_i];
}
for (var i = 0; i < sources.length; i++) {
var curSource = sources[i];
var currSourceKeys = keys(curSource);
for (var j = 0; j < currSourceKeys.length; j++) {
var currKey = currSourceKeys[j];
target[currKey] = curSource[currKey];
}
}
return target;
}
exports.assign = assign;
function assignNoOverwrite(target) {
var sources = [];
for (var _i = 1; _i < arguments.length; _i++) {
sources[_i - 1] = arguments[_i];
}
for (var i = 0; i < sources.length; i++) {
var curSource = sources[i];
var currSourceKeys = keys(curSource);
for (var j = 0; j < currSourceKeys.length; j++) {
var currKey = currSourceKeys[j];
if (!has(target, currKey)) {
target[currKey] = curSource[currKey];
}
}
}
return target;
}
exports.assignNoOverwrite = assignNoOverwrite;
function defaults() {
var sources = [];
for (var _i = 0; _i < arguments.length; _i++) {
sources[_i] = arguments[_i];
}
return assignNoOverwrite.apply(void 0, __spreadArray([{}], sources));
}
exports.defaults = defaults;
function groupBy(arr, groupKeyFunc) {
var result = {};
forEach(arr, function(item) {
var currGroupKey = groupKeyFunc(item);
var currGroupArr = result[currGroupKey];
if (currGroupArr) {
currGroupArr.push(item);
} else {
result[currGroupKey] = [item];
}
});
return result;
}
exports.groupBy = groupBy;
function merge(obj1, obj2) {
var result = cloneObj(obj1);
var keys2 = keys(obj2);
for (var i = 0; i < keys2.length; i++) {
var key = keys2[i];
var value = obj2[key];
result[key] = value;
}
return result;
}
exports.merge = merge;
function NOOP() {
}
exports.NOOP = NOOP;
function IDENTITY(item) {
return item;
}
exports.IDENTITY = IDENTITY;
function packArray(holeyArr) {
var result = [];
for (var i = 0; i < holeyArr.length; i++) {
var orgValue = holeyArr[i];
result.push(orgValue !== void 0 ? orgValue : void 0);
}
return result;
}
exports.packArray = packArray;
function PRINT_ERROR(msg) {
if (console && console.error) {
console.error("Error: " + msg);
}
}
exports.PRINT_ERROR = PRINT_ERROR;
function PRINT_WARNING(msg) {
if (console && console.warn) {
console.warn("Warning: " + msg);
}
}
exports.PRINT_WARNING = PRINT_WARNING;
function isES2015MapSupported() {
return typeof Map === "function";
}
exports.isES2015MapSupported = isES2015MapSupported;
function peek(arr) {
return arr[arr.length - 1];
}
exports.peek = peek;
function timer(func) {
var start = new Date().getTime();
var val = func();
var end = new Date().getTime();
var total = end - start;
return {time: total, value: val};
}
exports.timer = timer;
function toFastProperties(toBecomeFast) {
function FakeConstructor() {
}
FakeConstructor.prototype = toBecomeFast;
var fakeInstance = new FakeConstructor();
function fakeAccess() {
return typeof fakeInstance.bar;
}
fakeAccess();
fakeAccess();
return toBecomeFast;
eval(toBecomeFast);
}
exports.toFastProperties = toFastProperties;
});
// ../../node_modules/regexp-to-ast/lib/regexp-to-ast.js
var require_regexp_to_ast = __commonJS((exports2, module2) => {
(function(root, factory) {
if (typeof define === "function" && define.amd) {
define([], factory);
} else if (typeof module2 === "object" && module2.exports) {
module2.exports = factory();
} else {
root.regexpToAst = factory();
}
})(typeof self !== "undefined" ? self : exports2, function() {
function RegExpParser() {
}
RegExpParser.prototype.saveState = function() {
return {
idx: this.idx,
input: this.input,
groupIdx: this.groupIdx
};
};
RegExpParser.prototype.restoreState = function(newState) {
this.idx = newState.idx;
this.input = newState.input;
this.groupIdx = newState.groupIdx;
};
RegExpParser.prototype.pattern = function(input) {
this.idx = 0;
this.input = input;
this.groupIdx = 0;
this.consumeChar("/");
var value = this.disjunction();
this.consumeChar("/");
var flags = {
type: "Flags",
loc: {begin: this.idx, end: input.length},
global: false,
ignoreCase: false,
multiLine: false,
unicode: false,
sticky: false
};
while (this.isRegExpFlag()) {
switch (this.popChar()) {
case "g":
addFlag(flags, "global");
break;
case "i":
addFlag(flags, "ignoreCase");
break;
case "m":
addFlag(flags, "multiLine");
break;
case "u":
addFlag(flags, "unicode");
break;
case "y":
addFlag(flags, "sticky");
break;
}
}
if (this.idx !== this.input.length) {
throw Error("Redundant input: " + this.input.substring(this.idx));
}
return {
type: "Pattern",
flags,
value,
loc: this.loc(0)
};
};
RegExpParser.prototype.disjunction = function() {
var alts = [];
var begin = this.idx;
alts.push(this.alternative());
while (this.peekChar() === "|") {
this.consumeChar("|");
alts.push(this.alternative());
}
return {type: "Disjunction", value: alts, loc: this.loc(begin)};
};
RegExpParser.prototype.alternative = function() {
var terms = [];
var begin = this.idx;
while (this.isTerm()) {
terms.push(this.term());
}
return {type: "Alternative", value: terms, loc: this.loc(begin)};
};
RegExpParser.prototype.term = function() {
if (this.isAssertion()) {
return this.assertion();
} else {
return this.atom();
}
};
RegExpParser.prototype.assertion = function() {
var begin = this.idx;
switch (this.popChar()) {
case "^":
return {
type: "StartAnchor",
loc: this.loc(begin)
};
case "$":
return {type: "EndAnchor", loc: this.loc(begin)};
case "\\":
switch (this.popChar()) {
case "b":
return {
type: "WordBoundary",
loc: this.loc(begin)
};
case "B":
return {
type: "NonWordBoundary",
loc: this.loc(begin)
};
}
throw Error("Invalid Assertion Escape");
case "(":
this.consumeChar("?");
var type;
switch (this.popChar()) {
case "=":
type = "Lookahead";
break;
case "!":
type = "NegativeLookahead";
break;
}
ASSERT_EXISTS(type);
var disjunction = this.disjunction();
this.consumeChar(")");
return {
type,
value: disjunction,
loc: this.loc(begin)
};
}
ASSERT_NEVER_REACH_HERE();
};
RegExpParser.prototype.quantifier = function(isBacktracking) {
var range;
var begin = this.idx;
switch (this.popChar()) {
case "*":
range = {
atLeast: 0,
atMost: Infinity
};
break;
case "+":
range = {
atLeast: 1,
atMost: Infinity
};
break;
case "?":
range = {
atLeast: 0,
atMost: 1
};
break;
case "{":
var atLeast = this.integerIncludingZero();
switch (this.popChar()) {
case "}":
range = {
atLeast,
atMost: atLeast
};
break;
case ",":
var atMost;
if (this.isDigit()) {
atMost = this.integerIncludingZero();
range = {
atLeast,
atMost
};
} else {
range = {
atLeast,
atMost: Infinity
};
}
this.consumeChar("}");
break;
}
if (isBacktracking === true && range === void 0) {
return void 0;
}
ASSERT_EXISTS(range);
break;
}
if (isBacktracking === true && range === void 0) {
return void 0;
}
ASSERT_EXISTS(range);
if (this.peekChar(0) === "?") {
this.consumeChar("?");
range.greedy = false;
} else {
range.greedy = true;
}
range.type = "Quantifier";
range.loc = this.loc(begin);
return range;
};
RegExpParser.prototype.atom = function() {
var atom;
var begin = this.idx;
switch (this.peekChar()) {
case ".":
atom = this.dotAll();
break;
case "\\":
atom = this.atomEscape();
break;
case "[":
atom = this.characterClass();
break;
case "(":
atom = this.group();
break;
}
if (atom === void 0 && this.isPatternCharacter()) {
atom = this.patternCharacter();
}
ASSERT_EXISTS(atom);
atom.loc = this.loc(begin);
if (this.isQuantifier()) {
atom.quantifier = this.quantifier();
}
return atom;
};
RegExpParser.prototype.dotAll = function() {
this.consumeChar(".");
return {
type: "Set",
complement: true,
value: [cc("\n"), cc("\r"), cc("\u2028"), cc("\u2029")]
};
};
RegExpParser.prototype.atomEscape = function() {
this.consumeChar("\\");
switch (this.peekChar()) {
case "1":
case "2":
case "3":
case "4":
case "5":
case "6":
case "7":
case "8":
case "9":
return this.decimalEscapeAtom();
case "d":
case "D":
case "s":
case "S":
case "w":
case "W":
return this.characterClassEscape();
case "f":
case "n":
case "r":
case "t":
case "v":
return this.controlEscapeAtom();
case "c":
return this.controlLetterEscapeAtom();
case "0":
return this.nulCharacterAtom();
case "x":
return this.hexEscapeSequenceAtom();
case "u":
return this.regExpUnicodeEscapeSequenceAtom();
default:
return this.identityEscapeAtom();
}
};
RegExpParser.prototype.decimalEscapeAtom = function() {
var value = this.positiveInteger();
return {type: "GroupBackReference", value};
};
RegExpParser.prototype.characterClassEscape = function() {
var set;
var complement = false;
switch (this.popChar()) {
case "d":
set = digitsCharCodes;
break;
case "D":
set = digitsCharCodes;
complement = true;
break;
case "s":
set = whitespaceCodes;
break;
case "S":
set = whitespaceCodes;
complement = true;
break;
case "w":
set = wordCharCodes;
break;
case "W":
set = wordCharCodes;
complement = true;
break;
}
ASSERT_EXISTS(set);
return {type: "Set", value: set, complement};
};
RegExpParser.prototype.controlEscapeAtom = function() {
var escapeCode;
switch (this.popChar()) {
case "f":
escapeCode = cc("\f");
break;
case "n":
escapeCode = cc("\n");
break;
case "r":
escapeCode = cc("\r");
break;
case "t":
escapeCode = cc(" ");
break;
case "v":
escapeCode = cc("\v");
break;
}
ASSERT_EXISTS(escapeCode);
return {type: "Character", value: escapeCode};
};
RegExpParser.prototype.controlLetterEscapeAtom = function() {
this.consumeChar("c");
var letter = this.popChar();
if (/[a-zA-Z]/.test(letter) === false) {
throw Error("Invalid ");
}
var letterCode = letter.toUpperCase().charCodeAt(0) - 64;
return {type: "Character", value: letterCode};
};
RegExpParser.prototype.nulCharacterAtom = function() {
this.consumeChar("0");
return {type: "Character", value: cc("\0")};
};
RegExpParser.prototype.hexEscapeSequenceAtom = function() {
this.consumeChar("x");
return this.parseHexDigits(2);
};
RegExpParser.prototype.regExpUnicodeEscapeSequenceAtom = function() {
this.consumeChar("u");
return this.parseHexDigits(4);
};
RegExpParser.prototype.identityEscapeAtom = function() {
var escapedChar = this.popChar();
return {type: "Character", value: cc(escapedChar)};
};
RegExpParser.prototype.classPatternCharacterAtom = function() {
switch (this.peekChar()) {
case "\n":
case "\r":
case "\u2028":
case "\u2029":
case "\\":
case "]":
throw Error("TBD");
default:
var nextChar = this.popChar();
return {type: "Character", value: cc(nextChar)};
}
};
RegExpParser.prototype.characterClass = function() {
var set = [];
var complement = false;
this.consumeChar("[");
if (this.peekChar(0) === "^") {
this.consumeChar("^");
complement = true;
}
while (this.isClassAtom()) {
var from = this.classAtom();
var isFromSingleChar = from.type === "Character";
if (isFromSingleChar && this.isRangeDash()) {
this.consumeChar("-");
var to = this.classAtom();
var isToSingleChar = to.type === "Character";
if (isToSingleChar) {
if (to.value < from.value) {
throw Error("Range out of order in character class");
}
set.push({from: from.value, to: to.value});
} else {
insertToSet(from.value, set);
set.push(cc("-"));
insertToSet(to.value, set);
}
} else {
insertToSet(from.value, set);
}
}
this.consumeChar("]");
return {type: "Set", complement, value: set};
};
RegExpParser.prototype.classAtom = function() {
switch (this.peekChar()) {
case "]":
case "\n":
case "\r":
case "\u2028":
case "\u2029":
throw Error("TBD");
case "\\":
return this.classEscape();
default:
return this.classPatternCharacterAtom();
}
};
RegExpParser.prototype.classEscape = function() {
this.consumeChar("\\");
switch (this.peekChar()) {
case "b":
this.consumeChar("b");
return {type: "Character", value: cc("\b")};
case "d":
case "D":
case "s":
case "S":
case "w":
case "W":
return this.characterClassEscape();
case "f":
case "n":
case "r":
case "t":
case "v":
return this.controlEscapeAtom();
case "c":
return this.controlLetterEscapeAtom();
case "0":
return this.nulCharacterAtom();
case "x":
return this.hexEscapeSequenceAtom();
case "u":
return this.regExpUnicodeEscapeSequenceAtom();
default:
return this.identityEscapeAtom();
}
};
RegExpParser.prototype.group = function() {
var capturing = true;
this.consumeChar("(");
switch (this.peekChar(0)) {
case "?":
this.consumeChar("?");
this.consumeChar(":");
capturing = false;
break;
default:
this.groupIdx++;
break;
}
var value = this.disjunction();
this.consumeChar(")");
var groupAst = {
type: "Group",
capturing,
value
};
if (capturing) {
groupAst.idx = this.groupIdx;
}
return groupAst;
};
RegExpParser.prototype.positiveInteger = function() {
var number = this.popChar();
if (decimalPatternNoZero.test(number) === false) {
throw Error("Expecting a positive integer");
}
while (decimalPattern.test(this.peekChar(0))) {
number += this.popChar();
}
return parseInt(number, 10);
};
RegExpParser.prototype.integerIncludingZero = function() {
var number = this.popChar();
if (decimalPattern.test(number) === false) {
throw Error("Expecting an integer");
}
while (decimalPattern.test(this.peekChar(0))) {
number += this.popChar();
}
return parseInt(number, 10);
};
RegExpParser.prototype.patternCharacter = function() {
var nextChar = this.popChar();
switch (nextChar) {
case "\n":
case "\r":
case "\u2028":
case "\u2029":
case "^":
case "$":
case "\\":
case ".":
case "*":
case "+":
case "?":
case "(":
case ")":
case "[":
case "|":
throw Error("TBD");
default:
return {type: "Character", value: cc(nextChar)};
}
};
RegExpParser.prototype.isRegExpFlag = function() {
switch (this.peekChar(0)) {
case "g":
case "i":
case "m":
case "u":
case "y":
return true;
default:
return false;
}
};
RegExpParser.prototype.isRangeDash = function() {
return this.peekChar() === "-" && this.isClassAtom(1);
};
RegExpParser.prototype.isDigit = function() {
return decimalPattern.test(this.peekChar(0));
};
RegExpParser.prototype.isClassAtom = function(howMuch) {
if (howMuch === void 0) {
howMuch = 0;
}
switch (this.peekChar(howMuch)) {
case "]":
case "\n":
case "\r":
case "\u2028":
case "\u2029":
return false;
default:
return true;
}
};
RegExpParser.prototype.isTerm = function() {
return this.isAtom() || this.isAssertion();
};
RegExpParser.prototype.isAtom = function() {
if (this.isPatternCharacter()) {
return true;
}
switch (this.peekChar(0)) {
case ".":
case "\\":
case "[":
case "(":
return true;
default:
return false;
}
};
RegExpParser.prototype.isAssertion = function() {
switch (this.peekChar(0)) {
case "^":
case "$":
return true;
case "\\":
switch (this.peekChar(1)) {
case "b":
case "B":
return true;
default:
return false;
}
case "(":
return this.peekChar(1) === "?" && (this.peekChar(2) === "=" || this.peekChar(2) === "!");
default:
return false;
}
};
RegExpParser.prototype.isQuantifier = function() {
var prevState = this.saveState();
try {
return this.quantifier(true) !== void 0;
} catch (e) {
return false;
} finally {
this.restoreState(prevState);
}
};
RegExpParser.prototype.isPatternCharacter = function() {
switch (this.peekChar()) {
case "^":
case "$":
case "\\":
case ".":
case "*":
case "+":
case "?":
case "(":
case ")":
case "[":
case "|":
case "/":
case "\n":
case "\r":
case "\u2028":
case "\u2029":
return false;
default:
return true;
}
};
RegExpParser.prototype.parseHexDigits = function(howMany) {
var hexString = "";
for (var i2 = 0; i2 < howMany; i2++) {
var hexChar = this.popChar();
if (hexDigitPattern.test(hexChar) === false) {
throw Error("Expecting a HexDecimal digits");
}
hexString += hexChar;
}
var charCode = parseInt(hexString, 16);
return {type: "Character", value: charCode};
};
RegExpParser.prototype.peekChar = function(howMuch) {
if (howMuch === void 0) {
howMuch = 0;
}
return this.input[this.idx + howMuch];
};
RegExpParser.prototype.popChar = function() {
var nextChar = this.peekChar(0);
this.consumeChar();
return nextChar;
};
RegExpParser.prototype.consumeChar = function(char) {
if (char !== void 0 && this.input[this.idx] !== char) {
throw Error("Expected: '" + char + "' but found: '" + this.input[this.idx] + "' at offset: " + this.idx);
}
if (this.idx >= this.input.length) {
throw Error("Unexpected end of input");
}
this.idx++;
};
RegExpParser.prototype.loc = function(begin) {
return {begin, end: this.idx};
};
var hexDigitPattern = /[0-9a-fA-F]/;
var decimalPattern = /[0-9]/;
var decimalPatternNoZero = /[1-9]/;
function cc(char) {
return char.charCodeAt(0);
}
function insertToSet(item, set) {
if (item.length !== void 0) {
item.forEach(function(subItem) {
set.push(subItem);
});
} else {
set.push(item);
}
}
function addFlag(flagObj, flagKey) {
if (flagObj[flagKey] === true) {
throw "duplicate flag " + flagKey;
}
flagObj[flagKey] = true;
}
function ASSERT_EXISTS(obj) {
if (obj === void 0) {
throw Error("Internal Error - Should never get here!");
}
}
function ASSERT_NEVER_REACH_HERE() {
throw Error("Internal Error - Should never get here!");
}
var i;
var digitsCharCodes = [];
for (i = cc("0"); i <= cc("9"); i++) {
digitsCharCodes.push(i);
}
var wordCharCodes = [cc("_")].concat(digitsCharCodes);
for (i = cc("a"); i <= cc("z"); i++) {
wordCharCodes.push(i);
}
for (i = cc("A"); i <= cc("Z"); i++) {
wordCharCodes.push(i);
}
var whitespaceCodes = [
cc(" "),
cc("\f"),
cc("\n"),
cc("\r"),
cc(" "),
cc("\v"),
cc(" "),
cc("\xA0"),
cc("\u1680"),
cc("\u2000"),
cc("\u2001"),
cc("\u2002"),
cc("\u2003"),
cc("\u2004"),
cc("\u2005"),
cc("\u2006"),
cc("\u2007"),
cc("\u2008"),
cc("\u2009"),
cc("\u200A"),
cc("\u2028"),
cc("\u2029"),
cc("\u202F"),
cc("\u205F"),
cc("\u3000"),
cc("\uFEFF")
];
function BaseRegExpVisitor() {
}
BaseRegExpVisitor.prototype.visitChildren = function(node) {
for (var key in node) {
var child = node[key];
if (node.hasOwnProperty(key)) {
if (child.type !== void 0) {
this.visit(child);
} else if (Array.isArray(child)) {
child.forEach(function(subChild) {
this.visit(subChild);
}, this);
}
}
}
};
BaseRegExpVisitor.prototype.visit = function(node) {
switch (node.type) {
case "Pattern":
this.visitPattern(node);
break;
case "Flags":
this.visitFlags(node);
break;
case "Disjunction":
this.visitDisjunction(node);
break;
case "Alternative":
this.visitAlternative(node);
break;
case "StartAnchor":
this.visitStartAnchor(node);
break;
case "EndAnchor":
this.visitEndAnchor(node);
break;
case "WordBoundary":
this.visitWordBoundary(node);
break;
case "NonWordBoundary":
this.visitNonWordBoundary(node);
break;
case "Lookahead":
this.visitLookahead(node);
break;
case "NegativeLookahead":
this.visitNegativeLookahead(node);
break;
case "Character":
this.visitCharacter(node);
break;
case "Set":
this.visitSet(node);
break;
case "Group":
this.visitGroup(node);
break;
case "GroupBackReference":
this.visitGroupBackReference(node);
break;
case "Quantifier":
this.visitQuantifier(node);
break;
}
this.visitChildren(node);
};
BaseRegExpVisitor.prototype.visitPattern = function(node) {
};
BaseRegExpVisitor.prototype.visitFlags = function(node) {
};
BaseRegExpVisitor.prototype.visitDisjunction = function(node) {
};
BaseRegExpVisitor.prototype.visitAlternative = function(node) {
};
BaseRegExpVisitor.prototype.visitStartAnchor = function(node) {
};
BaseRegExpVisitor.prototype.visitEndAnchor = function(node) {
};
BaseRegExpVisitor.prototype.visitWordBoundary = function(node) {
};
BaseRegExpVisitor.prototype.visitNonWordBoundary = function(node) {
};
BaseRegExpVisitor.prototype.visitLookahead = function(node) {
};
BaseRegExpVisitor.prototype.visitNegativeLookahead = function(node) {
};
BaseRegExpVisitor.prototype.visitCharacter = function(node) {
};
BaseRegExpVisitor.prototype.visitSet = function(node) {
};
BaseRegExpVisitor.prototype.visitGroup = function(node) {
};
BaseRegExpVisitor.prototype.visitGroupBackReference = function(node) {
};
BaseRegExpVisitor.prototype.visitQuantifier = function(node) {
};
return {
RegExpParser,
BaseRegExpVisitor,
VERSION: "0.5.0"
};
});
});
// lib/src/scan/reg_exp_parser.js
var require_reg_exp_parser = __commonJS((exports2) => {
"use strict";
Object.defineProperty(exports2, "__esModule", {value: true});
exports2.clearRegExpParserCache = exports2.getRegExpAst = void 0;
var regexp_to_ast_1 = require_regexp_to_ast();
var regExpAstCache = {};
var regExpParser = new regexp_to_ast_1.RegExpParser();
function getRegExpAst(regExp) {
var regExpStr = regExp.toString();
if (regExpAstCache.hasOwnProperty(regExpStr)) {
return regExpAstCache[regExpStr];
} else {
var regExpAst = regExpParser.pattern(regExpStr);
regExpAstCache[regExpStr] = regExpAst;
return regExpAst;
}
}
exports2.getRegExpAst = getRegExpAst;
function clearRegExpParserCache() {
regExpAstCache = {};
}
exports2.clearRegExpParserCache = clearRegExpParserCache;
});
// lib/src/scan/reg_exp.js
var require_reg_exp = __commonJS((exports2) => {
"use strict";
var __extends = exports2 && exports2.__extends || function() {
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf || {__proto__: []} instanceof Array && function(d2, b2) {
d2.__proto__ = b2;
} || function(d2, b2) {
for (var p in b2)
if (Object.prototype.hasOwnProperty.call(b2, p))
d2[p] = b2[p];
};
return extendStatics(d, b);
};
return function(d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() {
this.constructor = d;
}
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
}();
Object.defineProperty(exports2, "__esModule", {value: true});
exports2.canMatchCharCode = exports2.firstCharOptimizedIndices = exports2.getOptimizedStartCodesIndices = exports2.failedOptimizationPrefixMsg = void 0;
var regexp_to_ast_1 = require_regexp_to_ast();
var utils_1 = require_api();
var reg_exp_parser_1 = require_reg_exp_parser();
var lexer_1 = require_lexer();
var complementErrorMessage = "Complement Sets are not supported for first char optimization";
exports2.failedOptimizationPrefixMsg = 'Unable to use "first char" lexer optimizations:\n';
function getOptimizedStartCodesIndices(regExp, ensureOptimizations) {
if (ensureOptimizations === void 0) {
ensureOptimizations = false;
}
try {
var ast = reg_exp_parser_1.getRegExpAst(regExp);
var firstChars = firstCharOptimizedIndices(ast.value, {}, ast.flags.ignoreCase);
return firstChars;
} catch (e) {
if (e.message === complementErrorMessage) {
if (ensureOptimizations) {
utils_1.PRINT_WARNING("" + exports2.failedOptimizationPrefixMsg + (" Unable to optimize: < " + regExp.toString() + " >\n") + " Complement Sets cannot be automatically optimized.\n This will disable the lexer's first char optimizations.\n See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.");
}
} else {
var msgSuffix = "";
if (ensureOptimizations) {
msgSuffix = "\n This will disable the lexer's first char optimizations.\n See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.";
}
utils_1.PRINT_ERROR(exports2.failedOptimizationPrefixMsg + "\n" + (" Failed parsing: < " + regExp.toString() + " >\n") + (" Using the regexp-to-ast library version: " + regexp_to_ast_1.VERSION + "\n") + " Please open an issue at: https://github.com/bd82/regexp-to-ast/issues" + msgSuffix);
}
}
return [];
}
exports2.getOptimizedStartCodesIndices = getOptimizedStartCodesIndices;
function firstCharOptimizedIndices(ast, result, ignoreCase) {
switch (ast.type) {
case "Disjunction":
for (var i = 0; i < ast.value.length; i++) {
firstCharOptimizedIndices(ast.value[i], result, ignoreCase);
}
break;
case "Alternative":
var terms = ast.value;
for (var i = 0; i < terms.length; i++) {
var term = terms[i];
switch (term.type) {
case "EndAnchor":
case "GroupBackReference":
case "Lookahead":
case "NegativeLookahead":
case "StartAnchor":
case "WordBoundary":
case "NonWordBoundary":
continue;
}
var atom = term;
switch (atom.type) {
case "Character":
addOptimizedIdxToResult(atom.value, result, ignoreCase);
break;
case "Set":
if (atom.complement === true) {
throw Error(complementErrorMessage);
}
utils_1.forEach(atom.value, function(code) {
if (typeof code === "number") {
addOptimizedIdxToResult(code, result, ignoreCase);
} else {
var range = code;
if (ignoreCase === true) {
for (var rangeCode = range.from; rangeCode <= range.to; rangeCode++) {
addOptimizedIdxToResult(rangeCode, result, ignoreCase);
}
} else {
for (var rangeCode = range.from; rangeCode <= range.to && rangeCode < lexer_1.minOptimizationVal; rangeCode++) {
addOptimizedIdxToResult(rangeCode, result, ignoreCase);
}
if (range.to >= lexer_1.minOptimizationVal) {
var minUnOptVal = range.from >= lexer_1.minOptimizationVal ? range.from : lexer_1.minOptimizationVal;
var maxUnOptVal = range.to;
var minOptIdx = lexer_1.charCodeToOptimizedIndex(minUnOptVal);
var maxOptIdx = lexer_1.charCodeToOptimizedIndex(maxUnOptVal);
for (var currOptIdx = minOptIdx; currOptIdx <= maxOptIdx; currOptIdx++) {
result[currOptIdx] = currOptIdx;
}
}
}
}
});
break;
case "Group":
firstCharOptimizedIndices(atom.value, result, ignoreCase);
break;
default:
throw Error("Non Exhaustive Match");
}
var isOptionalQuantifier = atom.quantifier !== void 0 && atom.quantifier.atLeast === 0;
if (atom.type === "Group" && isWholeOptional(atom) === false || atom.type !== "Group" && isOptionalQuantifier === false) {
break;
}
}
break;
default:
throw Error("non exhaustive match!");
}
return utils_1.values(result);
}
exports2.firstCharOptimizedIndices = firstCharOptimizedIndices;
function addOptimizedIdxToResult(code, result, ignoreCase) {
var optimizedCharIdx = lexer_1.charCodeToOptimizedIndex(code);
result[optimizedCharIdx] = optimizedCharIdx;
if (ignoreCase === true) {
handleIgnoreCase(code, result);
}
}
function handleIgnoreCase(code, result) {
var char = String.fromCharCode(code);
var upperChar = char.toUpperCase();
if (upperChar !== char) {
var optimizedCharIdx = lexer_1.charCodeToOptimizedIndex(upperChar.charCodeAt(0));
result[optimizedCharIdx] = optimizedCharIdx;
} else {
var lowerChar = char.toLowerCase();
if (lowerChar !== char) {
var optimizedCharIdx = lexer_1.charCodeToOptimizedIndex(lowerChar.charCodeAt(0));
result[optimizedCharIdx] = optimizedCharIdx;
}
}
}
function findCode(setNode, targetCharCodes) {
return utils_1.find(setNode.value, function(codeOrRange) {
if (typeof codeOrRange === "number") {
return utils_1.contains(targetCharCodes, codeOrRange);
} else {
var range_1 = codeOrRange;
return utils_1.find(targetCharCodes, function(targetCode) {
return range_1.from <= targetCode && targetCode <= range_1.to;
}) !== void 0;
}
});
}
function isWholeOptional(ast) {
if (ast.quantifier && ast.quantifier.atLeast === 0) {
return true;
}
if (!ast.value) {
return false;
}
return utils_1.isArray(ast.value) ? utils_1.every(ast.value, isWholeOptional) : isWholeOptional(ast.value);
}
var CharCodeFinder = function(_super) {
__extends(CharCodeFinder2, _super);
function CharCodeFinder2(targetCharCodes) {
var _this = _super.call(this) || this;
_this.targetCharCodes = targetCharCodes;
_this.found = false;
return _this;
}
CharCodeFinder2.prototype.visitChildren = function(node) {
if (this.found === true) {
return;
}
switch (node.type) {
case "Lookahead":
this.visitLookahead(node);
return;
case "NegativeLookahead":
this.visitNegativeLookahead(node);
return;
}
_super.prototype.visitChildren.call(this, node);
};
CharCodeFinder2.prototype.visitCharacter = function(node) {
if (utils_1.contains(this.targetCharCodes, node.value)) {
this.found = true;
}
};
CharCodeFinder2.prototype.visitSet = function(node) {
if (node.complement) {
if (findCode(node, this.targetCharCodes) === void 0) {
this.found = true;
}
} else {
if (findCode(node, this.targetCharCodes) !== void 0) {
this.found = true;
}
}
};
return CharCodeFinder2;
}(regexp_to_ast_1.BaseRegExpVisitor);
function canMatchCharCode(charCodes, pattern) {
if (pattern instanceof RegExp) {
var ast = reg_exp_parser_1.getRegExpAst(pattern);
var charCodeFinder = new CharCodeFinder(charCodes);
charCodeFinder.visit(ast);
return charCodeFinder.found;
} else {
return utils_1.find(pattern, function(char) {
return utils_1.contains(charCodes, char.charCodeAt(0));
}) !== void 0;
}
}
exports2.canMatchCharCode = canMatchCharCode;
});
// lib/src/scan/lexer.js
var require_lexer = __commonJS((exports2) => {
"use strict";
var __extends = exports2 && exports2.__extends || function() {
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf || {__proto__: []} instanceof Array && function(d2, b2) {
d2.__proto__ = b2;
} || function(d2, b2) {
for (var p in b2)
if (Object.prototype.hasOwnProperty.call(b2, p))
d2[p] = b2[p];
};
return extendStatics(d, b);
};
return function(d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() {
this.constructor = d;
}
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
}();
Object.defineProperty(exports2, "__esModule", {value: true});
exports2.charCodeToOptimizedIndex = exports2.minOptimizationVal = exports2.buildLineBreakIssueMessage = exports2.LineTerminatorOptimizedTester = exports2.isShortPattern = exports2.isCustomPattern = exports2.cloneEmptyGroups = exports2.performWarningRuntimeChecks = exports2.performRuntimeChecks = exports2.addStickyFlag = exports2.addStartOfInput = exports2.findUnreachablePatterns = exports2.findModesThatDoNotExist = exports2.findInvalidGroupType = exports2.findDuplicatePatterns = exports2.findUnsupportedFlags = exports2.findStartOfInputAnchor = exports2.findEmptyMatchRegExps = exports2.findEndOfInputAnchor = exports2.findInvalidPatterns = exports2.findMissingPatterns = exports2.validatePatterns = exports2.analyzeTokenTypes = exports2.enableSticky = exports2.disableSticky = exports2.SUPPORT_STICKY = exports2.MODES = exports2.DEFAULT_MODE = void 0;
var regexp_to_ast_1 = require_regexp_to_ast();
var lexer_public_1 = require_lexer_public();
var utils_1 = require_api();
var reg_exp_1 = require_reg_exp();
var reg_exp_parser_1 = require_reg_exp_parser();
var PATTERN = "PATTERN";
exports2.DEFAULT_MODE = "defaultMode";
exports2.MODES = "modes";
exports2.SUPPORT_STICKY = typeof new RegExp("(?:)").sticky === "boolean";
function disableSticky() {
exports2.SUPPORT_STICKY = false;
}
exports2.disableSticky = disableSticky;
function enableSticky() {
exports2.SUPPORT_STICKY = true;
}
exports2.enableSticky = enableSticky;
function analyzeTokenTypes(tokenTypes, options) {
options = utils_1.defaults(options, {
useSticky: exports2.SUPPORT_STICKY,
debug: false,
safeMode: false,
positionTracking: "full",
lineTerminatorCharacters: ["\r", "\n"],
tracer: function(msg, action) {
return action();
}
});
var tracer = options.tracer;
tracer("initCharCodeToOptimizedIndexMap", function() {
initCharCodeToOptimizedIndexMap();
});
var onlyRelevantTypes;
tracer("Reject Lexer.NA", function() {
onlyRelevantTypes = utils_1.reject(tokenTypes, function(currType) {
return currType[PATTERN] === lexer_public_1.Lexer.NA;
});
});
var hasCustom = false;
var allTransformedPatterns;
tracer("Transform Patterns", function() {
hasCustom = false;
allTransformedPatterns = utils_1.map(onlyRelevantTypes, function(currType) {
var currPattern = currType[PATTERN];
if (utils_1.isRegExp(currPattern)) {
var regExpSource = currPattern.source;
if (regExpSource.length === 1 && regExpSource !== "^" && regExpSource !== "$" && regExpSource !== "." && !currPattern.ignoreCase) {
return regExpSource;
} else if (regExpSource.length === 2 && regExpSource[0] === "\\" && !utils_1.contains([
"d",
"D",
"s",
"S",
"t",
"r",
"n",
"t",
"0",
"c",
"b",
"B",
"f",
"v",
"w",
"W"
], regExpSource[1])) {
return regExpSource[1];
} else {
return options.useSticky ? addStickyFlag(currPattern) : addStartOfInput(currPattern);
}
} else if (utils_1.isFunction(currPattern)) {
hasCustom = true;
return {exec: currPattern};
} else if (utils_1.