|
|
"use strict";
|
|
|
(self["webpackChunk_JUPYTERLAB_CORE_OUTPUT"] = self["webpackChunk_JUPYTERLAB_CORE_OUTPUT"] || []).push([[2913],{
|
|
|
|
|
|
/***/ 93036:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
|
|
|
/*!
|
|
|
Copyright 2019 Ron Buckton
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
you may not use this file except in compliance with the License.
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
See the License for the specific language governing permissions and
|
|
|
limitations under the License.
|
|
|
*/
|
|
|
const config = {
|
|
|
mode: "lazy"
|
|
|
};
|
|
|
module.exports = config;
|
|
|
//# sourceMappingURL=config.js.map
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 90425:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
|
|
|
/*!
|
|
|
Copyright 2019 Ron Buckton
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
you may not use this file except in compliance with the License.
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
See the License for the specific language governing permissions and
|
|
|
limitations under the License.
|
|
|
*/
|
|
|
/*
|
|
|
require('foo').implementation or require('foo/implementation') is a spec-compliant JS function,
|
|
|
that will depend on a receiver (a “this” value) as the spec requires.
|
|
|
*/
|
|
|
const config = __webpack_require__(93036);
|
|
|
const nativeExec = __webpack_require__(55460);
|
|
|
const regexp_tree_1 = __webpack_require__(3661);
|
|
|
const weakMeasurementRegExp = new WeakMap();
|
|
|
function exec(string) {
|
|
|
return config.mode === "spec-compliant"
|
|
|
? execSpecCompliant(this, string)
|
|
|
: execLazy(this, string);
|
|
|
}
|
|
|
function execLazy(regexp, string) {
|
|
|
const index = regexp.lastIndex;
|
|
|
const result = nativeExec.call(regexp, string);
|
|
|
if (result === null)
|
|
|
return null;
|
|
|
// For performance reasons, we defer computing the indices until later. This isn't spec compliant,
|
|
|
// but once we compute the indices we convert the result to a data-property.
|
|
|
let indicesArray;
|
|
|
Object.defineProperty(result, "indices", {
|
|
|
enumerable: true,
|
|
|
configurable: true,
|
|
|
get() {
|
|
|
if (indicesArray === undefined) {
|
|
|
const { measurementRegExp, groupInfos } = getMeasurementRegExp(regexp);
|
|
|
measurementRegExp.lastIndex = index;
|
|
|
const measuredResult = nativeExec.call(measurementRegExp, string);
|
|
|
if (measuredResult === null)
|
|
|
throw new TypeError();
|
|
|
makeDataProperty(result, "indices", indicesArray = makeIndicesArray(measuredResult, groupInfos));
|
|
|
}
|
|
|
return indicesArray;
|
|
|
},
|
|
|
set(value) {
|
|
|
makeDataProperty(result, "indices", value);
|
|
|
}
|
|
|
});
|
|
|
return result;
|
|
|
}
|
|
|
function execSpecCompliant(regexp, string) {
|
|
|
const { measurementRegExp, groupInfos } = getMeasurementRegExp(regexp);
|
|
|
measurementRegExp.lastIndex = regexp.lastIndex;
|
|
|
const measuredResult = nativeExec.call(measurementRegExp, string);
|
|
|
if (measuredResult === null)
|
|
|
return null;
|
|
|
regexp.lastIndex = measurementRegExp.lastIndex;
|
|
|
const result = [];
|
|
|
makeDataProperty(result, 0, measuredResult[0]);
|
|
|
for (const groupInfo of groupInfos) {
|
|
|
makeDataProperty(result, groupInfo.oldGroupNumber, measuredResult[groupInfo.newGroupNumber]);
|
|
|
}
|
|
|
makeDataProperty(result, "index", measuredResult.index);
|
|
|
makeDataProperty(result, "input", measuredResult.input);
|
|
|
makeDataProperty(result, "groups", measuredResult.groups);
|
|
|
makeDataProperty(result, "indices", makeIndicesArray(measuredResult, groupInfos));
|
|
|
return result;
|
|
|
}
|
|
|
function getMeasurementRegExp(regexp) {
|
|
|
let transformed = weakMeasurementRegExp.get(regexp);
|
|
|
if (!transformed) {
|
|
|
transformed = transformMeasurementGroups(regexp_tree_1.parse(`/${regexp.source}/${regexp.flags}`));
|
|
|
weakMeasurementRegExp.set(regexp, transformed);
|
|
|
}
|
|
|
const groupInfos = transformed.getExtra();
|
|
|
const measurementRegExp = transformed.toRegExp();
|
|
|
return { measurementRegExp, groupInfos };
|
|
|
}
|
|
|
function makeIndicesArray(measuredResult, groupInfos) {
|
|
|
const matchStart = measuredResult.index;
|
|
|
const matchEnd = matchStart + measuredResult[0].length;
|
|
|
const hasGroups = !!measuredResult.groups;
|
|
|
const indicesArray = [];
|
|
|
const groups = hasGroups ? Object.create(null) : undefined;
|
|
|
makeDataProperty(indicesArray, 0, [matchStart, matchEnd]);
|
|
|
for (const groupInfo of groupInfos) {
|
|
|
let indices;
|
|
|
if (measuredResult[groupInfo.newGroupNumber] !== undefined) {
|
|
|
let startIndex = matchStart;
|
|
|
if (groupInfo.measurementGroups) {
|
|
|
for (const measurementGroup of groupInfo.measurementGroups) {
|
|
|
startIndex += measuredResult[measurementGroup].length;
|
|
|
}
|
|
|
}
|
|
|
const endIndex = startIndex + measuredResult[groupInfo.newGroupNumber].length;
|
|
|
indices = [startIndex, endIndex];
|
|
|
}
|
|
|
makeDataProperty(indicesArray, groupInfo.oldGroupNumber, indices);
|
|
|
if (groups && groupInfo.groupName !== undefined) {
|
|
|
makeDataProperty(groups, groupInfo.groupName, indices);
|
|
|
}
|
|
|
}
|
|
|
makeDataProperty(indicesArray, "groups", groups);
|
|
|
return indicesArray;
|
|
|
}
|
|
|
function makeDataProperty(result, key, value) {
|
|
|
const existingDesc = Object.getOwnPropertyDescriptor(result, key);
|
|
|
if (existingDesc ? existingDesc.configurable : Object.isExtensible(result)) {
|
|
|
const newDesc = {
|
|
|
enumerable: existingDesc ? existingDesc.enumerable : true,
|
|
|
configurable: existingDesc ? existingDesc.configurable : true,
|
|
|
writable: true,
|
|
|
value
|
|
|
};
|
|
|
Object.defineProperty(result, key, newDesc);
|
|
|
}
|
|
|
}
|
|
|
let groupRenumbers;
|
|
|
let hasBackreferences = false;
|
|
|
let nodesContainingCapturingGroup = new Set();
|
|
|
let containsCapturingGroupStack = [];
|
|
|
let containsCapturingGroup = false;
|
|
|
let nextNewGroupNumber = 1;
|
|
|
let measurementGroupStack = [];
|
|
|
let measurementGroupsForGroup = new Map();
|
|
|
let newGroupNumberForGroup = new Map();
|
|
|
const handlers = {
|
|
|
init() {
|
|
|
hasBackreferences = false;
|
|
|
nodesContainingCapturingGroup.clear();
|
|
|
containsCapturingGroupStack.length = 0;
|
|
|
containsCapturingGroup = false;
|
|
|
nextNewGroupNumber = 1;
|
|
|
measurementGroupStack.length = 0;
|
|
|
measurementGroupsForGroup.clear();
|
|
|
newGroupNumberForGroup.clear();
|
|
|
groupRenumbers = [];
|
|
|
},
|
|
|
RegExp(path) {
|
|
|
regexp_tree_1.traverse(path.node, visitor);
|
|
|
if (nodesContainingCapturingGroup.size > 0) {
|
|
|
regexp_tree_1.transform(path.node, builder);
|
|
|
regexp_tree_1.transform(path.node, groupRenumberer);
|
|
|
if (hasBackreferences) {
|
|
|
regexp_tree_1.transform(path.node, backreferenceRenumberer);
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
};
|
|
|
const nodeCallbacks = {
|
|
|
pre(path) {
|
|
|
containsCapturingGroupStack.push(containsCapturingGroup);
|
|
|
containsCapturingGroup = path.node.type === "Group" && path.node.capturing;
|
|
|
},
|
|
|
post(path) {
|
|
|
if (containsCapturingGroup) {
|
|
|
nodesContainingCapturingGroup.add(path.node);
|
|
|
}
|
|
|
containsCapturingGroup = containsCapturingGroupStack.pop() || containsCapturingGroup;
|
|
|
}
|
|
|
};
|
|
|
const visitor = {
|
|
|
Alternative: nodeCallbacks,
|
|
|
Disjunction: nodeCallbacks,
|
|
|
Assertion: nodeCallbacks,
|
|
|
Group: nodeCallbacks,
|
|
|
Repetition: nodeCallbacks,
|
|
|
Backreference(path) { hasBackreferences = true; }
|
|
|
};
|
|
|
const builder = {
|
|
|
Alternative(path) {
|
|
|
if (nodesContainingCapturingGroup.has(path.node)) {
|
|
|
// aa(b)c -> (aa)(b)c
|
|
|
// aa(b)c(d) -> (aa)(b)(c)(d)
|
|
|
// aa(b)+c(d) -> (aa)((b)+)(c)(d);
|
|
|
let lastMeasurementIndex = 0;
|
|
|
let pendingTerms = [];
|
|
|
const measurementGroups = [];
|
|
|
const terms = [];
|
|
|
for (let i = 0; i < path.node.expressions.length; i++) {
|
|
|
const term = path.node.expressions[i];
|
|
|
if (nodesContainingCapturingGroup.has(term)) {
|
|
|
if (i > lastMeasurementIndex) {
|
|
|
const measurementGroup = {
|
|
|
type: "Group",
|
|
|
capturing: true,
|
|
|
number: -1,
|
|
|
expression: pendingTerms.length > 1 ? { type: "Alternative", expressions: pendingTerms } :
|
|
|
pendingTerms.length === 1 ? pendingTerms[0] :
|
|
|
null
|
|
|
};
|
|
|
terms.push(measurementGroup);
|
|
|
measurementGroups.push(measurementGroup);
|
|
|
lastMeasurementIndex = i;
|
|
|
pendingTerms = [];
|
|
|
}
|
|
|
measurementGroupStack.push(measurementGroups);
|
|
|
regexp_tree_1.transform(term, builder);
|
|
|
measurementGroupStack.pop();
|
|
|
pendingTerms.push(term);
|
|
|
continue;
|
|
|
}
|
|
|
pendingTerms.push(term);
|
|
|
}
|
|
|
path.update({ expressions: terms.concat(pendingTerms) });
|
|
|
}
|
|
|
return false;
|
|
|
},
|
|
|
Group(path) {
|
|
|
if (!path.node.capturing)
|
|
|
return;
|
|
|
measurementGroupsForGroup.set(path.node, getMeasurementGroups());
|
|
|
}
|
|
|
};
|
|
|
const groupRenumberer = {
|
|
|
Group(path) {
|
|
|
if (!groupRenumbers)
|
|
|
throw new Error("Not initialized.");
|
|
|
if (!path.node.capturing)
|
|
|
return;
|
|
|
const oldGroupNumber = path.node.number;
|
|
|
const newGroupNumber = nextNewGroupNumber++;
|
|
|
const measurementGroups = measurementGroupsForGroup.get(path.node);
|
|
|
if (oldGroupNumber !== -1) {
|
|
|
groupRenumbers.push({
|
|
|
oldGroupNumber,
|
|
|
newGroupNumber,
|
|
|
measurementGroups: measurementGroups && measurementGroups.map(group => group.number),
|
|
|
groupName: path.node.name
|
|
|
});
|
|
|
newGroupNumberForGroup.set(oldGroupNumber, newGroupNumber);
|
|
|
}
|
|
|
path.update({ number: newGroupNumber });
|
|
|
}
|
|
|
};
|
|
|
const backreferenceRenumberer = {
|
|
|
Backreference(path) {
|
|
|
const newGroupNumber = newGroupNumberForGroup.get(path.node.number);
|
|
|
if (newGroupNumber) {
|
|
|
if (path.node.kind === "number") {
|
|
|
path.update({
|
|
|
number: newGroupNumber,
|
|
|
reference: newGroupNumber
|
|
|
});
|
|
|
}
|
|
|
else {
|
|
|
path.update({
|
|
|
number: newGroupNumber
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
function getMeasurementGroups() {
|
|
|
const measurementGroups = [];
|
|
|
for (const array of measurementGroupStack) {
|
|
|
for (const item of array) {
|
|
|
measurementGroups.push(item);
|
|
|
}
|
|
|
}
|
|
|
return measurementGroups;
|
|
|
}
|
|
|
function transformMeasurementGroups(ast) {
|
|
|
const result = regexp_tree_1.transform(ast, handlers);
|
|
|
return new regexp_tree_1.TransformResult(result.getAST(), groupRenumbers);
|
|
|
}
|
|
|
module.exports = exec;
|
|
|
//# sourceMappingURL=implementation.js.map
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 32913:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
|
|
|
/*!
|
|
|
Copyright 2019 Ron Buckton
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
you may not use this file except in compliance with the License.
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
See the License for the specific language governing permissions and
|
|
|
limitations under the License.
|
|
|
*/
|
|
|
const implementation = __webpack_require__(90425);
|
|
|
const native = __webpack_require__(55460);
|
|
|
const getPolyfill = __webpack_require__(5565);
|
|
|
const shim = __webpack_require__(37637);
|
|
|
const config = __webpack_require__(93036);
|
|
|
const polyfill = getPolyfill();
|
|
|
function exec(regexp, string) {
|
|
|
return polyfill.call(regexp, string);
|
|
|
}
|
|
|
exec.implementation = implementation;
|
|
|
exec.native = native;
|
|
|
exec.getPolyfill = getPolyfill;
|
|
|
exec.shim = shim;
|
|
|
exec.config = config;
|
|
|
(function (exec) {
|
|
|
})(exec || (exec = {}));
|
|
|
module.exports = exec;
|
|
|
//# sourceMappingURL=index.js.map
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 55460:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
|
|
|
/*!
|
|
|
Copyright 2019 Ron Buckton
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
you may not use this file except in compliance with the License.
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
See the License for the specific language governing permissions and
|
|
|
limitations under the License.
|
|
|
*/
|
|
|
const nativeExec = RegExp.prototype.exec;
|
|
|
module.exports = nativeExec;
|
|
|
//# sourceMappingURL=native.js.map
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 5565:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
|
|
|
/*!
|
|
|
Copyright 2019 Ron Buckton
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
you may not use this file except in compliance with the License.
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
See the License for the specific language governing permissions and
|
|
|
limitations under the License.
|
|
|
*/
|
|
|
/*
|
|
|
require('foo').getPolyfill or require('foo/polyfill') is a function that when invoked, will return
|
|
|
the most compliant and performant function that it can - if a native version is available, and does
|
|
|
not violate the spec, then the native function will be returned - otherwise, either the implementation,
|
|
|
or a custom, wrapped version of the native function, will be returned. This is also the result that
|
|
|
will be used as the default export.
|
|
|
*/
|
|
|
const nativeExec = __webpack_require__(55460);
|
|
|
const implementation = __webpack_require__(90425);
|
|
|
function getPolyfill() {
|
|
|
const re = new RegExp("a");
|
|
|
const match = nativeExec.call(re, "a");
|
|
|
if (match.indices) {
|
|
|
return nativeExec;
|
|
|
}
|
|
|
return implementation;
|
|
|
}
|
|
|
module.exports = getPolyfill;
|
|
|
//# sourceMappingURL=polyfill.js.map
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 37637:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
|
|
|
/*!
|
|
|
Copyright 2019 Ron Buckton
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
you may not use this file except in compliance with the License.
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
See the License for the specific language governing permissions and
|
|
|
limitations under the License.
|
|
|
*/
|
|
|
/*
|
|
|
require('foo').shim or require('foo/shim') is a function that when invoked, will call getPolyfill,
|
|
|
and if the polyfill doesn’t match the built-in value, will install it into the global environment.
|
|
|
*/
|
|
|
const getPolyfill = __webpack_require__(5565);
|
|
|
function shim() {
|
|
|
const polyfill = getPolyfill();
|
|
|
if (RegExp.prototype.exec !== polyfill) {
|
|
|
RegExp.prototype.exec = polyfill;
|
|
|
}
|
|
|
}
|
|
|
module.exports = shim;
|
|
|
//# sourceMappingURL=shim.js.map
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 47921:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var compatTransforms = __webpack_require__(24845);
|
|
|
var _transform = __webpack_require__(42113);
|
|
|
|
|
|
module.exports = {
|
|
|
/**
|
|
|
* Translates a regexp in new syntax to equivalent regexp in old syntax.
|
|
|
*
|
|
|
* @param string|RegExp|AST - regexp
|
|
|
* @param Array transformsWhitelist - names of the transforms to apply
|
|
|
*/
|
|
|
transform: function transform(regexp) {
|
|
|
var transformsWhitelist = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
|
|
|
|
var transformToApply = transformsWhitelist.length > 0 ? transformsWhitelist : Object.keys(compatTransforms);
|
|
|
|
|
|
var result = void 0;
|
|
|
|
|
|
// Collect extra data per transform.
|
|
|
var extra = {};
|
|
|
|
|
|
transformToApply.forEach(function (transformName) {
|
|
|
|
|
|
if (!compatTransforms.hasOwnProperty(transformName)) {
|
|
|
throw new Error('Unknown compat-transform: ' + transformName + '. ' + 'Available transforms are: ' + Object.keys(compatTransforms).join(', '));
|
|
|
}
|
|
|
|
|
|
var handler = compatTransforms[transformName];
|
|
|
|
|
|
result = _transform.transform(regexp, handler);
|
|
|
regexp = result.getAST();
|
|
|
|
|
|
// Collect `extra` transform result.
|
|
|
if (typeof handler.getExtra === 'function') {
|
|
|
extra[transformName] = handler.getExtra();
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// Set the final extras for all transforms.
|
|
|
result.setExtra(extra);
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 3561:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* The `RegExpTree` class provides runtime support for `compat-transpiler`
|
|
|
* module from `regexp-tree`.
|
|
|
*
|
|
|
* E.g. it tracks names of the capturing groups, in order to access the
|
|
|
* names on the matched result.
|
|
|
*
|
|
|
* It's a thin-wrapper on top of original regexp.
|
|
|
*/
|
|
|
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
var RegExpTree = function () {
|
|
|
/**
|
|
|
* Initializes a `RegExpTree` instance.
|
|
|
*
|
|
|
* @param RegExp - a regular expression
|
|
|
*
|
|
|
* @param Object state:
|
|
|
*
|
|
|
* An extra state which may store any related to transformation
|
|
|
* data, for example, names of the groups.
|
|
|
*
|
|
|
* - flags - original flags
|
|
|
* - groups - names of the groups, and their indices
|
|
|
* - source - original source
|
|
|
*/
|
|
|
function RegExpTree(re, _ref) {
|
|
|
var flags = _ref.flags,
|
|
|
groups = _ref.groups,
|
|
|
source = _ref.source;
|
|
|
|
|
|
_classCallCheck(this, RegExpTree);
|
|
|
|
|
|
this._re = re;
|
|
|
this._groups = groups;
|
|
|
|
|
|
// Original props.
|
|
|
this.flags = flags;
|
|
|
this.source = source || re.source;
|
|
|
this.dotAll = flags.includes('s');
|
|
|
|
|
|
// Inherited directly from `re`.
|
|
|
this.global = re.global;
|
|
|
this.ignoreCase = re.ignoreCase;
|
|
|
this.multiline = re.multiline;
|
|
|
this.sticky = re.sticky;
|
|
|
this.unicode = re.unicode;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Facade wrapper for RegExp `test` method.
|
|
|
*/
|
|
|
|
|
|
|
|
|
_createClass(RegExpTree, [{
|
|
|
key: 'test',
|
|
|
value: function test(string) {
|
|
|
return this._re.test(string);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Facade wrapper for RegExp `compile` method.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'compile',
|
|
|
value: function compile(string) {
|
|
|
return this._re.compile(string);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Facade wrapper for RegExp `toString` method.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'toString',
|
|
|
value: function toString() {
|
|
|
if (!this._toStringResult) {
|
|
|
this._toStringResult = '/' + this.source + '/' + this.flags;
|
|
|
}
|
|
|
return this._toStringResult;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Facade wrapper for RegExp `exec` method.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'exec',
|
|
|
value: function exec(string) {
|
|
|
var result = this._re.exec(string);
|
|
|
|
|
|
if (!this._groups || !result) {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
result.groups = {};
|
|
|
|
|
|
for (var group in this._groups) {
|
|
|
var groupNumber = this._groups[group];
|
|
|
result.groups[group] = result[groupNumber];
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return RegExpTree;
|
|
|
}();
|
|
|
|
|
|
module.exports = {
|
|
|
RegExpTree: RegExpTree
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 11895:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to translate `/./s` to `/[\0-\uFFFF]/`.
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
|
// Whether `u` flag present. In which case we transform to
|
|
|
// \u{10FFFF} instead of \uFFFF.
|
|
|
_hasUFlag: false,
|
|
|
|
|
|
// Only run this plugin if we have `s` flag.
|
|
|
shouldRun: function shouldRun(ast) {
|
|
|
var shouldRun = ast.flags.includes('s');
|
|
|
|
|
|
if (!shouldRun) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// Strip the `s` flag.
|
|
|
ast.flags = ast.flags.replace('s', '');
|
|
|
|
|
|
// Whether we have also `u`.
|
|
|
this._hasUFlag = ast.flags.includes('u');
|
|
|
|
|
|
return true;
|
|
|
},
|
|
|
Char: function Char(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (node.kind !== 'meta' || node.value !== '.') {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var toValue = '\\uFFFF';
|
|
|
var toSymbol = '\uFFFF';
|
|
|
|
|
|
if (this._hasUFlag) {
|
|
|
toValue = '\\u{10FFFF}';
|
|
|
toSymbol = '\uDBFF\uDFFF';
|
|
|
}
|
|
|
|
|
|
path.replace({
|
|
|
type: 'CharacterClass',
|
|
|
expressions: [{
|
|
|
type: 'ClassRange',
|
|
|
from: {
|
|
|
type: 'Char',
|
|
|
value: '\\0',
|
|
|
kind: 'decimal',
|
|
|
symbol: '\0'
|
|
|
},
|
|
|
to: {
|
|
|
type: 'Char',
|
|
|
value: toValue,
|
|
|
kind: 'unicode',
|
|
|
symbol: toSymbol
|
|
|
}
|
|
|
}]
|
|
|
});
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 20466:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to translate `/(?<name>a)\k<name>/` to `/(a)\1/`.
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
// To track the names of the groups, and return them
|
|
|
// in the transform result state.
|
|
|
//
|
|
|
// A map from name to number: {foo: 2, bar: 4}
|
|
|
_groupNames: {},
|
|
|
|
|
|
/**
|
|
|
* Initialises the trasnform.
|
|
|
*/
|
|
|
init: function init() {
|
|
|
this._groupNames = {};
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Returns extra state, which eventually is returned to
|
|
|
*/
|
|
|
getExtra: function getExtra() {
|
|
|
return this._groupNames;
|
|
|
},
|
|
|
Group: function Group(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (!node.name) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// Record group name.
|
|
|
this._groupNames[node.name] = node.number;
|
|
|
|
|
|
delete node.name;
|
|
|
delete node.nameRaw;
|
|
|
},
|
|
|
Backreference: function Backreference(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (node.kind !== 'name') {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
node.kind = 'number';
|
|
|
node.reference = node.number;
|
|
|
delete node.referenceRaw;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 62080:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to remove `x` flag `/foo/x` to `/foo/`.
|
|
|
*
|
|
|
* Note: other features of `x` flags (whitespace, comments) are
|
|
|
* already removed at parsing stage.
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
RegExp: function RegExp(_ref) {
|
|
|
var node = _ref.node;
|
|
|
|
|
|
if (node.flags.includes('x')) {
|
|
|
node.flags = node.flags.replace('x', '');
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 24845:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
// "dotAll" `s` flag
|
|
|
dotAll: __webpack_require__(11895),
|
|
|
|
|
|
// Named capturing groups.
|
|
|
namedCapturingGroups: __webpack_require__(20466),
|
|
|
|
|
|
// `x` flag
|
|
|
xFlag: __webpack_require__(62080)
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 44340:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Helper `gen` function calls node type handler.
|
|
|
*/
|
|
|
|
|
|
function gen(node) {
|
|
|
return node ? generator[node.type](node) : '';
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* AST handler.
|
|
|
*/
|
|
|
var generator = {
|
|
|
RegExp: function RegExp(node) {
|
|
|
return '/' + gen(node.body) + '/' + node.flags;
|
|
|
},
|
|
|
Alternative: function Alternative(node) {
|
|
|
return (node.expressions || []).map(gen).join('');
|
|
|
},
|
|
|
Disjunction: function Disjunction(node) {
|
|
|
return gen(node.left) + '|' + gen(node.right);
|
|
|
},
|
|
|
Group: function Group(node) {
|
|
|
var expression = gen(node.expression);
|
|
|
|
|
|
if (node.capturing) {
|
|
|
// A named group.
|
|
|
if (node.name) {
|
|
|
return '(?<' + (node.nameRaw || node.name) + '>' + expression + ')';
|
|
|
}
|
|
|
|
|
|
return '(' + expression + ')';
|
|
|
}
|
|
|
|
|
|
return '(?:' + expression + ')';
|
|
|
},
|
|
|
Backreference: function Backreference(node) {
|
|
|
switch (node.kind) {
|
|
|
case 'number':
|
|
|
return '\\' + node.reference;
|
|
|
case 'name':
|
|
|
return '\\k<' + (node.referenceRaw || node.reference) + '>';
|
|
|
default:
|
|
|
throw new TypeError('Unknown Backreference kind: ' + node.kind);
|
|
|
}
|
|
|
},
|
|
|
Assertion: function Assertion(node) {
|
|
|
switch (node.kind) {
|
|
|
case '^':
|
|
|
case '$':
|
|
|
case '\\b':
|
|
|
case '\\B':
|
|
|
return node.kind;
|
|
|
|
|
|
case 'Lookahead':
|
|
|
{
|
|
|
var assertion = gen(node.assertion);
|
|
|
|
|
|
if (node.negative) {
|
|
|
return '(?!' + assertion + ')';
|
|
|
}
|
|
|
|
|
|
return '(?=' + assertion + ')';
|
|
|
}
|
|
|
|
|
|
case 'Lookbehind':
|
|
|
{
|
|
|
var _assertion = gen(node.assertion);
|
|
|
|
|
|
if (node.negative) {
|
|
|
return '(?<!' + _assertion + ')';
|
|
|
}
|
|
|
|
|
|
return '(?<=' + _assertion + ')';
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
throw new TypeError('Unknown Assertion kind: ' + node.kind);
|
|
|
}
|
|
|
},
|
|
|
CharacterClass: function CharacterClass(node) {
|
|
|
var expressions = node.expressions.map(gen).join('');
|
|
|
|
|
|
if (node.negative) {
|
|
|
return '[^' + expressions + ']';
|
|
|
}
|
|
|
|
|
|
return '[' + expressions + ']';
|
|
|
},
|
|
|
ClassRange: function ClassRange(node) {
|
|
|
return gen(node.from) + '-' + gen(node.to);
|
|
|
},
|
|
|
Repetition: function Repetition(node) {
|
|
|
return '' + gen(node.expression) + gen(node.quantifier);
|
|
|
},
|
|
|
Quantifier: function Quantifier(node) {
|
|
|
var quantifier = void 0;
|
|
|
var greedy = node.greedy ? '' : '?';
|
|
|
|
|
|
switch (node.kind) {
|
|
|
case '+':
|
|
|
case '?':
|
|
|
case '*':
|
|
|
quantifier = node.kind;
|
|
|
break;
|
|
|
case 'Range':
|
|
|
// Exact: {1}
|
|
|
if (node.from === node.to) {
|
|
|
quantifier = '{' + node.from + '}';
|
|
|
}
|
|
|
// Open: {1,}
|
|
|
else if (!node.to) {
|
|
|
quantifier = '{' + node.from + ',}';
|
|
|
}
|
|
|
// Closed: {1,3}
|
|
|
else {
|
|
|
quantifier = '{' + node.from + ',' + node.to + '}';
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
|
throw new TypeError('Unknown Quantifier kind: ' + node.kind);
|
|
|
}
|
|
|
|
|
|
return '' + quantifier + greedy;
|
|
|
},
|
|
|
Char: function Char(node) {
|
|
|
var value = node.value;
|
|
|
|
|
|
switch (node.kind) {
|
|
|
case 'simple':
|
|
|
{
|
|
|
if (node.escaped) {
|
|
|
return '\\' + value;
|
|
|
}
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
case 'hex':
|
|
|
case 'unicode':
|
|
|
case 'oct':
|
|
|
case 'decimal':
|
|
|
case 'control':
|
|
|
case 'meta':
|
|
|
return value;
|
|
|
|
|
|
default:
|
|
|
throw new TypeError('Unknown Char kind: ' + node.kind);
|
|
|
}
|
|
|
},
|
|
|
UnicodeProperty: function UnicodeProperty(node) {
|
|
|
var escapeChar = node.negative ? 'P' : 'p';
|
|
|
var namePart = void 0;
|
|
|
|
|
|
if (!node.shorthand && !node.binary) {
|
|
|
namePart = node.name + '=';
|
|
|
} else {
|
|
|
namePart = '';
|
|
|
}
|
|
|
|
|
|
return '\\' + escapeChar + '{' + namePart + node.value + '}';
|
|
|
}
|
|
|
};
|
|
|
|
|
|
module.exports = {
|
|
|
/**
|
|
|
* Generates a regexp string from an AST.
|
|
|
*
|
|
|
* @param Object ast - an AST node
|
|
|
*/
|
|
|
generate: gen
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 37791:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
// DFA minization.
|
|
|
|
|
|
/**
|
|
|
* Map from state to current set it goes.
|
|
|
*/
|
|
|
|
|
|
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
|
|
|
|
|
|
function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }
|
|
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
|
|
var currentTransitionMap = null;
|
|
|
|
|
|
/**
|
|
|
* Takes a DFA, and returns a minimized version of it
|
|
|
* compressing some states to groups (using standard, 0-, 1-,
|
|
|
* 2-, ... N-equivalence algorithm).
|
|
|
*/
|
|
|
function minimize(dfa) {
|
|
|
var table = dfa.getTransitionTable();
|
|
|
var allStates = Object.keys(table);
|
|
|
var alphabet = dfa.getAlphabet();
|
|
|
var accepting = dfa.getAcceptingStateNumbers();
|
|
|
|
|
|
currentTransitionMap = {};
|
|
|
|
|
|
var nonAccepting = new Set();
|
|
|
|
|
|
allStates.forEach(function (state) {
|
|
|
state = Number(state);
|
|
|
var isAccepting = accepting.has(state);
|
|
|
|
|
|
if (isAccepting) {
|
|
|
currentTransitionMap[state] = accepting;
|
|
|
} else {
|
|
|
nonAccepting.add(state);
|
|
|
currentTransitionMap[state] = nonAccepting;
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
// Step 1: build equivalent sets.
|
|
|
|
|
|
// All [1..N] equivalent sets.
|
|
|
var all = [
|
|
|
// 0-equivalent sets.
|
|
|
[nonAccepting, accepting].filter(function (set) {
|
|
|
return set.size > 0;
|
|
|
})];
|
|
|
|
|
|
var current = void 0;
|
|
|
var previous = void 0;
|
|
|
|
|
|
// Top of the stack is the current list of sets to analyze.
|
|
|
current = all[all.length - 1];
|
|
|
|
|
|
// Previous set (to check whether we need to stop).
|
|
|
previous = all[all.length - 2];
|
|
|
|
|
|
// Until we'll not have the same N and N-1 equivalent rows.
|
|
|
|
|
|
var _loop = function _loop() {
|
|
|
var newTransitionMap = {};
|
|
|
|
|
|
var _iteratorNormalCompletion3 = true;
|
|
|
var _didIteratorError3 = false;
|
|
|
var _iteratorError3 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator3 = current[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
|
|
var _set = _step3.value;
|
|
|
|
|
|
// Handled states for this set.
|
|
|
var handledStates = {};
|
|
|
|
|
|
var _set2 = _toArray(_set),
|
|
|
first = _set2[0],
|
|
|
rest = _set2.slice(1);
|
|
|
|
|
|
handledStates[first] = new Set([first]);
|
|
|
|
|
|
// Have to compare each from the rest states with
|
|
|
// the already handled states, and see if they are equivalent.
|
|
|
var _iteratorNormalCompletion4 = true;
|
|
|
var _didIteratorError4 = false;
|
|
|
var _iteratorError4 = undefined;
|
|
|
|
|
|
try {
|
|
|
restSets: for (var _iterator4 = rest[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
|
|
var state = _step4.value;
|
|
|
var _iteratorNormalCompletion5 = true;
|
|
|
var _didIteratorError5 = false;
|
|
|
var _iteratorError5 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator5 = Object.keys(handledStates)[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
|
|
|
var handledState = _step5.value;
|
|
|
|
|
|
// This and some previously handled state are equivalent --
|
|
|
// just append this state to the same set.
|
|
|
if (areEquivalent(state, handledState, table, alphabet)) {
|
|
|
handledStates[handledState].add(state);
|
|
|
handledStates[state] = handledStates[handledState];
|
|
|
continue restSets;
|
|
|
}
|
|
|
}
|
|
|
// Else, this state is not equivalent to any of the
|
|
|
// handled states -- allocate a new set for it.
|
|
|
} catch (err) {
|
|
|
_didIteratorError5 = true;
|
|
|
_iteratorError5 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion5 && _iterator5.return) {
|
|
|
_iterator5.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError5) {
|
|
|
throw _iteratorError5;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
handledStates[state] = new Set([state]);
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError4 = true;
|
|
|
_iteratorError4 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion4 && _iterator4.return) {
|
|
|
_iterator4.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError4) {
|
|
|
throw _iteratorError4;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Add these handled states to all states map.
|
|
|
|
|
|
|
|
|
Object.assign(newTransitionMap, handledStates);
|
|
|
}
|
|
|
|
|
|
// Update current transition map for the handled row.
|
|
|
} catch (err) {
|
|
|
_didIteratorError3 = true;
|
|
|
_iteratorError3 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion3 && _iterator3.return) {
|
|
|
_iterator3.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError3) {
|
|
|
throw _iteratorError3;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
currentTransitionMap = newTransitionMap;
|
|
|
|
|
|
var newSets = new Set(Object.keys(newTransitionMap).map(function (state) {
|
|
|
return newTransitionMap[state];
|
|
|
}));
|
|
|
|
|
|
all.push([].concat(_toConsumableArray(newSets)));
|
|
|
|
|
|
// Top of the stack is the current.
|
|
|
current = all[all.length - 1];
|
|
|
|
|
|
// Previous set.
|
|
|
previous = all[all.length - 2];
|
|
|
};
|
|
|
|
|
|
while (!sameRow(current, previous)) {
|
|
|
_loop();
|
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
// Step 2: build minimized table from the equivalent sets.
|
|
|
|
|
|
// Remap state numbers from sets to index-based.
|
|
|
var remaped = new Map();
|
|
|
var idx = 1;
|
|
|
current.forEach(function (set) {
|
|
|
return remaped.set(set, idx++);
|
|
|
});
|
|
|
|
|
|
// Build the minimized table from the calculated equivalent sets.
|
|
|
var minimizedTable = {};
|
|
|
|
|
|
var minimizedAcceptingStates = new Set();
|
|
|
|
|
|
var updateAcceptingStates = function updateAcceptingStates(set, idx) {
|
|
|
var _iteratorNormalCompletion = true;
|
|
|
var _didIteratorError = false;
|
|
|
var _iteratorError = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator = set[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
|
var state = _step.value;
|
|
|
|
|
|
if (accepting.has(state)) {
|
|
|
minimizedAcceptingStates.add(idx);
|
|
|
}
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError = true;
|
|
|
_iteratorError = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion && _iterator.return) {
|
|
|
_iterator.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError) {
|
|
|
throw _iteratorError;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
var _iteratorNormalCompletion2 = true;
|
|
|
var _didIteratorError2 = false;
|
|
|
var _iteratorError2 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator2 = remaped.entries()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
|
var _ref = _step2.value;
|
|
|
|
|
|
var _ref2 = _slicedToArray(_ref, 2);
|
|
|
|
|
|
var set = _ref2[0];
|
|
|
var _idx = _ref2[1];
|
|
|
|
|
|
minimizedTable[_idx] = {};
|
|
|
var _iteratorNormalCompletion6 = true;
|
|
|
var _didIteratorError6 = false;
|
|
|
var _iteratorError6 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator6 = alphabet[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
|
|
|
var symbol = _step6.value;
|
|
|
|
|
|
updateAcceptingStates(set, _idx);
|
|
|
|
|
|
// Determine original transition for this symbol from the set.
|
|
|
var originalTransition = void 0;
|
|
|
var _iteratorNormalCompletion7 = true;
|
|
|
var _didIteratorError7 = false;
|
|
|
var _iteratorError7 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator7 = set[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
|
|
|
var originalState = _step7.value;
|
|
|
|
|
|
originalTransition = table[originalState][symbol];
|
|
|
if (originalTransition) {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError7 = true;
|
|
|
_iteratorError7 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion7 && _iterator7.return) {
|
|
|
_iterator7.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError7) {
|
|
|
throw _iteratorError7;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (originalTransition) {
|
|
|
minimizedTable[_idx][symbol] = remaped.get(currentTransitionMap[originalTransition]);
|
|
|
}
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError6 = true;
|
|
|
_iteratorError6 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion6 && _iterator6.return) {
|
|
|
_iterator6.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError6) {
|
|
|
throw _iteratorError6;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Update the table, and accepting states on the original DFA.
|
|
|
} catch (err) {
|
|
|
_didIteratorError2 = true;
|
|
|
_iteratorError2 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
|
|
_iterator2.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError2) {
|
|
|
throw _iteratorError2;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
dfa.setTransitionTable(minimizedTable);
|
|
|
dfa.setAcceptingStateNumbers(minimizedAcceptingStates);
|
|
|
|
|
|
return dfa;
|
|
|
}
|
|
|
|
|
|
function sameRow(r1, r2) {
|
|
|
if (!r2) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (r1.length !== r2.length) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
for (var i = 0; i < r1.length; i++) {
|
|
|
var s1 = r1[i];
|
|
|
var s2 = r2[i];
|
|
|
|
|
|
if (s1.size !== s2.size) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if ([].concat(_toConsumableArray(s1)).sort().join(',') !== [].concat(_toConsumableArray(s2)).sort().join(',')) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Checks whether two states are N-equivalent, i.e. whether they go
|
|
|
* to the same set on a symbol.
|
|
|
*/
|
|
|
function areEquivalent(s1, s2, table, alphabet) {
|
|
|
var _iteratorNormalCompletion8 = true;
|
|
|
var _didIteratorError8 = false;
|
|
|
var _iteratorError8 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator8 = alphabet[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
|
|
|
var symbol = _step8.value;
|
|
|
|
|
|
if (!goToSameSet(s1, s2, table, symbol)) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError8 = true;
|
|
|
_iteratorError8 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion8 && _iterator8.return) {
|
|
|
_iterator8.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError8) {
|
|
|
throw _iteratorError8;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Checks whether states go to the same set.
|
|
|
*/
|
|
|
function goToSameSet(s1, s2, table, symbol) {
|
|
|
if (!currentTransitionMap[s1] || !currentTransitionMap[s2]) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var originalTransitionS1 = table[s1][symbol];
|
|
|
var originalTransitionS2 = table[s2][symbol];
|
|
|
|
|
|
// If no actual transition on this symbol, treat it as positive.
|
|
|
if (!originalTransitionS1 && !originalTransitionS2) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
// Otherwise, check if they are in the same sets.
|
|
|
return currentTransitionMap[s1].has(originalTransitionS1) && currentTransitionMap[s2].has(originalTransitionS2);
|
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
|
minimize: minimize
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 24210:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
var DFAMinimizer = __webpack_require__(37791);
|
|
|
|
|
|
var _require = __webpack_require__(28200),
|
|
|
EPSILON_CLOSURE = _require.EPSILON_CLOSURE;
|
|
|
|
|
|
/**
|
|
|
* DFA is build by converting from NFA (subset construction).
|
|
|
*/
|
|
|
|
|
|
|
|
|
var DFA = function () {
|
|
|
function DFA(nfa) {
|
|
|
_classCallCheck(this, DFA);
|
|
|
|
|
|
this._nfa = nfa;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Minimizes DFA.
|
|
|
*/
|
|
|
|
|
|
|
|
|
_createClass(DFA, [{
|
|
|
key: 'minimize',
|
|
|
value: function minimize() {
|
|
|
this.getTransitionTable();
|
|
|
|
|
|
this._originalAcceptingStateNumbers = this._acceptingStateNumbers;
|
|
|
this._originalTransitionTable = this._transitionTable;
|
|
|
|
|
|
DFAMinimizer.minimize(this);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns alphabet for this DFA.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getAlphabet',
|
|
|
value: function getAlphabet() {
|
|
|
return this._nfa.getAlphabet();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns accepting states.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getAcceptingStateNumbers',
|
|
|
value: function getAcceptingStateNumbers() {
|
|
|
if (!this._acceptingStateNumbers) {
|
|
|
// Accepting states are determined during table construction.
|
|
|
this.getTransitionTable();
|
|
|
}
|
|
|
|
|
|
return this._acceptingStateNumbers;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns original accepting states.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getOriginaAcceptingStateNumbers',
|
|
|
value: function getOriginaAcceptingStateNumbers() {
|
|
|
if (!this._originalAcceptingStateNumbers) {
|
|
|
// Accepting states are determined during table construction.
|
|
|
this.getTransitionTable();
|
|
|
}
|
|
|
|
|
|
return this._originalAcceptingStateNumbers;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Sets transition table.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'setTransitionTable',
|
|
|
value: function setTransitionTable(table) {
|
|
|
this._transitionTable = table;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Sets accepting states.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'setAcceptingStateNumbers',
|
|
|
value: function setAcceptingStateNumbers(stateNumbers) {
|
|
|
this._acceptingStateNumbers = stateNumbers;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* DFA transition table is built from NFA table.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getTransitionTable',
|
|
|
value: function getTransitionTable() {
|
|
|
var _this = this;
|
|
|
|
|
|
if (this._transitionTable) {
|
|
|
return this._transitionTable;
|
|
|
}
|
|
|
|
|
|
// Calculate from NFA transition table.
|
|
|
var nfaTable = this._nfa.getTransitionTable();
|
|
|
var nfaStates = Object.keys(nfaTable);
|
|
|
|
|
|
this._acceptingStateNumbers = new Set();
|
|
|
|
|
|
// Start state of DFA is E(S[nfa])
|
|
|
var startState = nfaTable[nfaStates[0]][EPSILON_CLOSURE];
|
|
|
|
|
|
// Init the worklist (states which should be in the DFA).
|
|
|
var worklist = [startState];
|
|
|
|
|
|
var alphabet = this.getAlphabet();
|
|
|
var nfaAcceptingStates = this._nfa.getAcceptingStateNumbers();
|
|
|
|
|
|
var dfaTable = {};
|
|
|
|
|
|
// Determine whether the combined DFA state is accepting.
|
|
|
var updateAcceptingStates = function updateAcceptingStates(states) {
|
|
|
var _iteratorNormalCompletion = true;
|
|
|
var _didIteratorError = false;
|
|
|
var _iteratorError = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator = nfaAcceptingStates[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
|
var nfaAcceptingState = _step.value;
|
|
|
|
|
|
// If any of the states from NFA is accepting, DFA's
|
|
|
// state is accepting as well.
|
|
|
if (states.indexOf(nfaAcceptingState) !== -1) {
|
|
|
_this._acceptingStateNumbers.add(states.join(','));
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError = true;
|
|
|
_iteratorError = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion && _iterator.return) {
|
|
|
_iterator.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError) {
|
|
|
throw _iteratorError;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
while (worklist.length > 0) {
|
|
|
var states = worklist.shift();
|
|
|
var dfaStateLabel = states.join(',');
|
|
|
dfaTable[dfaStateLabel] = {};
|
|
|
|
|
|
var _iteratorNormalCompletion2 = true;
|
|
|
var _didIteratorError2 = false;
|
|
|
var _iteratorError2 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator2 = alphabet[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
|
var symbol = _step2.value;
|
|
|
|
|
|
var onSymbol = [];
|
|
|
|
|
|
// Determine whether the combined state is accepting.
|
|
|
updateAcceptingStates(states);
|
|
|
|
|
|
var _iteratorNormalCompletion3 = true;
|
|
|
var _didIteratorError3 = false;
|
|
|
var _iteratorError3 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator3 = states[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
|
|
var state = _step3.value;
|
|
|
|
|
|
var nfaStatesOnSymbol = nfaTable[state][symbol];
|
|
|
if (!nfaStatesOnSymbol) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
var _iteratorNormalCompletion4 = true;
|
|
|
var _didIteratorError4 = false;
|
|
|
var _iteratorError4 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator4 = nfaStatesOnSymbol[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
|
|
var nfaStateOnSymbol = _step4.value;
|
|
|
|
|
|
if (!nfaTable[nfaStateOnSymbol]) {
|
|
|
continue;
|
|
|
}
|
|
|
onSymbol.push.apply(onSymbol, _toConsumableArray(nfaTable[nfaStateOnSymbol][EPSILON_CLOSURE]));
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError4 = true;
|
|
|
_iteratorError4 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion4 && _iterator4.return) {
|
|
|
_iterator4.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError4) {
|
|
|
throw _iteratorError4;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError3 = true;
|
|
|
_iteratorError3 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion3 && _iterator3.return) {
|
|
|
_iterator3.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError3) {
|
|
|
throw _iteratorError3;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var dfaStatesOnSymbolSet = new Set(onSymbol);
|
|
|
var dfaStatesOnSymbol = [].concat(_toConsumableArray(dfaStatesOnSymbolSet));
|
|
|
|
|
|
if (dfaStatesOnSymbol.length > 0) {
|
|
|
var dfaOnSymbolStr = dfaStatesOnSymbol.join(',');
|
|
|
|
|
|
dfaTable[dfaStateLabel][symbol] = dfaOnSymbolStr;
|
|
|
|
|
|
if (!dfaTable.hasOwnProperty(dfaOnSymbolStr)) {
|
|
|
worklist.unshift(dfaStatesOnSymbol);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError2 = true;
|
|
|
_iteratorError2 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
|
|
_iterator2.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError2) {
|
|
|
throw _iteratorError2;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return this._transitionTable = this._remapStateNumbers(dfaTable);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Remaps state numbers in the resulting table:
|
|
|
* combined states '1,2,3' -> 1, '3,4' -> 2, etc.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: '_remapStateNumbers',
|
|
|
value: function _remapStateNumbers(calculatedDFATable) {
|
|
|
var newStatesMap = {};
|
|
|
|
|
|
this._originalTransitionTable = calculatedDFATable;
|
|
|
var transitionTable = {};
|
|
|
|
|
|
Object.keys(calculatedDFATable).forEach(function (originalNumber, newNumber) {
|
|
|
newStatesMap[originalNumber] = newNumber + 1;
|
|
|
});
|
|
|
|
|
|
for (var originalNumber in calculatedDFATable) {
|
|
|
var originalRow = calculatedDFATable[originalNumber];
|
|
|
var row = {};
|
|
|
|
|
|
for (var symbol in originalRow) {
|
|
|
row[symbol] = newStatesMap[originalRow[symbol]];
|
|
|
}
|
|
|
|
|
|
transitionTable[newStatesMap[originalNumber]] = row;
|
|
|
}
|
|
|
|
|
|
// Remap accepting states.
|
|
|
this._originalAcceptingStateNumbers = this._acceptingStateNumbers;
|
|
|
this._acceptingStateNumbers = new Set();
|
|
|
|
|
|
var _iteratorNormalCompletion5 = true;
|
|
|
var _didIteratorError5 = false;
|
|
|
var _iteratorError5 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator5 = this._originalAcceptingStateNumbers[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
|
|
|
var _originalNumber = _step5.value;
|
|
|
|
|
|
this._acceptingStateNumbers.add(newStatesMap[_originalNumber]);
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError5 = true;
|
|
|
_iteratorError5 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion5 && _iterator5.return) {
|
|
|
_iterator5.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError5) {
|
|
|
throw _iteratorError5;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return transitionTable;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns original DFA table, where state numbers
|
|
|
* are combined numbers from NFA.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getOriginalTransitionTable',
|
|
|
value: function getOriginalTransitionTable() {
|
|
|
if (!this._originalTransitionTable) {
|
|
|
// Original table is determined during table construction.
|
|
|
this.getTransitionTable();
|
|
|
}
|
|
|
return this._originalTransitionTable;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Checks whether this DFA accepts a string.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'matches',
|
|
|
value: function matches(string) {
|
|
|
var state = 1;
|
|
|
var i = 0;
|
|
|
var table = this.getTransitionTable();
|
|
|
|
|
|
while (string[i]) {
|
|
|
state = table[state][string[i++]];
|
|
|
if (!state) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!this.getAcceptingStateNumbers().has(state)) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return DFA;
|
|
|
}();
|
|
|
|
|
|
module.exports = DFA;
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 76186:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var NFA = __webpack_require__(54149);
|
|
|
var DFA = __webpack_require__(24210);
|
|
|
|
|
|
var nfaFromRegExp = __webpack_require__(22388);
|
|
|
var builders = __webpack_require__(32651);
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
|
/**
|
|
|
* Export NFA and DFA classes.
|
|
|
*/
|
|
|
NFA: NFA,
|
|
|
DFA: DFA,
|
|
|
|
|
|
/**
|
|
|
* Expose builders.
|
|
|
*/
|
|
|
builders: builders,
|
|
|
|
|
|
/**
|
|
|
* Builds an NFA for the passed regexp.
|
|
|
*
|
|
|
* @param string | AST | RegExp:
|
|
|
*
|
|
|
* a regular expression in different representations: a string,
|
|
|
* a RegExp object, or an AST.
|
|
|
*/
|
|
|
toNFA: function toNFA(regexp) {
|
|
|
return nfaFromRegExp.build(regexp);
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Builds DFA for the passed regexp.
|
|
|
*
|
|
|
* @param string | AST | RegExp:
|
|
|
*
|
|
|
* a regular expression in different representations: a string,
|
|
|
* a RegExp object, or an AST.
|
|
|
*/
|
|
|
toDFA: function toDFA(regexp) {
|
|
|
return new DFA(this.toNFA(regexp));
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Returns true if regexp accepts the string.
|
|
|
*/
|
|
|
test: function test(regexp, string) {
|
|
|
return this.toDFA(regexp).matches(string);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 32651:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var NFA = __webpack_require__(54149);
|
|
|
var NFAState = __webpack_require__(78679);
|
|
|
|
|
|
var _require = __webpack_require__(28200),
|
|
|
EPSILON = _require.EPSILON;
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
// Char NFA fragment: `c`
|
|
|
|
|
|
/**
|
|
|
* Char factory.
|
|
|
*
|
|
|
* Creates an NFA fragment for a single char.
|
|
|
*
|
|
|
* [in] --c--> [out]
|
|
|
*/
|
|
|
|
|
|
|
|
|
function char(c) {
|
|
|
var inState = new NFAState();
|
|
|
var outState = new NFAState({
|
|
|
accepting: true
|
|
|
});
|
|
|
|
|
|
return new NFA(inState.addTransition(c, outState), outState);
|
|
|
}
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
// Epsilon NFA fragment
|
|
|
|
|
|
/**
|
|
|
* Epsilon factory.
|
|
|
*
|
|
|
* Creates an NFA fragment for ε (recognizes an empty string).
|
|
|
*
|
|
|
* [in] --ε--> [out]
|
|
|
*/
|
|
|
function e() {
|
|
|
return char(EPSILON);
|
|
|
}
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
// Alteration NFA fragment: `abc`
|
|
|
|
|
|
/**
|
|
|
* Creates a connection between two NFA fragments on epsilon transition.
|
|
|
*
|
|
|
* [in-a] --a--> [out-a] --ε--> [in-b] --b--> [out-b]
|
|
|
*/
|
|
|
function altPair(first, second) {
|
|
|
first.out.accepting = false;
|
|
|
second.out.accepting = true;
|
|
|
|
|
|
first.out.addTransition(EPSILON, second.in);
|
|
|
|
|
|
return new NFA(first.in, second.out);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Alteration factory.
|
|
|
*
|
|
|
* Creates a alteration NFA for (at least) two NFA-fragments.
|
|
|
*/
|
|
|
function alt(first) {
|
|
|
for (var _len = arguments.length, fragments = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
|
fragments[_key - 1] = arguments[_key];
|
|
|
}
|
|
|
|
|
|
var _iteratorNormalCompletion = true;
|
|
|
var _didIteratorError = false;
|
|
|
var _iteratorError = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator = fragments[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
|
var fragment = _step.value;
|
|
|
|
|
|
first = altPair(first, fragment);
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError = true;
|
|
|
_iteratorError = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion && _iterator.return) {
|
|
|
_iterator.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError) {
|
|
|
throw _iteratorError;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return first;
|
|
|
}
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
// Disjunction NFA fragment: `a|b`
|
|
|
|
|
|
/**
|
|
|
* Creates a disjunction choice between two fragments.
|
|
|
*/
|
|
|
function orPair(first, second) {
|
|
|
var inState = new NFAState();
|
|
|
var outState = new NFAState();
|
|
|
|
|
|
inState.addTransition(EPSILON, first.in);
|
|
|
inState.addTransition(EPSILON, second.in);
|
|
|
|
|
|
outState.accepting = true;
|
|
|
first.out.accepting = false;
|
|
|
second.out.accepting = false;
|
|
|
|
|
|
first.out.addTransition(EPSILON, outState);
|
|
|
second.out.addTransition(EPSILON, outState);
|
|
|
|
|
|
return new NFA(inState, outState);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Disjunction factory.
|
|
|
*
|
|
|
* Creates a disjunction NFA for (at least) two NFA-fragments.
|
|
|
*/
|
|
|
function or(first) {
|
|
|
for (var _len2 = arguments.length, fragments = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
|
fragments[_key2 - 1] = arguments[_key2];
|
|
|
}
|
|
|
|
|
|
var _iteratorNormalCompletion2 = true;
|
|
|
var _didIteratorError2 = false;
|
|
|
var _iteratorError2 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator2 = fragments[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
|
var fragment = _step2.value;
|
|
|
|
|
|
first = orPair(first, fragment);
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError2 = true;
|
|
|
_iteratorError2 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
|
|
_iterator2.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError2) {
|
|
|
throw _iteratorError2;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return first;
|
|
|
}
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
// Kleene-closure
|
|
|
|
|
|
/**
|
|
|
* Kleene star/closure.
|
|
|
*
|
|
|
* a*
|
|
|
*/
|
|
|
function repExplicit(fragment) {
|
|
|
var inState = new NFAState();
|
|
|
var outState = new NFAState({
|
|
|
accepting: true
|
|
|
});
|
|
|
|
|
|
// 0 or more.
|
|
|
inState.addTransition(EPSILON, fragment.in);
|
|
|
inState.addTransition(EPSILON, outState);
|
|
|
|
|
|
fragment.out.accepting = false;
|
|
|
fragment.out.addTransition(EPSILON, outState);
|
|
|
outState.addTransition(EPSILON, fragment.in);
|
|
|
|
|
|
return new NFA(inState, outState);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Optimized Kleene-star: just adds ε-transitions from
|
|
|
* input to the output, and back.
|
|
|
*/
|
|
|
function rep(fragment) {
|
|
|
fragment.in.addTransition(EPSILON, fragment.out);
|
|
|
fragment.out.addTransition(EPSILON, fragment.in);
|
|
|
return fragment;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Optimized Plus: just adds ε-transitions from
|
|
|
* the output to the input.
|
|
|
*/
|
|
|
function plusRep(fragment) {
|
|
|
fragment.out.addTransition(EPSILON, fragment.in);
|
|
|
return fragment;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Optimized ? repetition: just adds ε-transitions from
|
|
|
* the input to the output.
|
|
|
*/
|
|
|
function questionRep(fragment) {
|
|
|
fragment.in.addTransition(EPSILON, fragment.out);
|
|
|
return fragment;
|
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
|
alt: alt,
|
|
|
char: char,
|
|
|
e: e,
|
|
|
or: or,
|
|
|
rep: rep,
|
|
|
repExplicit: repExplicit,
|
|
|
plusRep: plusRep,
|
|
|
questionRep: questionRep
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 22388:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
|
|
var parser = __webpack_require__(46418);
|
|
|
|
|
|
var _require = __webpack_require__(32651),
|
|
|
alt = _require.alt,
|
|
|
char = _require.char,
|
|
|
or = _require.or,
|
|
|
rep = _require.rep,
|
|
|
plusRep = _require.plusRep,
|
|
|
questionRep = _require.questionRep;
|
|
|
|
|
|
/**
|
|
|
* Helper `gen` function calls node type handler.
|
|
|
*/
|
|
|
|
|
|
|
|
|
function gen(node) {
|
|
|
if (node && !generator[node.type]) {
|
|
|
throw new Error(node.type + ' is not supported in NFA/DFA interpreter.');
|
|
|
}
|
|
|
|
|
|
return node ? generator[node.type](node) : '';
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* AST handler.
|
|
|
*/
|
|
|
var generator = {
|
|
|
RegExp: function RegExp(node) {
|
|
|
if (node.flags !== '') {
|
|
|
throw new Error('NFA/DFA: Flags are not supported yet.');
|
|
|
}
|
|
|
|
|
|
return gen(node.body);
|
|
|
},
|
|
|
Alternative: function Alternative(node) {
|
|
|
var fragments = (node.expressions || []).map(gen);
|
|
|
return alt.apply(undefined, _toConsumableArray(fragments));
|
|
|
},
|
|
|
Disjunction: function Disjunction(node) {
|
|
|
return or(gen(node.left), gen(node.right));
|
|
|
},
|
|
|
Repetition: function Repetition(node) {
|
|
|
switch (node.quantifier.kind) {
|
|
|
case '*':
|
|
|
return rep(gen(node.expression));
|
|
|
case '+':
|
|
|
return plusRep(gen(node.expression));
|
|
|
case '?':
|
|
|
return questionRep(gen(node.expression));
|
|
|
default:
|
|
|
throw new Error('Unknown repeatition: ' + node.quantifier.kind + '.');
|
|
|
}
|
|
|
},
|
|
|
Char: function Char(node) {
|
|
|
if (node.kind !== 'simple') {
|
|
|
throw new Error('NFA/DFA: Only simple chars are supported yet.');
|
|
|
}
|
|
|
|
|
|
return char(node.value);
|
|
|
},
|
|
|
Group: function Group(node) {
|
|
|
return gen(node.expression);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
module.exports = {
|
|
|
/**
|
|
|
* Builds an NFA from the passed regexp.
|
|
|
*/
|
|
|
build: function build(regexp) {
|
|
|
var ast = regexp;
|
|
|
|
|
|
if (regexp instanceof RegExp) {
|
|
|
regexp = '' + regexp;
|
|
|
}
|
|
|
|
|
|
if (typeof regexp === 'string') {
|
|
|
ast = parser.parse(regexp, {
|
|
|
captureLocations: true
|
|
|
});
|
|
|
}
|
|
|
|
|
|
return gen(ast);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 78679:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
|
|
|
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
|
|
|
var State = __webpack_require__(76146);
|
|
|
|
|
|
var _require = __webpack_require__(28200),
|
|
|
EPSILON = _require.EPSILON;
|
|
|
|
|
|
/**
|
|
|
* NFA state.
|
|
|
*
|
|
|
* Allows nondeterministic transitions to several states on the
|
|
|
* same symbol, and also epsilon-transitions.
|
|
|
*/
|
|
|
|
|
|
|
|
|
var NFAState = function (_State) {
|
|
|
_inherits(NFAState, _State);
|
|
|
|
|
|
function NFAState() {
|
|
|
_classCallCheck(this, NFAState);
|
|
|
|
|
|
return _possibleConstructorReturn(this, (NFAState.__proto__ || Object.getPrototypeOf(NFAState)).apply(this, arguments));
|
|
|
}
|
|
|
|
|
|
_createClass(NFAState, [{
|
|
|
key: 'matches',
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Whether this state matches a string.
|
|
|
*
|
|
|
* We maintain set of visited epsilon-states to avoid infinite loops
|
|
|
* when an epsilon-transition goes eventually to itself.
|
|
|
*
|
|
|
* NOTE: this function is rather "educational", since we use DFA for strings
|
|
|
* matching. DFA is built on top of NFA, and uses fast transition table.
|
|
|
*/
|
|
|
value: function matches(string) {
|
|
|
var visited = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Set();
|
|
|
|
|
|
// An epsilon-state has been visited, stop to avoid infinite loop.
|
|
|
if (visited.has(this)) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
visited.add(this);
|
|
|
|
|
|
// No symbols left..
|
|
|
if (string.length === 0) {
|
|
|
// .. and we're in the accepting state.
|
|
|
if (this.accepting) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
// Check if we can reach any accepting state from
|
|
|
// on the epsilon transitions.
|
|
|
var _iteratorNormalCompletion = true;
|
|
|
var _didIteratorError = false;
|
|
|
var _iteratorError = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator = this.getTransitionsOnSymbol(EPSILON)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
|
var nextState = _step.value;
|
|
|
|
|
|
if (nextState.matches('', visited)) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError = true;
|
|
|
_iteratorError = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion && _iterator.return) {
|
|
|
_iterator.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError) {
|
|
|
throw _iteratorError;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// Else, we get some symbols.
|
|
|
var symbol = string[0];
|
|
|
var rest = string.slice(1);
|
|
|
|
|
|
var symbolTransitions = this.getTransitionsOnSymbol(symbol);
|
|
|
var _iteratorNormalCompletion2 = true;
|
|
|
var _didIteratorError2 = false;
|
|
|
var _iteratorError2 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator2 = symbolTransitions[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
|
var _nextState = _step2.value;
|
|
|
|
|
|
if (_nextState.matches(rest)) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// If we couldn't match on symbol, check still epsilon-transitions
|
|
|
// without consuming the symbol (i.e. continue from `string`, not `rest`).
|
|
|
} catch (err) {
|
|
|
_didIteratorError2 = true;
|
|
|
_iteratorError2 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
|
|
_iterator2.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError2) {
|
|
|
throw _iteratorError2;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var _iteratorNormalCompletion3 = true;
|
|
|
var _didIteratorError3 = false;
|
|
|
var _iteratorError3 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator3 = this.getTransitionsOnSymbol(EPSILON)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
|
|
var _nextState2 = _step3.value;
|
|
|
|
|
|
if (_nextState2.matches(string, visited)) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError3 = true;
|
|
|
_iteratorError3 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion3 && _iterator3.return) {
|
|
|
_iterator3.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError3) {
|
|
|
throw _iteratorError3;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns an ε-closure for this state:
|
|
|
* self + all states following ε-transitions.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getEpsilonClosure',
|
|
|
value: function getEpsilonClosure() {
|
|
|
var _this2 = this;
|
|
|
|
|
|
if (!this._epsilonClosure) {
|
|
|
(function () {
|
|
|
var epsilonTransitions = _this2.getTransitionsOnSymbol(EPSILON);
|
|
|
var closure = _this2._epsilonClosure = new Set();
|
|
|
closure.add(_this2);
|
|
|
var _iteratorNormalCompletion4 = true;
|
|
|
var _didIteratorError4 = false;
|
|
|
var _iteratorError4 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator4 = epsilonTransitions[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
|
|
var nextState = _step4.value;
|
|
|
|
|
|
if (!closure.has(nextState)) {
|
|
|
closure.add(nextState);
|
|
|
var nextClosure = nextState.getEpsilonClosure();
|
|
|
nextClosure.forEach(function (state) {
|
|
|
return closure.add(state);
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError4 = true;
|
|
|
_iteratorError4 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion4 && _iterator4.return) {
|
|
|
_iterator4.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError4) {
|
|
|
throw _iteratorError4;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
})();
|
|
|
}
|
|
|
|
|
|
return this._epsilonClosure;
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return NFAState;
|
|
|
}(State);
|
|
|
|
|
|
module.exports = NFAState;
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 54149:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
|
|
|
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
var _require = __webpack_require__(28200),
|
|
|
EPSILON = _require.EPSILON,
|
|
|
EPSILON_CLOSURE = _require.EPSILON_CLOSURE;
|
|
|
|
|
|
/**
|
|
|
* NFA fragment.
|
|
|
*
|
|
|
* NFA sub-fragments can be combined to a larger NFAs building
|
|
|
* the resulting machine. Combining the fragments is done by patching
|
|
|
* edges of the in- and out-states.
|
|
|
*
|
|
|
* 2-states implementation, `in`, and `out`. Eventually all transitions
|
|
|
* go to the same `out`, which can further be connected via ε-transition
|
|
|
* with other fragment.
|
|
|
*/
|
|
|
|
|
|
|
|
|
var NFA = function () {
|
|
|
function NFA(inState, outState) {
|
|
|
_classCallCheck(this, NFA);
|
|
|
|
|
|
this.in = inState;
|
|
|
this.out = outState;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Tries to recognize a string based on this NFA fragment.
|
|
|
*/
|
|
|
|
|
|
|
|
|
_createClass(NFA, [{
|
|
|
key: 'matches',
|
|
|
value: function matches(string) {
|
|
|
return this.in.matches(string);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns an alphabet for this NFA.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getAlphabet',
|
|
|
value: function getAlphabet() {
|
|
|
if (!this._alphabet) {
|
|
|
this._alphabet = new Set();
|
|
|
var table = this.getTransitionTable();
|
|
|
for (var state in table) {
|
|
|
var transitions = table[state];
|
|
|
for (var symbol in transitions) {
|
|
|
if (symbol !== EPSILON_CLOSURE) {
|
|
|
this._alphabet.add(symbol);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return this._alphabet;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns set of accepting states.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getAcceptingStates',
|
|
|
value: function getAcceptingStates() {
|
|
|
if (!this._acceptingStates) {
|
|
|
// States are determined during table construction.
|
|
|
this.getTransitionTable();
|
|
|
}
|
|
|
return this._acceptingStates;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns accepting state numbers.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getAcceptingStateNumbers',
|
|
|
value: function getAcceptingStateNumbers() {
|
|
|
if (!this._acceptingStateNumbers) {
|
|
|
this._acceptingStateNumbers = new Set();
|
|
|
var _iteratorNormalCompletion = true;
|
|
|
var _didIteratorError = false;
|
|
|
var _iteratorError = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator = this.getAcceptingStates()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
|
var acceptingState = _step.value;
|
|
|
|
|
|
this._acceptingStateNumbers.add(acceptingState.number);
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError = true;
|
|
|
_iteratorError = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion && _iterator.return) {
|
|
|
_iterator.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError) {
|
|
|
throw _iteratorError;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return this._acceptingStateNumbers;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Builds and returns transition table.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getTransitionTable',
|
|
|
value: function getTransitionTable() {
|
|
|
var _this = this;
|
|
|
|
|
|
if (!this._transitionTable) {
|
|
|
this._transitionTable = {};
|
|
|
this._acceptingStates = new Set();
|
|
|
|
|
|
var visited = new Set();
|
|
|
var symbols = new Set();
|
|
|
|
|
|
var visitState = function visitState(state) {
|
|
|
if (visited.has(state)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
visited.add(state);
|
|
|
state.number = visited.size;
|
|
|
_this._transitionTable[state.number] = {};
|
|
|
|
|
|
if (state.accepting) {
|
|
|
_this._acceptingStates.add(state);
|
|
|
}
|
|
|
|
|
|
var transitions = state.getTransitions();
|
|
|
|
|
|
var _iteratorNormalCompletion2 = true;
|
|
|
var _didIteratorError2 = false;
|
|
|
var _iteratorError2 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator2 = transitions[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
|
var _ref = _step2.value;
|
|
|
|
|
|
var _ref2 = _slicedToArray(_ref, 2);
|
|
|
|
|
|
var symbol = _ref2[0];
|
|
|
var symbolTransitions = _ref2[1];
|
|
|
|
|
|
var combinedState = [];
|
|
|
symbols.add(symbol);
|
|
|
var _iteratorNormalCompletion3 = true;
|
|
|
var _didIteratorError3 = false;
|
|
|
var _iteratorError3 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator3 = symbolTransitions[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
|
|
var nextState = _step3.value;
|
|
|
|
|
|
visitState(nextState);
|
|
|
combinedState.push(nextState.number);
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError3 = true;
|
|
|
_iteratorError3 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion3 && _iterator3.return) {
|
|
|
_iterator3.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError3) {
|
|
|
throw _iteratorError3;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
_this._transitionTable[state.number][symbol] = combinedState;
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError2 = true;
|
|
|
_iteratorError2 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
|
|
_iterator2.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError2) {
|
|
|
throw _iteratorError2;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
// Traverse the graph starting from the `in`.
|
|
|
visitState(this.in);
|
|
|
|
|
|
// Append epsilon-closure column.
|
|
|
visited.forEach(function (state) {
|
|
|
delete _this._transitionTable[state.number][EPSILON];
|
|
|
_this._transitionTable[state.number][EPSILON_CLOSURE] = [].concat(_toConsumableArray(state.getEpsilonClosure())).map(function (s) {
|
|
|
return s.number;
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
|
|
|
return this._transitionTable;
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return NFA;
|
|
|
}();
|
|
|
|
|
|
module.exports = NFA;
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 28200:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Epsilon, the empty string.
|
|
|
*/
|
|
|
|
|
|
var EPSILON = 'ε';
|
|
|
|
|
|
/**
|
|
|
* Epsilon-closure.
|
|
|
*/
|
|
|
var EPSILON_CLOSURE = EPSILON + '*';
|
|
|
|
|
|
module.exports = {
|
|
|
EPSILON: EPSILON,
|
|
|
EPSILON_CLOSURE: EPSILON_CLOSURE
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 76146:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A generic FA State class (base for NFA and DFA).
|
|
|
*
|
|
|
* Maintains the transition map, and the flag whether
|
|
|
* the state is accepting.
|
|
|
*/
|
|
|
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
var State = function () {
|
|
|
function State() {
|
|
|
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
|
_ref$accepting = _ref.accepting,
|
|
|
accepting = _ref$accepting === undefined ? false : _ref$accepting;
|
|
|
|
|
|
_classCallCheck(this, State);
|
|
|
|
|
|
/**
|
|
|
* Outgoing transitions to other states.
|
|
|
*/
|
|
|
this._transitions = new Map();
|
|
|
|
|
|
/**
|
|
|
* Whether the state is accepting.
|
|
|
*/
|
|
|
this.accepting = accepting;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns transitions for this state.
|
|
|
*/
|
|
|
|
|
|
|
|
|
_createClass(State, [{
|
|
|
key: 'getTransitions',
|
|
|
value: function getTransitions() {
|
|
|
return this._transitions;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Creates a transition on symbol.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'addTransition',
|
|
|
value: function addTransition(symbol, toState) {
|
|
|
this.getTransitionsOnSymbol(symbol).add(toState);
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns transitions set on symbol.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getTransitionsOnSymbol',
|
|
|
value: function getTransitionsOnSymbol(symbol) {
|
|
|
var transitions = this._transitions.get(symbol);
|
|
|
|
|
|
if (!transitions) {
|
|
|
transitions = new Set();
|
|
|
this._transitions.set(symbol, transitions);
|
|
|
}
|
|
|
|
|
|
return transitions;
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return State;
|
|
|
}();
|
|
|
|
|
|
module.exports = State;
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 33186:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var clone = __webpack_require__(64456);
|
|
|
var parser = __webpack_require__(46418);
|
|
|
var transform = __webpack_require__(42113);
|
|
|
var optimizationTransforms = __webpack_require__(35292);
|
|
|
|
|
|
module.exports = {
|
|
|
/**
|
|
|
* Optimizer transforms a regular expression into an optimized version,
|
|
|
* replacing some sub-expressions with their idiomatic patterns.
|
|
|
*
|
|
|
* @param string | RegExp | AST - a regexp to optimize.
|
|
|
*
|
|
|
* @return TransformResult - an optimized regexp.
|
|
|
*
|
|
|
* Example:
|
|
|
*
|
|
|
* /[a-zA-Z_0-9][a-zA-Z_0-9]*\e{1,}/
|
|
|
*
|
|
|
* Optimized to:
|
|
|
*
|
|
|
* /\w+e+/
|
|
|
*/
|
|
|
optimize: function optimize(regexp) {
|
|
|
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
|
_ref$whitelist = _ref.whitelist,
|
|
|
whitelist = _ref$whitelist === undefined ? [] : _ref$whitelist,
|
|
|
_ref$blacklist = _ref.blacklist,
|
|
|
blacklist = _ref$blacklist === undefined ? [] : _ref$blacklist;
|
|
|
|
|
|
var transformsRaw = whitelist.length > 0 ? whitelist : Array.from(optimizationTransforms.keys());
|
|
|
|
|
|
var transformToApply = transformsRaw.filter(function (transform) {
|
|
|
return !blacklist.includes(transform);
|
|
|
});
|
|
|
|
|
|
var ast = regexp;
|
|
|
if (regexp instanceof RegExp) {
|
|
|
regexp = '' + regexp;
|
|
|
}
|
|
|
|
|
|
if (typeof regexp === 'string') {
|
|
|
ast = parser.parse(regexp);
|
|
|
}
|
|
|
|
|
|
var result = new transform.TransformResult(ast);
|
|
|
var prevResultString = void 0;
|
|
|
|
|
|
do {
|
|
|
// Get a copy of the current state here so
|
|
|
// we can compare it with the state at the
|
|
|
// end of the loop.
|
|
|
prevResultString = result.toString();
|
|
|
ast = clone(result.getAST());
|
|
|
|
|
|
transformToApply.forEach(function (transformName) {
|
|
|
if (!optimizationTransforms.has(transformName)) {
|
|
|
throw new Error('Unknown optimization-transform: ' + transformName + '. ' + 'Available transforms are: ' + Array.from(optimizationTransforms.keys()).join(', '));
|
|
|
}
|
|
|
|
|
|
var transformer = optimizationTransforms.get(transformName);
|
|
|
|
|
|
// Don't override result just yet since we
|
|
|
// might want to rollback the transform
|
|
|
var newResult = transform.transform(ast, transformer);
|
|
|
|
|
|
if (newResult.toString() !== result.toString()) {
|
|
|
if (newResult.toString().length <= result.toString().length) {
|
|
|
result = newResult;
|
|
|
} else {
|
|
|
// Result has changed but is not shorter:
|
|
|
// restore ast to its previous state.
|
|
|
|
|
|
ast = clone(result.getAST());
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// Keep running the optimizer until it stops
|
|
|
// making any change to the regexp.
|
|
|
} while (result.toString() !== prevResultString);
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 30223:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var UPPER_A_CP = 'A'.codePointAt(0);
|
|
|
var UPPER_Z_CP = 'Z'.codePointAt(0);
|
|
|
/**
|
|
|
* Transforms case-insensitive regexp to lowercase
|
|
|
*
|
|
|
* /AaBbÏ/i -> /aabbï/i
|
|
|
*/
|
|
|
module.exports = {
|
|
|
_AZClassRanges: null,
|
|
|
_hasUFlag: false,
|
|
|
init: function init(ast) {
|
|
|
this._AZClassRanges = new Set();
|
|
|
this._hasUFlag = ast.flags.includes('u');
|
|
|
},
|
|
|
shouldRun: function shouldRun(ast) {
|
|
|
return ast.flags.includes('i');
|
|
|
},
|
|
|
Char: function Char(path) {
|
|
|
var node = path.node,
|
|
|
parent = path.parent;
|
|
|
|
|
|
if (isNaN(node.codePoint)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// Engine support for case-insensitive matching without the u flag
|
|
|
// for characters above \u1000 does not seem reliable.
|
|
|
if (!this._hasUFlag && node.codePoint >= 0x1000) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (parent.type === 'ClassRange') {
|
|
|
// The only class ranges we handle must be inside A-Z.
|
|
|
// After the `from` char is processed, the isAZClassRange test
|
|
|
// will be false, so we use a Set to keep track of parents and
|
|
|
// process the `to` char.
|
|
|
if (!this._AZClassRanges.has(parent) && !isAZClassRange(parent)) {
|
|
|
return;
|
|
|
}
|
|
|
this._AZClassRanges.add(parent);
|
|
|
}
|
|
|
|
|
|
var lower = node.symbol.toLowerCase();
|
|
|
if (lower !== node.symbol) {
|
|
|
node.value = displaySymbolAsValue(lower, node);
|
|
|
node.symbol = lower;
|
|
|
node.codePoint = lower.codePointAt(0);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
function isAZClassRange(classRange) {
|
|
|
var from = classRange.from,
|
|
|
to = classRange.to;
|
|
|
// A-Z
|
|
|
|
|
|
return from.codePoint >= UPPER_A_CP && from.codePoint <= UPPER_Z_CP && to.codePoint >= UPPER_A_CP && to.codePoint <= UPPER_Z_CP;
|
|
|
}
|
|
|
|
|
|
function displaySymbolAsValue(symbol, node) {
|
|
|
var codePoint = symbol.codePointAt(0);
|
|
|
if (node.kind === 'decimal') {
|
|
|
return '\\' + codePoint;
|
|
|
}
|
|
|
if (node.kind === 'oct') {
|
|
|
return '\\0' + codePoint.toString(8);
|
|
|
}
|
|
|
if (node.kind === 'hex') {
|
|
|
return '\\x' + codePoint.toString(16);
|
|
|
}
|
|
|
if (node.kind === 'unicode') {
|
|
|
if (node.isSurrogatePair) {
|
|
|
var _getSurrogatePairFrom = getSurrogatePairFromCodePoint(codePoint),
|
|
|
lead = _getSurrogatePairFrom.lead,
|
|
|
trail = _getSurrogatePairFrom.trail;
|
|
|
|
|
|
return '\\u' + '0'.repeat(4 - lead.length) + lead + '\\u' + '0'.repeat(4 - trail.length) + trail;
|
|
|
} else if (node.value.includes('{')) {
|
|
|
return '\\u{' + codePoint.toString(16) + '}';
|
|
|
} else {
|
|
|
var code = codePoint.toString(16);
|
|
|
return '\\u' + '0'.repeat(4 - code.length) + code;
|
|
|
}
|
|
|
}
|
|
|
// simple
|
|
|
return symbol;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Converts a code point to a surrogate pair.
|
|
|
* Conversion algorithm is taken from The Unicode Standard 3.0 Section 3.7
|
|
|
* (https://www.unicode.org/versions/Unicode3.0.0/ch03.pdf)
|
|
|
* @param {number} codePoint - Between 0x10000 and 0x10ffff
|
|
|
* @returns {{lead: string, trail: string}}
|
|
|
*/
|
|
|
function getSurrogatePairFromCodePoint(codePoint) {
|
|
|
var lead = Math.floor((codePoint - 0x10000) / 0x400) + 0xd800;
|
|
|
var trail = (codePoint - 0x10000) % 0x400 + 0xdc00;
|
|
|
return {
|
|
|
lead: lead.toString(16),
|
|
|
trail: trail.toString(16)
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 94251:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to merge class ranges.
|
|
|
*
|
|
|
* [a-ec] -> [a-e]
|
|
|
* [a-ec-e] -> [a-e]
|
|
|
* [\w\da-f] -> [\w]
|
|
|
* [abcdef] -> [a-f]
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
_hasIUFlags: false,
|
|
|
init: function init(ast) {
|
|
|
this._hasIUFlags = ast.flags.includes('i') && ast.flags.includes('u');
|
|
|
},
|
|
|
CharacterClass: function CharacterClass(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
var expressions = node.expressions;
|
|
|
|
|
|
var metas = [];
|
|
|
// Extract metas
|
|
|
expressions.forEach(function (expression) {
|
|
|
if (isMeta(expression)) {
|
|
|
metas.push(expression.value);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
expressions.sort(sortCharClass);
|
|
|
|
|
|
for (var i = 0; i < expressions.length; i++) {
|
|
|
var expression = expressions[i];
|
|
|
if (fitsInMetas(expression, metas, this._hasIUFlags) || combinesWithPrecedingClassRange(expression, expressions[i - 1]) || combinesWithFollowingClassRange(expression, expressions[i + 1])) {
|
|
|
expressions.splice(i, 1);
|
|
|
i--;
|
|
|
} else {
|
|
|
var nbMergedChars = charCombinesWithPrecedingChars(expression, i, expressions);
|
|
|
expressions.splice(i - nbMergedChars + 1, nbMergedChars);
|
|
|
i -= nbMergedChars;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* Sorts expressions in char class in the following order:
|
|
|
* - meta chars, ordered alphabetically by value
|
|
|
* - chars (except `control` kind) and class ranges, ordered alphabetically (`from` char is used for class ranges)
|
|
|
* - if ambiguous, class range comes before char
|
|
|
* - if ambiguous between two class ranges, orders alphabetically by `to` char
|
|
|
* - control chars, ordered alphabetically by value
|
|
|
* @param {Object} a - Left Char or ClassRange node
|
|
|
* @param {Object} b - Right Char or ClassRange node
|
|
|
* @returns {number}
|
|
|
*/
|
|
|
function sortCharClass(a, b) {
|
|
|
var aValue = getSortValue(a);
|
|
|
var bValue = getSortValue(b);
|
|
|
|
|
|
if (aValue === bValue) {
|
|
|
// We want ClassRange before Char
|
|
|
// [bb-d] -> [b-db]
|
|
|
if (a.type === 'ClassRange' && b.type !== 'ClassRange') {
|
|
|
return -1;
|
|
|
}
|
|
|
if (b.type === 'ClassRange' && a.type !== 'ClassRange') {
|
|
|
return 1;
|
|
|
}
|
|
|
if (a.type === 'ClassRange' && b.type === 'ClassRange') {
|
|
|
return getSortValue(a.to) - getSortValue(b.to);
|
|
|
}
|
|
|
if (isMeta(a) && isMeta(b) || isControl(a) && isControl(b)) {
|
|
|
return a.value < b.value ? -1 : 1;
|
|
|
}
|
|
|
}
|
|
|
return aValue - bValue;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param {Object} expression - Char or ClassRange node
|
|
|
* @returns {number}
|
|
|
*/
|
|
|
function getSortValue(expression) {
|
|
|
if (expression.type === 'Char') {
|
|
|
if (expression.value === '-') {
|
|
|
return Infinity;
|
|
|
}
|
|
|
if (expression.kind === 'control') {
|
|
|
return Infinity;
|
|
|
}
|
|
|
if (expression.kind === 'meta' && isNaN(expression.codePoint)) {
|
|
|
return -1;
|
|
|
}
|
|
|
return expression.codePoint;
|
|
|
}
|
|
|
// ClassRange
|
|
|
return expression.from.codePoint;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Checks if a node is a meta char from the set \d\w\s\D\W\S
|
|
|
* @param {Object} expression - Char or ClassRange node
|
|
|
* @param {?string} value
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function isMeta(expression) {
|
|
|
var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
|
|
|
|
return expression.type === 'Char' && expression.kind === 'meta' && (value ? expression.value === value : /^\\[dws]$/i.test(expression.value));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param {Object} expression - Char or ClassRange node
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function isControl(expression) {
|
|
|
return expression.type === 'Char' && expression.kind === 'control';
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param {Object} expression - Char or ClassRange node
|
|
|
* @param {string[]} metas - Array of meta chars, e.g. ["\\w", "\\s"]
|
|
|
* @param {boolean} hasIUFlags
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function fitsInMetas(expression, metas, hasIUFlags) {
|
|
|
for (var i = 0; i < metas.length; i++) {
|
|
|
if (fitsInMeta(expression, metas[i], hasIUFlags)) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param {Object} expression - Char or ClassRange node
|
|
|
* @param {string} meta - e.g. "\\w"
|
|
|
* @param {boolean} hasIUFlags
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function fitsInMeta(expression, meta, hasIUFlags) {
|
|
|
if (expression.type === 'ClassRange') {
|
|
|
return fitsInMeta(expression.from, meta, hasIUFlags) && fitsInMeta(expression.to, meta, hasIUFlags);
|
|
|
}
|
|
|
|
|
|
// Special cases:
|
|
|
// \S contains \w and \d
|
|
|
if (meta === '\\S' && (isMeta(expression, '\\w') || isMeta(expression, '\\d'))) {
|
|
|
return true;
|
|
|
}
|
|
|
// \D contains \W and \s
|
|
|
if (meta === '\\D' && (isMeta(expression, '\\W') || isMeta(expression, '\\s'))) {
|
|
|
return true;
|
|
|
}
|
|
|
// \w contains \d
|
|
|
if (meta === '\\w' && isMeta(expression, '\\d')) {
|
|
|
return true;
|
|
|
}
|
|
|
// \W contains \s
|
|
|
if (meta === '\\W' && isMeta(expression, '\\s')) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
if (expression.type !== 'Char' || isNaN(expression.codePoint)) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (meta === '\\s') {
|
|
|
return fitsInMetaS(expression);
|
|
|
}
|
|
|
if (meta === '\\S') {
|
|
|
return !fitsInMetaS(expression);
|
|
|
}
|
|
|
if (meta === '\\d') {
|
|
|
return fitsInMetaD(expression);
|
|
|
}
|
|
|
if (meta === '\\D') {
|
|
|
return !fitsInMetaD(expression);
|
|
|
}
|
|
|
if (meta === '\\w') {
|
|
|
return fitsInMetaW(expression, hasIUFlags);
|
|
|
}
|
|
|
if (meta === '\\W') {
|
|
|
return !fitsInMetaW(expression, hasIUFlags);
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param {Object} expression - Char node with codePoint
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function fitsInMetaS(expression) {
|
|
|
return expression.codePoint === 0x0009 || // \t
|
|
|
expression.codePoint === 0x000a || // \n
|
|
|
expression.codePoint === 0x000b || // \v
|
|
|
expression.codePoint === 0x000c || // \f
|
|
|
expression.codePoint === 0x000d || // \r
|
|
|
expression.codePoint === 0x0020 || // space
|
|
|
expression.codePoint === 0x00a0 || // nbsp
|
|
|
expression.codePoint === 0x1680 || // part of Zs
|
|
|
expression.codePoint >= 0x2000 && expression.codePoint <= 0x200a || // part of Zs
|
|
|
expression.codePoint === 0x2028 || // line separator
|
|
|
expression.codePoint === 0x2029 || // paragraph separator
|
|
|
expression.codePoint === 0x202f || // part of Zs
|
|
|
expression.codePoint === 0x205f || // part of Zs
|
|
|
expression.codePoint === 0x3000 || // part of Zs
|
|
|
expression.codePoint === 0xfeff; // zwnbsp
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param {Object} expression - Char node with codePoint
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function fitsInMetaD(expression) {
|
|
|
return expression.codePoint >= 0x30 && expression.codePoint <= 0x39; // 0-9
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param {Object} expression - Char node with codePoint
|
|
|
* @param {boolean} hasIUFlags
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function fitsInMetaW(expression, hasIUFlags) {
|
|
|
return fitsInMetaD(expression) || expression.codePoint >= 0x41 && expression.codePoint <= 0x5a || // A-Z
|
|
|
expression.codePoint >= 0x61 && expression.codePoint <= 0x7a || // a-z
|
|
|
expression.value === '_' || hasIUFlags && (expression.codePoint === 0x017f || expression.codePoint === 0x212a);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param {Object} expression - Char or ClassRange node
|
|
|
* @param {Object} classRange - Char or ClassRange node
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function combinesWithPrecedingClassRange(expression, classRange) {
|
|
|
if (classRange && classRange.type === 'ClassRange') {
|
|
|
if (fitsInClassRange(expression, classRange)) {
|
|
|
// [a-gc] -> [a-g]
|
|
|
// [a-gc-e] -> [a-g]
|
|
|
return true;
|
|
|
} else if (
|
|
|
// We only want \w chars or char codes to keep readability
|
|
|
isMetaWCharOrCode(expression) && classRange.to.codePoint === expression.codePoint - 1) {
|
|
|
// [a-de] -> [a-e]
|
|
|
classRange.to = expression;
|
|
|
return true;
|
|
|
} else if (expression.type === 'ClassRange' && expression.from.codePoint <= classRange.to.codePoint + 1 && expression.to.codePoint >= classRange.from.codePoint - 1) {
|
|
|
// [a-db-f] -> [a-f]
|
|
|
// [b-fa-d] -> [a-f]
|
|
|
// [a-cd-f] -> [a-f]
|
|
|
if (expression.from.codePoint < classRange.from.codePoint) {
|
|
|
classRange.from = expression.from;
|
|
|
}
|
|
|
if (expression.to.codePoint > classRange.to.codePoint) {
|
|
|
classRange.to = expression.to;
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param {Object} expression - Char or ClassRange node
|
|
|
* @param {Object} classRange - Char or ClassRange node
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function combinesWithFollowingClassRange(expression, classRange) {
|
|
|
if (classRange && classRange.type === 'ClassRange') {
|
|
|
// Considering the elements were ordered alphabetically,
|
|
|
// there is only one case to handle
|
|
|
// [ab-e] -> [a-e]
|
|
|
if (
|
|
|
// We only want \w chars or char codes to keep readability
|
|
|
isMetaWCharOrCode(expression) && classRange.from.codePoint === expression.codePoint + 1) {
|
|
|
classRange.from = expression;
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param {Object} expression - Char or ClassRange node
|
|
|
* @param {Object} classRange - ClassRange node
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function fitsInClassRange(expression, classRange) {
|
|
|
if (expression.type === 'Char' && isNaN(expression.codePoint)) {
|
|
|
return false;
|
|
|
}
|
|
|
if (expression.type === 'ClassRange') {
|
|
|
return fitsInClassRange(expression.from, classRange) && fitsInClassRange(expression.to, classRange);
|
|
|
}
|
|
|
return expression.codePoint >= classRange.from.codePoint && expression.codePoint <= classRange.to.codePoint;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @param {Object} expression - Char or ClassRange node
|
|
|
* @param {Number} index
|
|
|
* @param {Object[]} expressions - expressions in CharClass
|
|
|
* @returns {number} - Number of characters combined with expression
|
|
|
*/
|
|
|
function charCombinesWithPrecedingChars(expression, index, expressions) {
|
|
|
// We only want \w chars or char codes to keep readability
|
|
|
if (!isMetaWCharOrCode(expression)) {
|
|
|
return 0;
|
|
|
}
|
|
|
var nbMergedChars = 0;
|
|
|
while (index > 0) {
|
|
|
var currentExpression = expressions[index];
|
|
|
var precedingExpresion = expressions[index - 1];
|
|
|
if (isMetaWCharOrCode(precedingExpresion) && precedingExpresion.codePoint === currentExpression.codePoint - 1) {
|
|
|
nbMergedChars++;
|
|
|
index--;
|
|
|
} else {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (nbMergedChars > 1) {
|
|
|
expressions[index] = {
|
|
|
type: 'ClassRange',
|
|
|
from: expressions[index],
|
|
|
to: expression
|
|
|
};
|
|
|
return nbMergedChars;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
function isMetaWCharOrCode(expression) {
|
|
|
return expression && expression.type === 'Char' && !isNaN(expression.codePoint) && (fitsInMetaW(expression, false) || expression.kind === 'unicode' || expression.kind === 'hex' || expression.kind === 'oct' || expression.kind === 'decimal');
|
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 65501:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to simplify character classes
|
|
|
* spanning only one or two chars.
|
|
|
*
|
|
|
* [a-a] -> [a]
|
|
|
* [a-b] -> [ab]
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
ClassRange: function ClassRange(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (node.from.codePoint === node.to.codePoint) {
|
|
|
|
|
|
path.replace(node.from);
|
|
|
} else if (node.from.codePoint === node.to.codePoint - 1) {
|
|
|
|
|
|
path.getParent().insertChildAt(node.to, path.index + 1);
|
|
|
path.replace(node.from);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 56885:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to remove duplicates from character classes.
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
CharacterClass: function CharacterClass(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
var sources = {};
|
|
|
|
|
|
for (var i = 0; i < node.expressions.length; i++) {
|
|
|
var childPath = path.getChild(i);
|
|
|
var source = childPath.jsonEncode();
|
|
|
|
|
|
if (sources.hasOwnProperty(source)) {
|
|
|
childPath.remove();
|
|
|
|
|
|
// Since we remove the current node.
|
|
|
// TODO: make it simpler for users with a method.
|
|
|
i--;
|
|
|
}
|
|
|
|
|
|
sources[source] = true;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 77698:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to replace standard character classes with
|
|
|
* their meta symbols equivalents.
|
|
|
*/
|
|
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
|
|
module.exports = {
|
|
|
_hasIFlag: false,
|
|
|
_hasUFlag: false,
|
|
|
init: function init(ast) {
|
|
|
this._hasIFlag = ast.flags.includes('i');
|
|
|
this._hasUFlag = ast.flags.includes('u');
|
|
|
},
|
|
|
CharacterClass: function CharacterClass(path) {
|
|
|
// [0-9] -> \d
|
|
|
rewriteNumberRanges(path);
|
|
|
|
|
|
// [a-zA-Z_0-9] -> \w
|
|
|
rewriteWordRanges(path, this._hasIFlag, this._hasUFlag);
|
|
|
|
|
|
// [ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] -> \s
|
|
|
rewriteWhitespaceRanges(path);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* Rewrites number ranges: [0-9] -> \d
|
|
|
*/
|
|
|
function rewriteNumberRanges(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
node.expressions.forEach(function (expression, i) {
|
|
|
if (isFullNumberRange(expression)) {
|
|
|
path.getChild(i).replace({
|
|
|
type: 'Char',
|
|
|
value: '\\d',
|
|
|
kind: 'meta'
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Rewrites word ranges: [a-zA-Z_0-9] -> \w
|
|
|
* Thus, the ranges may go in any order, and other symbols/ranges
|
|
|
* are kept untouched, e.g. [a-z_\dA-Z$] -> [\w$]
|
|
|
*/
|
|
|
function rewriteWordRanges(path, hasIFlag, hasUFlag) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
var numberPath = null;
|
|
|
var lowerCasePath = null;
|
|
|
var upperCasePath = null;
|
|
|
var underscorePath = null;
|
|
|
var u017fPath = null;
|
|
|
var u212aPath = null;
|
|
|
|
|
|
node.expressions.forEach(function (expression, i) {
|
|
|
// \d
|
|
|
if (isMetaChar(expression, '\\d')) {
|
|
|
numberPath = path.getChild(i);
|
|
|
}
|
|
|
|
|
|
// a-z
|
|
|
else if (isLowerCaseRange(expression)) {
|
|
|
lowerCasePath = path.getChild(i);
|
|
|
}
|
|
|
|
|
|
// A-Z
|
|
|
else if (isUpperCaseRange(expression)) {
|
|
|
upperCasePath = path.getChild(i);
|
|
|
}
|
|
|
|
|
|
// _
|
|
|
else if (isUnderscore(expression)) {
|
|
|
underscorePath = path.getChild(i);
|
|
|
} else if (hasIFlag && hasUFlag && isCodePoint(expression, 0x017f)) {
|
|
|
u017fPath = path.getChild(i);
|
|
|
} else if (hasIFlag && hasUFlag && isCodePoint(expression, 0x212a)) {
|
|
|
u212aPath = path.getChild(i);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// If we found the whole pattern, replace it.
|
|
|
if (numberPath && (lowerCasePath && upperCasePath || hasIFlag && (lowerCasePath || upperCasePath)) && underscorePath && (!hasUFlag || !hasIFlag || u017fPath && u212aPath)) {
|
|
|
// Put \w in place of \d.
|
|
|
numberPath.replace({
|
|
|
type: 'Char',
|
|
|
value: '\\w',
|
|
|
kind: 'meta'
|
|
|
});
|
|
|
|
|
|
// Other paths are removed.
|
|
|
if (lowerCasePath) {
|
|
|
lowerCasePath.remove();
|
|
|
}
|
|
|
if (upperCasePath) {
|
|
|
upperCasePath.remove();
|
|
|
}
|
|
|
underscorePath.remove();
|
|
|
if (u017fPath) {
|
|
|
u017fPath.remove();
|
|
|
}
|
|
|
if (u212aPath) {
|
|
|
u212aPath.remove();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Rewrites whitespace ranges: [ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] -> \s.
|
|
|
*/
|
|
|
var whitespaceRangeTests = [function (node) {
|
|
|
return isChar(node, ' ');
|
|
|
}].concat(_toConsumableArray(['\\f', '\\n', '\\r', '\\t', '\\v'].map(function (char) {
|
|
|
return function (node) {
|
|
|
return isMetaChar(node, char);
|
|
|
};
|
|
|
})), _toConsumableArray([0x00a0, 0x1680, 0x2028, 0x2029, 0x202f, 0x205f, 0x3000, 0xfeff].map(function (codePoint) {
|
|
|
return function (node) {
|
|
|
return isCodePoint(node, codePoint);
|
|
|
};
|
|
|
})), [function (node) {
|
|
|
return node.type === 'ClassRange' && isCodePoint(node.from, 0x2000) && isCodePoint(node.to, 0x200a);
|
|
|
}]);
|
|
|
|
|
|
function rewriteWhitespaceRanges(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (node.expressions.length < whitespaceRangeTests.length || !whitespaceRangeTests.every(function (test) {
|
|
|
return node.expressions.some(function (expression) {
|
|
|
return test(expression);
|
|
|
});
|
|
|
})) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// If we found the whole pattern, replace it.
|
|
|
|
|
|
// Put \s in place of \n.
|
|
|
var nNode = node.expressions.find(function (expression) {
|
|
|
return isMetaChar(expression, '\\n');
|
|
|
});
|
|
|
nNode.value = '\\s';
|
|
|
nNode.symbol = undefined;
|
|
|
nNode.codePoint = NaN;
|
|
|
|
|
|
// Other paths are removed.
|
|
|
node.expressions.map(function (expression, i) {
|
|
|
return whitespaceRangeTests.some(function (test) {
|
|
|
return test(expression);
|
|
|
}) ? path.getChild(i) : undefined;
|
|
|
}).filter(Boolean).forEach(function (path) {
|
|
|
return path.remove();
|
|
|
});
|
|
|
}
|
|
|
|
|
|
function isFullNumberRange(node) {
|
|
|
return node.type === 'ClassRange' && node.from.value === '0' && node.to.value === '9';
|
|
|
}
|
|
|
|
|
|
function isChar(node, value) {
|
|
|
var kind = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'simple';
|
|
|
|
|
|
return node.type === 'Char' && node.value === value && node.kind === kind;
|
|
|
}
|
|
|
|
|
|
function isMetaChar(node, value) {
|
|
|
return isChar(node, value, 'meta');
|
|
|
}
|
|
|
|
|
|
function isLowerCaseRange(node) {
|
|
|
return node.type === 'ClassRange' && node.from.value === 'a' && node.to.value === 'z';
|
|
|
}
|
|
|
|
|
|
function isUpperCaseRange(node) {
|
|
|
return node.type === 'ClassRange' && node.from.value === 'A' && node.to.value === 'Z';
|
|
|
}
|
|
|
|
|
|
function isUnderscore(node) {
|
|
|
return node.type === 'Char' && node.value === '_' && node.kind === 'simple';
|
|
|
}
|
|
|
|
|
|
function isCodePoint(node, codePoint) {
|
|
|
return node.type === 'Char' && node.kind === 'unicode' && node.codePoint === codePoint;
|
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 77867:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to replace single char character classes with
|
|
|
* just that character.
|
|
|
*
|
|
|
* [\d] -> \d, [^\w] -> \W
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
CharacterClass: function CharacterClass(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (node.expressions.length !== 1 || !hasAppropriateSiblings(path) || !isAppropriateChar(node.expressions[0])) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var _node$expressions$ = node.expressions[0],
|
|
|
value = _node$expressions$.value,
|
|
|
kind = _node$expressions$.kind,
|
|
|
escaped = _node$expressions$.escaped;
|
|
|
|
|
|
|
|
|
if (node.negative) {
|
|
|
// For negative can extract only meta chars like [^\w] -> \W
|
|
|
// cannot do for [^a] -> a (wrong).
|
|
|
if (!isMeta(value)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
value = getInverseMeta(value);
|
|
|
}
|
|
|
|
|
|
path.replace({
|
|
|
type: 'Char',
|
|
|
value: value,
|
|
|
kind: kind,
|
|
|
escaped: escaped || shouldEscape(value)
|
|
|
});
|
|
|
}
|
|
|
};
|
|
|
|
|
|
function isAppropriateChar(node) {
|
|
|
return node.type === 'Char' &&
|
|
|
// We don't extract [\b] (backspace) since \b has different
|
|
|
// semantics (word boundary).
|
|
|
node.value !== '\\b';
|
|
|
}
|
|
|
|
|
|
function isMeta(value) {
|
|
|
return (/^\\[dwsDWS]$/.test(value)
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function getInverseMeta(value) {
|
|
|
return (/[dws]/.test(value) ? value.toUpperCase() : value.toLowerCase()
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function hasAppropriateSiblings(path) {
|
|
|
var parent = path.parent,
|
|
|
index = path.index;
|
|
|
|
|
|
|
|
|
if (parent.type !== 'Alternative') {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
var previousNode = parent.expressions[index - 1];
|
|
|
if (previousNode == null) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
// Don't optimized \1[0] to \10
|
|
|
if (previousNode.type === 'Backreference' && previousNode.kind === 'number') {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// Don't optimized \2[0] to \20
|
|
|
if (previousNode.type === 'Char' && previousNode.kind === 'decimal') {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
// Note: \{ and \} are always preserved to avoid `a[{]2[}]` turning
|
|
|
// into `a{2}`.
|
|
|
function shouldEscape(value) {
|
|
|
return (/[*[()+?$./{}|]/.test(value)
|
|
|
);
|
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 53540:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var UPPER_A_CP = 'A'.codePointAt(0);
|
|
|
var UPPER_Z_CP = 'Z'.codePointAt(0);
|
|
|
var LOWER_A_CP = 'a'.codePointAt(0);
|
|
|
var LOWER_Z_CP = 'z'.codePointAt(0);
|
|
|
var DIGIT_0_CP = '0'.codePointAt(0);
|
|
|
var DIGIT_9_CP = '9'.codePointAt(0);
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to transform coded chars into simple chars.
|
|
|
*
|
|
|
* \u0061 -> a
|
|
|
*/
|
|
|
module.exports = {
|
|
|
Char: function Char(path) {
|
|
|
var node = path.node,
|
|
|
parent = path.parent;
|
|
|
|
|
|
if (isNaN(node.codePoint) || node.kind === 'simple') {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (parent.type === 'ClassRange') {
|
|
|
if (!isSimpleRange(parent)) {
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!isPrintableASCIIChar(node.codePoint)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var symbol = String.fromCodePoint(node.codePoint);
|
|
|
var newChar = {
|
|
|
type: 'Char',
|
|
|
kind: 'simple',
|
|
|
value: symbol,
|
|
|
symbol: symbol,
|
|
|
codePoint: node.codePoint
|
|
|
};
|
|
|
if (needsEscape(symbol, parent.type)) {
|
|
|
newChar.escaped = true;
|
|
|
}
|
|
|
path.replace(newChar);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* Checks if a range is included either in 0-9, a-z or A-Z
|
|
|
* @param classRange
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function isSimpleRange(classRange) {
|
|
|
var from = classRange.from,
|
|
|
to = classRange.to;
|
|
|
|
|
|
return from.codePoint >= DIGIT_0_CP && from.codePoint <= DIGIT_9_CP && to.codePoint >= DIGIT_0_CP && to.codePoint <= DIGIT_9_CP || from.codePoint >= UPPER_A_CP && from.codePoint <= UPPER_Z_CP && to.codePoint >= UPPER_A_CP && to.codePoint <= UPPER_Z_CP || from.codePoint >= LOWER_A_CP && from.codePoint <= LOWER_Z_CP && to.codePoint >= LOWER_A_CP && to.codePoint <= LOWER_Z_CP;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Checks if a code point in the range of printable ASCII chars
|
|
|
* (DEL char excluded)
|
|
|
* @param codePoint
|
|
|
* @returns {boolean}
|
|
|
*/
|
|
|
function isPrintableASCIIChar(codePoint) {
|
|
|
return codePoint >= 0x20 && codePoint <= 0x7e;
|
|
|
}
|
|
|
|
|
|
function needsEscape(symbol, parentType) {
|
|
|
if (parentType === 'ClassRange' || parentType === 'CharacterClass') {
|
|
|
return (/[\]\\^-]/.test(symbol)
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return (/[*[()+?^$./\\|{}]/.test(symbol)
|
|
|
);
|
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 7421:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to remove unnecessary escape.
|
|
|
*
|
|
|
* \e -> e
|
|
|
*
|
|
|
* [\(] -> [(]
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
_hasXFlag: false,
|
|
|
init: function init(ast) {
|
|
|
this._hasXFlag = ast.flags.includes('x');
|
|
|
},
|
|
|
Char: function Char(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (!node.escaped) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (shouldUnescape(path, this._hasXFlag)) {
|
|
|
delete node.escaped;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
function shouldUnescape(path, hasXFlag) {
|
|
|
var value = path.node.value,
|
|
|
index = path.index,
|
|
|
parent = path.parent;
|
|
|
|
|
|
// In char class (, etc are allowed.
|
|
|
|
|
|
if (parent.type !== 'CharacterClass' && parent.type !== 'ClassRange') {
|
|
|
return !preservesEscape(value, index, parent, hasXFlag);
|
|
|
}
|
|
|
|
|
|
return !preservesInCharClass(value, index, parent);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* \], \\, \^, \-
|
|
|
*/
|
|
|
function preservesInCharClass(value, index, parent) {
|
|
|
if (value === '^') {
|
|
|
// Avoid [\^a] turning into [^a]
|
|
|
return index === 0 && !parent.negative;
|
|
|
}
|
|
|
if (value === '-') {
|
|
|
// Avoid [a\-z] turning into [a-z]
|
|
|
return true;
|
|
|
}
|
|
|
return (/[\]\\]/.test(value)
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function preservesEscape(value, index, parent, hasXFlag) {
|
|
|
if (value === '{') {
|
|
|
return preservesOpeningCurlyBraceEscape(index, parent);
|
|
|
}
|
|
|
|
|
|
if (value === '}') {
|
|
|
return preservesClosingCurlyBraceEscape(index, parent);
|
|
|
}
|
|
|
|
|
|
if (hasXFlag && /[ #]/.test(value)) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
return (/[*[()+?^$./\\|]/.test(value)
|
|
|
);
|
|
|
}
|
|
|
|
|
|
function consumeNumbers(startIndex, parent, rtl) {
|
|
|
var i = startIndex;
|
|
|
var siblingNode = (rtl ? i >= 0 : i < parent.expressions.length) && parent.expressions[i];
|
|
|
|
|
|
while (siblingNode && siblingNode.type === 'Char' && siblingNode.kind === 'simple' && !siblingNode.escaped && /\d/.test(siblingNode.value)) {
|
|
|
rtl ? i-- : i++;
|
|
|
siblingNode = (rtl ? i >= 0 : i < parent.expressions.length) && parent.expressions[i];
|
|
|
}
|
|
|
|
|
|
return Math.abs(startIndex - i);
|
|
|
}
|
|
|
|
|
|
function isSimpleChar(node, value) {
|
|
|
return node && node.type === 'Char' && node.kind === 'simple' && !node.escaped && node.value === value;
|
|
|
}
|
|
|
|
|
|
function preservesOpeningCurlyBraceEscape(index, parent) {
|
|
|
// (?:\{) -> (?:{)
|
|
|
if (index == null) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var nbFollowingNumbers = consumeNumbers(index + 1, parent);
|
|
|
var i = index + nbFollowingNumbers + 1;
|
|
|
var nextSiblingNode = i < parent.expressions.length && parent.expressions[i];
|
|
|
|
|
|
if (nbFollowingNumbers) {
|
|
|
// Avoid \{3} turning into {3}
|
|
|
if (isSimpleChar(nextSiblingNode, '}')) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
if (isSimpleChar(nextSiblingNode, ',')) {
|
|
|
nbFollowingNumbers = consumeNumbers(i + 1, parent);
|
|
|
i = i + nbFollowingNumbers + 1;
|
|
|
nextSiblingNode = i < parent.expressions.length && parent.expressions[i];
|
|
|
|
|
|
// Avoid \{3,} turning into {3,}
|
|
|
return isSimpleChar(nextSiblingNode, '}');
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
function preservesClosingCurlyBraceEscape(index, parent) {
|
|
|
// (?:\{) -> (?:{)
|
|
|
if (index == null) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var nbPrecedingNumbers = consumeNumbers(index - 1, parent, true);
|
|
|
var i = index - nbPrecedingNumbers - 1;
|
|
|
var previousSiblingNode = i >= 0 && parent.expressions[i];
|
|
|
|
|
|
// Avoid {3\} turning into {3}
|
|
|
if (nbPrecedingNumbers && isSimpleChar(previousSiblingNode, '{')) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
if (isSimpleChar(previousSiblingNode, ',')) {
|
|
|
nbPrecedingNumbers = consumeNumbers(i - 1, parent, true);
|
|
|
i = i - nbPrecedingNumbers - 1;
|
|
|
previousSiblingNode = i < parent.expressions.length && parent.expressions[i];
|
|
|
|
|
|
// Avoid {3,\} turning into {3,}
|
|
|
return nbPrecedingNumbers && isSimpleChar(previousSiblingNode, '{');
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 87126:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to transform surrogate pairs into single unicode code point
|
|
|
*
|
|
|
* \ud83d\ude80 -> \u{1f680}
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
shouldRun: function shouldRun(ast) {
|
|
|
return ast.flags.includes('u');
|
|
|
},
|
|
|
Char: function Char(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
if (node.kind !== 'unicode' || !node.isSurrogatePair || isNaN(node.codePoint)) {
|
|
|
return;
|
|
|
}
|
|
|
node.value = '\\u{' + node.codePoint.toString(16) + '}';
|
|
|
delete node.isSurrogatePair;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 92879:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
|
|
var NodePath = __webpack_require__(53636);
|
|
|
|
|
|
var _require = __webpack_require__(33065),
|
|
|
increaseQuantifierByOne = _require.increaseQuantifierByOne;
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to combine repeating patterns.
|
|
|
*
|
|
|
* /^abcabcabc/ -> /^abc{3}/
|
|
|
* /^(?:abc){2}abc/ -> /^(?:abc){3}/
|
|
|
* /^abc(?:abc){2}/ -> /^(?:abc){3}/
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
Alternative: function Alternative(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
// We can skip the first child
|
|
|
|
|
|
var index = 1;
|
|
|
while (index < node.expressions.length) {
|
|
|
var child = path.getChild(index);
|
|
|
index = Math.max(1, combineRepeatingPatternLeft(path, child, index));
|
|
|
|
|
|
if (index >= node.expressions.length) {
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
child = path.getChild(index);
|
|
|
index = Math.max(1, combineWithPreviousRepetition(path, child, index));
|
|
|
|
|
|
if (index >= node.expressions.length) {
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
child = path.getChild(index);
|
|
|
index = Math.max(1, combineRepetitionWithPrevious(path, child, index));
|
|
|
|
|
|
index++;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
// abcabc -> (?:abc){2}
|
|
|
function combineRepeatingPatternLeft(alternative, child, index) {
|
|
|
var node = alternative.node;
|
|
|
|
|
|
|
|
|
var nbPossibleLengths = Math.ceil(index / 2);
|
|
|
var i = 0;
|
|
|
|
|
|
while (i < nbPossibleLengths) {
|
|
|
var startIndex = index - 2 * i - 1;
|
|
|
var right = void 0,
|
|
|
left = void 0;
|
|
|
|
|
|
if (i === 0) {
|
|
|
right = child;
|
|
|
left = alternative.getChild(startIndex);
|
|
|
} else {
|
|
|
right = NodePath.getForNode({
|
|
|
type: 'Alternative',
|
|
|
expressions: [].concat(_toConsumableArray(node.expressions.slice(index - i, index)), [child.node])
|
|
|
});
|
|
|
|
|
|
left = NodePath.getForNode({
|
|
|
type: 'Alternative',
|
|
|
expressions: [].concat(_toConsumableArray(node.expressions.slice(startIndex, index - i)))
|
|
|
});
|
|
|
}
|
|
|
|
|
|
if (right.hasEqualSource(left)) {
|
|
|
for (var j = 0; j < 2 * i + 1; j++) {
|
|
|
alternative.getChild(startIndex).remove();
|
|
|
}
|
|
|
|
|
|
child.replace({
|
|
|
type: 'Repetition',
|
|
|
expression: i === 0 && right.node.type !== 'Repetition' ? right.node : {
|
|
|
type: 'Group',
|
|
|
capturing: false,
|
|
|
expression: right.node
|
|
|
},
|
|
|
quantifier: {
|
|
|
type: 'Quantifier',
|
|
|
kind: 'Range',
|
|
|
from: 2,
|
|
|
to: 2,
|
|
|
greedy: true
|
|
|
}
|
|
|
});
|
|
|
return startIndex;
|
|
|
}
|
|
|
|
|
|
i++;
|
|
|
}
|
|
|
|
|
|
return index;
|
|
|
}
|
|
|
|
|
|
// (?:abc){2}abc -> (?:abc){3}
|
|
|
function combineWithPreviousRepetition(alternative, child, index) {
|
|
|
var node = alternative.node;
|
|
|
|
|
|
|
|
|
var i = 0;
|
|
|
while (i < index) {
|
|
|
var previousChild = alternative.getChild(i);
|
|
|
|
|
|
if (previousChild.node.type === 'Repetition' && previousChild.node.quantifier.greedy) {
|
|
|
var left = previousChild.getChild();
|
|
|
var right = void 0;
|
|
|
|
|
|
if (left.node.type === 'Group' && !left.node.capturing) {
|
|
|
left = left.getChild();
|
|
|
}
|
|
|
|
|
|
if (i + 1 === index) {
|
|
|
right = child;
|
|
|
if (right.node.type === 'Group' && !right.node.capturing) {
|
|
|
right = right.getChild();
|
|
|
}
|
|
|
} else {
|
|
|
right = NodePath.getForNode({
|
|
|
type: 'Alternative',
|
|
|
expressions: [].concat(_toConsumableArray(node.expressions.slice(i + 1, index + 1)))
|
|
|
});
|
|
|
}
|
|
|
|
|
|
if (left.hasEqualSource(right)) {
|
|
|
for (var j = i; j < index; j++) {
|
|
|
alternative.getChild(i + 1).remove();
|
|
|
}
|
|
|
|
|
|
increaseQuantifierByOne(previousChild.node.quantifier);
|
|
|
|
|
|
return i;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
i++;
|
|
|
}
|
|
|
return index;
|
|
|
}
|
|
|
|
|
|
// abc(?:abc){2} -> (?:abc){3}
|
|
|
function combineRepetitionWithPrevious(alternative, child, index) {
|
|
|
var node = alternative.node;
|
|
|
|
|
|
|
|
|
if (child.node.type === 'Repetition' && child.node.quantifier.greedy) {
|
|
|
var right = child.getChild();
|
|
|
var left = void 0;
|
|
|
|
|
|
if (right.node.type === 'Group' && !right.node.capturing) {
|
|
|
right = right.getChild();
|
|
|
}
|
|
|
|
|
|
var rightLength = void 0;
|
|
|
if (right.node.type === 'Alternative') {
|
|
|
rightLength = right.node.expressions.length;
|
|
|
left = NodePath.getForNode({
|
|
|
type: 'Alternative',
|
|
|
expressions: [].concat(_toConsumableArray(node.expressions.slice(index - rightLength, index)))
|
|
|
});
|
|
|
} else {
|
|
|
rightLength = 1;
|
|
|
left = alternative.getChild(index - 1);
|
|
|
if (left.node.type === 'Group' && !left.node.capturing) {
|
|
|
left = left.getChild();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (left.hasEqualSource(right)) {
|
|
|
for (var j = index - rightLength; j < index; j++) {
|
|
|
alternative.getChild(index - rightLength).remove();
|
|
|
}
|
|
|
|
|
|
increaseQuantifierByOne(child.node.quantifier);
|
|
|
|
|
|
return index - rightLength;
|
|
|
}
|
|
|
}
|
|
|
return index;
|
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 52340:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var NodePath = __webpack_require__(53636);
|
|
|
|
|
|
var _require = __webpack_require__(33065),
|
|
|
disjunctionToList = _require.disjunctionToList,
|
|
|
listToDisjunction = _require.listToDisjunction;
|
|
|
|
|
|
/**
|
|
|
* Removes duplicates from a disjunction sequence:
|
|
|
*
|
|
|
* /(ab|bc|ab)+(xy|xy)+/ -> /(ab|bc)+(xy)+/
|
|
|
*/
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
Disjunction: function Disjunction(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
// Make unique nodes.
|
|
|
|
|
|
var uniqueNodesMap = {};
|
|
|
|
|
|
var parts = disjunctionToList(node).filter(function (part) {
|
|
|
var encoded = part ? NodePath.getForNode(part).jsonEncode() : 'null';
|
|
|
|
|
|
// Already recorded this part, filter out.
|
|
|
if (uniqueNodesMap.hasOwnProperty(encoded)) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
uniqueNodesMap[encoded] = part;
|
|
|
return true;
|
|
|
});
|
|
|
|
|
|
// Replace with the optimized disjunction.
|
|
|
path.replace(listToDisjunction(parts));
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 68794:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to replace single char group disjunction to char group
|
|
|
*
|
|
|
* a|b|c -> [abc]
|
|
|
* [12]|3|4 -> [1234]
|
|
|
* (a|b|c) -> ([abc])
|
|
|
* (?:a|b|c) -> [abc]
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
Disjunction: function Disjunction(path) {
|
|
|
var node = path.node,
|
|
|
parent = path.parent;
|
|
|
|
|
|
|
|
|
if (!handlers[parent.type]) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var charset = new Map();
|
|
|
|
|
|
if (!shouldProcess(node, charset) || !charset.size) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var characterClass = {
|
|
|
type: 'CharacterClass',
|
|
|
expressions: Array.from(charset.keys()).sort().map(function (key) {
|
|
|
return charset.get(key);
|
|
|
})
|
|
|
};
|
|
|
|
|
|
handlers[parent.type](path.getParent(), characterClass);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
var handlers = {
|
|
|
RegExp: function RegExp(path, characterClass) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
node.body = characterClass;
|
|
|
},
|
|
|
Group: function Group(path, characterClass) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (node.capturing) {
|
|
|
node.expression = characterClass;
|
|
|
} else {
|
|
|
path.replace(characterClass);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
function shouldProcess(expression, charset) {
|
|
|
if (!expression) {
|
|
|
// Abort on empty disjunction part
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var type = expression.type;
|
|
|
|
|
|
|
|
|
if (type === 'Disjunction') {
|
|
|
var left = expression.left,
|
|
|
right = expression.right;
|
|
|
|
|
|
|
|
|
return shouldProcess(left, charset) && shouldProcess(right, charset);
|
|
|
} else if (type === 'Char') {
|
|
|
if (expression.kind === 'meta' && expression.symbol === '.') {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
var value = expression.value;
|
|
|
|
|
|
|
|
|
charset.set(value, expression);
|
|
|
|
|
|
return true;
|
|
|
} else if (type === 'CharacterClass' && !expression.negative) {
|
|
|
return expression.expressions.every(function (expression) {
|
|
|
return shouldProcess(expression, charset);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 35292:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = new Map([
|
|
|
// \ud83d\ude80 -> \u{1f680}
|
|
|
['charSurrogatePairToSingleUnicode', __webpack_require__(87126)],
|
|
|
|
|
|
// \u0061 -> a
|
|
|
['charCodeToSimpleChar', __webpack_require__(53540)],
|
|
|
|
|
|
// /Aa/i -> /aa/i
|
|
|
['charCaseInsensitiveLowerCaseTransform', __webpack_require__(30223)],
|
|
|
|
|
|
// [\d\d] -> [\d]
|
|
|
['charClassRemoveDuplicates', __webpack_require__(56885)],
|
|
|
|
|
|
// a{1,2}a{2,3} -> a{3,5}
|
|
|
['quantifiersMerge', __webpack_require__(44035)],
|
|
|
|
|
|
// a{1,} -> a+, a{3,3} -> a{3}, a{1} -> a
|
|
|
['quantifierRangeToSymbol', __webpack_require__(48264)],
|
|
|
|
|
|
// [a-a] -> [a], [a-b] -> [ab]
|
|
|
['charClassClassrangesToChars', __webpack_require__(65501)],
|
|
|
|
|
|
// [0-9] -> [\d]
|
|
|
['charClassToMeta', __webpack_require__(77698)],
|
|
|
|
|
|
// [\d] -> \d, [^\w] -> \W
|
|
|
['charClassToSingleChar', __webpack_require__(77867)],
|
|
|
|
|
|
// \e -> e
|
|
|
['charEscapeUnescape', __webpack_require__(7421)],
|
|
|
|
|
|
// [a-de-f] -> [a-f]
|
|
|
['charClassClassrangesMerge', __webpack_require__(94251)],
|
|
|
|
|
|
// (ab|ab) -> (ab)
|
|
|
['disjunctionRemoveDuplicates', __webpack_require__(52340)],
|
|
|
|
|
|
// (a|b|c) -> [abc]
|
|
|
['groupSingleCharsToCharClass', __webpack_require__(68794)],
|
|
|
|
|
|
// (?:)a -> a
|
|
|
['removeEmptyGroup', __webpack_require__(74169)],
|
|
|
|
|
|
// (?:a) -> a
|
|
|
['ungroup', __webpack_require__(47188)],
|
|
|
|
|
|
// abcabcabc -> (?:abc){3}
|
|
|
['combineRepeatingPatterns', __webpack_require__(92879)]]);
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 48264:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to replace different range-based quantifiers
|
|
|
* with their symbol equivalents.
|
|
|
*
|
|
|
* a{0,} -> a*
|
|
|
* a{1,} -> a+
|
|
|
* a{1} -> a
|
|
|
*
|
|
|
* NOTE: the following is automatically handled in the generator:
|
|
|
*
|
|
|
* a{3,3} -> a{3}
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
Quantifier: function Quantifier(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (node.kind !== 'Range') {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// a{0,} -> a*
|
|
|
rewriteOpenZero(path);
|
|
|
|
|
|
// a{1,} -> a+
|
|
|
rewriteOpenOne(path);
|
|
|
|
|
|
// a{1} -> a
|
|
|
rewriteExactOne(path);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
function rewriteOpenZero(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (node.from !== 0 || node.to) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
node.kind = '*';
|
|
|
delete node.from;
|
|
|
}
|
|
|
|
|
|
function rewriteOpenOne(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (node.from !== 1 || node.to) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
node.kind = '+';
|
|
|
delete node.from;
|
|
|
}
|
|
|
|
|
|
function rewriteExactOne(path) {
|
|
|
var node = path.node;
|
|
|
|
|
|
|
|
|
if (node.from !== 1 || node.to !== 1) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
path.parentPath.replace(path.parentPath.node.expression);
|
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 44035:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var _require = __webpack_require__(33065),
|
|
|
increaseQuantifierByOne = _require.increaseQuantifierByOne;
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to merge quantifiers
|
|
|
*
|
|
|
* a+a+ -> a{2,}
|
|
|
* a{2}a{3} -> a{5}
|
|
|
* a{1,2}a{2,3} -> a{3,5}
|
|
|
*/
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
Repetition: function Repetition(path) {
|
|
|
var node = path.node,
|
|
|
parent = path.parent;
|
|
|
|
|
|
|
|
|
if (parent.type !== 'Alternative' || !path.index) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var previousSibling = path.getPreviousSibling();
|
|
|
|
|
|
if (!previousSibling) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (previousSibling.node.type === 'Repetition') {
|
|
|
if (!previousSibling.getChild().hasEqualSource(path.getChild())) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var _extractFromTo = extractFromTo(previousSibling.node.quantifier),
|
|
|
previousSiblingFrom = _extractFromTo.from,
|
|
|
previousSiblingTo = _extractFromTo.to;
|
|
|
|
|
|
var _extractFromTo2 = extractFromTo(node.quantifier),
|
|
|
nodeFrom = _extractFromTo2.from,
|
|
|
nodeTo = _extractFromTo2.to;
|
|
|
|
|
|
// It's does not seem reliable to merge quantifiers with different greediness
|
|
|
// when none of both is a greedy open range
|
|
|
|
|
|
|
|
|
if (previousSibling.node.quantifier.greedy !== node.quantifier.greedy && !isGreedyOpenRange(previousSibling.node.quantifier) && !isGreedyOpenRange(node.quantifier)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// a*a* -> a*
|
|
|
// a*a+ -> a+
|
|
|
// a+a+ -> a{2,}
|
|
|
// a{2}a{4} -> a{6}
|
|
|
// a{1,2}a{2,3} -> a{3,5}
|
|
|
// a{1,}a{2,} -> a{3,}
|
|
|
// a+a{2,} -> a{3,}
|
|
|
|
|
|
// a??a{2,} -> a{2,}
|
|
|
// a*?a{2,} -> a{2,}
|
|
|
// a+?a{2,} -> a{3,}
|
|
|
|
|
|
node.quantifier.kind = 'Range';
|
|
|
node.quantifier.from = previousSiblingFrom + nodeFrom;
|
|
|
if (previousSiblingTo && nodeTo) {
|
|
|
node.quantifier.to = previousSiblingTo + nodeTo;
|
|
|
} else {
|
|
|
delete node.quantifier.to;
|
|
|
}
|
|
|
if (isGreedyOpenRange(previousSibling.node.quantifier) || isGreedyOpenRange(node.quantifier)) {
|
|
|
node.quantifier.greedy = true;
|
|
|
}
|
|
|
|
|
|
previousSibling.remove();
|
|
|
} else {
|
|
|
if (!previousSibling.hasEqualSource(path.getChild())) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
increaseQuantifierByOne(node.quantifier);
|
|
|
previousSibling.remove();
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
function isGreedyOpenRange(quantifier) {
|
|
|
return quantifier.greedy && (quantifier.kind === '+' || quantifier.kind === '*' || quantifier.kind === 'Range' && !quantifier.to);
|
|
|
}
|
|
|
|
|
|
function extractFromTo(quantifier) {
|
|
|
var from = void 0,
|
|
|
to = void 0;
|
|
|
if (quantifier.kind === '*') {
|
|
|
from = 0;
|
|
|
} else if (quantifier.kind === '+') {
|
|
|
from = 1;
|
|
|
} else if (quantifier.kind === '?') {
|
|
|
from = 0;
|
|
|
to = 1;
|
|
|
} else {
|
|
|
from = quantifier.from;
|
|
|
if (quantifier.to) {
|
|
|
to = quantifier.to;
|
|
|
}
|
|
|
}
|
|
|
return { from: from, to: to };
|
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 74169:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to remove non-capturing empty groups.
|
|
|
*
|
|
|
* /(?:)a/ -> /a/
|
|
|
* /a|(?:)/ -> /a|/
|
|
|
*/
|
|
|
|
|
|
module.exports = {
|
|
|
Group: function Group(path) {
|
|
|
var node = path.node,
|
|
|
parent = path.parent;
|
|
|
|
|
|
var childPath = path.getChild();
|
|
|
|
|
|
if (node.capturing || childPath) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (parent.type === 'Repetition') {
|
|
|
|
|
|
path.getParent().replace(node);
|
|
|
} else if (parent.type !== 'RegExp') {
|
|
|
|
|
|
path.remove();
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 47188:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* A regexp-tree plugin to remove unnecessary groups.
|
|
|
*
|
|
|
* /(?:a)/ -> /a/
|
|
|
*/
|
|
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
|
|
module.exports = {
|
|
|
Group: function Group(path) {
|
|
|
var node = path.node,
|
|
|
parent = path.parent;
|
|
|
|
|
|
var childPath = path.getChild();
|
|
|
|
|
|
if (node.capturing || !childPath) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// Don't optimize \1(?:0) to \10
|
|
|
if (!hasAppropriateSiblings(path)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// Don't optimize /a(?:b|c)/ to /ab|c/
|
|
|
// but /(?:b|c)/ to /b|c/ is ok
|
|
|
if (childPath.node.type === 'Disjunction' && parent.type !== 'RegExp') {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// Don't optimize /(?:ab)+/ to /ab+/
|
|
|
// but /(?:a)+/ to /a+/ is ok
|
|
|
// and /(?:[a-d])+/ to /[a-d]+/ is ok too
|
|
|
if (parent.type === 'Repetition' && childPath.node.type !== 'Char' && childPath.node.type !== 'CharacterClass') {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (childPath.node.type === 'Alternative') {
|
|
|
var parentPath = path.getParent();
|
|
|
if (parentPath.node.type === 'Alternative') {
|
|
|
// /abc(?:def)ghi/ When (?:def) is ungrouped its content must be merged with parent alternative
|
|
|
|
|
|
parentPath.replace({
|
|
|
type: 'Alternative',
|
|
|
expressions: [].concat(_toConsumableArray(parent.expressions.slice(0, path.index)), _toConsumableArray(childPath.node.expressions), _toConsumableArray(parent.expressions.slice(path.index + 1)))
|
|
|
});
|
|
|
}
|
|
|
} else {
|
|
|
path.replace(childPath.node);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
function hasAppropriateSiblings(path) {
|
|
|
var parent = path.parent,
|
|
|
index = path.index;
|
|
|
|
|
|
|
|
|
if (parent.type !== 'Alternative') {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
var previousNode = parent.expressions[index - 1];
|
|
|
if (previousNode == null) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
// Don't optimized \1(?:0) to \10
|
|
|
if (previousNode.type === 'Backreference' && previousNode.kind === 'number') {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
// Don't optimized \2(?:0) to \20
|
|
|
if (previousNode.type === 'Char' && previousNode.kind === 'decimal') {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 19495:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* LR parser generated by the Syntax tool.
|
|
|
*
|
|
|
* https://www.npmjs.com/package/syntax-cli
|
|
|
*
|
|
|
* npm install -g syntax-cli
|
|
|
*
|
|
|
* syntax-cli --help
|
|
|
*
|
|
|
* To regenerate run:
|
|
|
*
|
|
|
* syntax-cli \
|
|
|
* --grammar ~/path-to-grammar-file \
|
|
|
* --mode <parsing-mode> \
|
|
|
* --output ~/path-to-output-parser-file.js
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Matched token text.
|
|
|
*/
|
|
|
|
|
|
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
|
|
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
|
|
var yytext = void 0;
|
|
|
|
|
|
/**
|
|
|
* Length of the matched token text.
|
|
|
*/
|
|
|
var yyleng = void 0;
|
|
|
|
|
|
/**
|
|
|
* Storage object.
|
|
|
*/
|
|
|
var yy = {};
|
|
|
|
|
|
/**
|
|
|
* Result of semantic action.
|
|
|
*/
|
|
|
var __ = void 0;
|
|
|
|
|
|
/**
|
|
|
* Result location object.
|
|
|
*/
|
|
|
var __loc = void 0;
|
|
|
|
|
|
function yyloc(start, end) {
|
|
|
if (!yy.options.captureLocations) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
// Epsilon doesn't produce location.
|
|
|
if (!start || !end) {
|
|
|
return start || end;
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
startOffset: start.startOffset,
|
|
|
endOffset: end.endOffset,
|
|
|
startLine: start.startLine,
|
|
|
endLine: end.endLine,
|
|
|
startColumn: start.startColumn,
|
|
|
endColumn: end.endColumn
|
|
|
};
|
|
|
}
|
|
|
|
|
|
var EOF = '$';
|
|
|
|
|
|
/**
|
|
|
* List of productions (generated by Syntax tool).
|
|
|
*/
|
|
|
var productions = [[-1, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [0, 4, function (_1, _2, _3, _4, _1loc, _2loc, _3loc, _4loc) {
|
|
|
__loc = yyloc(_1loc, _4loc);
|
|
|
__ = Node({
|
|
|
type: 'RegExp',
|
|
|
body: _2,
|
|
|
flags: checkFlags(_4)
|
|
|
}, loc(_1loc, _4loc || _3loc));
|
|
|
}], [1, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [1, 0, function () {
|
|
|
__loc = null;__ = '';
|
|
|
}], [2, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [2, 2, function (_1, _2, _1loc, _2loc) {
|
|
|
__loc = yyloc(_1loc, _2loc);__ = _1 + _2;
|
|
|
}], [3, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [4, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [4, 3, function (_1, _2, _3, _1loc, _2loc, _3loc) {
|
|
|
__loc = yyloc(_1loc, _3loc);
|
|
|
// Location for empty disjunction: /|/
|
|
|
var _loc = null;
|
|
|
|
|
|
if (_2loc) {
|
|
|
_loc = loc(_1loc || _2loc, _3loc || _2loc);
|
|
|
};
|
|
|
|
|
|
__ = Node({
|
|
|
type: 'Disjunction',
|
|
|
left: _1,
|
|
|
right: _3
|
|
|
}, _loc);
|
|
|
}], [5, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);
|
|
|
if (_1.length === 0) {
|
|
|
__ = null;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (_1.length === 1) {
|
|
|
__ = Node(_1[0], __loc);
|
|
|
} else {
|
|
|
__ = Node({
|
|
|
type: 'Alternative',
|
|
|
expressions: _1
|
|
|
}, __loc);
|
|
|
}
|
|
|
}], [6, 0, function () {
|
|
|
__loc = null;__ = [];
|
|
|
}], [6, 2, function (_1, _2, _1loc, _2loc) {
|
|
|
__loc = yyloc(_1loc, _2loc);__ = _1.concat(_2);
|
|
|
}], [7, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Node(Object.assign({ type: 'Assertion' }, _1), __loc);
|
|
|
}], [7, 2, function (_1, _2, _1loc, _2loc) {
|
|
|
__loc = yyloc(_1loc, _2loc);
|
|
|
__ = _1;
|
|
|
|
|
|
if (_2) {
|
|
|
__ = Node({
|
|
|
type: 'Repetition',
|
|
|
expression: _1,
|
|
|
quantifier: _2
|
|
|
}, __loc);
|
|
|
}
|
|
|
}], [8, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = { kind: '^' };
|
|
|
}], [8, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = { kind: '$' };
|
|
|
}], [8, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = { kind: '\\b' };
|
|
|
}], [8, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = { kind: '\\B' };
|
|
|
}], [8, 3, function (_1, _2, _3, _1loc, _2loc, _3loc) {
|
|
|
__loc = yyloc(_1loc, _3loc);
|
|
|
__ = {
|
|
|
kind: 'Lookahead',
|
|
|
assertion: _2
|
|
|
};
|
|
|
}], [8, 3, function (_1, _2, _3, _1loc, _2loc, _3loc) {
|
|
|
__loc = yyloc(_1loc, _3loc);
|
|
|
__ = {
|
|
|
kind: 'Lookahead',
|
|
|
negative: true,
|
|
|
assertion: _2
|
|
|
};
|
|
|
}], [8, 3, function (_1, _2, _3, _1loc, _2loc, _3loc) {
|
|
|
__loc = yyloc(_1loc, _3loc);
|
|
|
__ = {
|
|
|
kind: 'Lookbehind',
|
|
|
assertion: _2
|
|
|
};
|
|
|
}], [8, 3, function (_1, _2, _3, _1loc, _2loc, _3loc) {
|
|
|
__loc = yyloc(_1loc, _3loc);
|
|
|
__ = {
|
|
|
kind: 'Lookbehind',
|
|
|
negative: true,
|
|
|
assertion: _2
|
|
|
};
|
|
|
}], [9, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [9, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [9, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Char(_1, 'simple', __loc);
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Char(_1.slice(1), 'simple', __loc);__.escaped = true;
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Char(_1, 'unicode', __loc);__.isSurrogatePair = true;
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Char(_1, 'unicode', __loc);
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = UnicodeProperty(_1, __loc);
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Char(_1, 'control', __loc);
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Char(_1, 'hex', __loc);
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Char(_1, 'oct', __loc);
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = GroupRefOrDecChar(_1, __loc);
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Char(_1, 'meta', __loc);
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Char(_1, 'meta', __loc);
|
|
|
}], [10, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = NamedGroupRefOrChars(_1, _1loc);
|
|
|
}], [11, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [11, 0], [12, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [12, 2, function (_1, _2, _1loc, _2loc) {
|
|
|
__loc = yyloc(_1loc, _2loc);
|
|
|
_1.greedy = false;
|
|
|
__ = _1;
|
|
|
}], [13, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);
|
|
|
__ = Node({
|
|
|
type: 'Quantifier',
|
|
|
kind: _1,
|
|
|
greedy: true
|
|
|
}, __loc);
|
|
|
}], [13, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);
|
|
|
__ = Node({
|
|
|
type: 'Quantifier',
|
|
|
kind: _1,
|
|
|
greedy: true
|
|
|
}, __loc);
|
|
|
}], [13, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);
|
|
|
__ = Node({
|
|
|
type: 'Quantifier',
|
|
|
kind: _1,
|
|
|
greedy: true
|
|
|
}, __loc);
|
|
|
}], [13, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);
|
|
|
var range = getRange(_1);
|
|
|
__ = Node({
|
|
|
type: 'Quantifier',
|
|
|
kind: 'Range',
|
|
|
from: range[0],
|
|
|
to: range[0],
|
|
|
greedy: true
|
|
|
}, __loc);
|
|
|
}], [13, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);
|
|
|
__ = Node({
|
|
|
type: 'Quantifier',
|
|
|
kind: 'Range',
|
|
|
from: getRange(_1)[0],
|
|
|
greedy: true
|
|
|
}, __loc);
|
|
|
}], [13, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);
|
|
|
var range = getRange(_1);
|
|
|
__ = Node({
|
|
|
type: 'Quantifier',
|
|
|
kind: 'Range',
|
|
|
from: range[0],
|
|
|
to: range[1],
|
|
|
greedy: true
|
|
|
}, __loc);
|
|
|
}], [14, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [14, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [15, 3, function (_1, _2, _3, _1loc, _2loc, _3loc) {
|
|
|
__loc = yyloc(_1loc, _3loc);
|
|
|
var nameRaw = String(_1);
|
|
|
var name = decodeUnicodeGroupName(nameRaw);
|
|
|
if (!yy.options.allowGroupNameDuplicates && namedGroups.hasOwnProperty(name)) {
|
|
|
throw new SyntaxError('Duplicate of the named group "' + name + '".');
|
|
|
}
|
|
|
|
|
|
namedGroups[name] = _1.groupNumber;
|
|
|
|
|
|
__ = Node({
|
|
|
type: 'Group',
|
|
|
capturing: true,
|
|
|
name: name,
|
|
|
nameRaw: nameRaw,
|
|
|
number: _1.groupNumber,
|
|
|
expression: _2
|
|
|
}, __loc);
|
|
|
}], [15, 3, function (_1, _2, _3, _1loc, _2loc, _3loc) {
|
|
|
__loc = yyloc(_1loc, _3loc);
|
|
|
__ = Node({
|
|
|
type: 'Group',
|
|
|
capturing: true,
|
|
|
number: _1.groupNumber,
|
|
|
expression: _2
|
|
|
}, __loc);
|
|
|
}], [16, 3, function (_1, _2, _3, _1loc, _2loc, _3loc) {
|
|
|
__loc = yyloc(_1loc, _3loc);
|
|
|
__ = Node({
|
|
|
type: 'Group',
|
|
|
capturing: false,
|
|
|
expression: _2
|
|
|
}, __loc);
|
|
|
}], [17, 3, function (_1, _2, _3, _1loc, _2loc, _3loc) {
|
|
|
__loc = yyloc(_1loc, _3loc);
|
|
|
__ = Node({
|
|
|
type: 'CharacterClass',
|
|
|
negative: true,
|
|
|
expressions: _2
|
|
|
}, __loc);
|
|
|
}], [17, 3, function (_1, _2, _3, _1loc, _2loc, _3loc) {
|
|
|
__loc = yyloc(_1loc, _3loc);
|
|
|
__ = Node({
|
|
|
type: 'CharacterClass',
|
|
|
expressions: _2
|
|
|
}, __loc);
|
|
|
}], [18, 0, function () {
|
|
|
__loc = null;__ = [];
|
|
|
}], [18, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [19, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = [_1];
|
|
|
}], [19, 2, function (_1, _2, _1loc, _2loc) {
|
|
|
__loc = yyloc(_1loc, _2loc);__ = [_1].concat(_2);
|
|
|
}], [19, 4, function (_1, _2, _3, _4, _1loc, _2loc, _3loc, _4loc) {
|
|
|
__loc = yyloc(_1loc, _4loc);
|
|
|
checkClassRange(_1, _3);
|
|
|
|
|
|
__ = [Node({
|
|
|
type: 'ClassRange',
|
|
|
from: _1,
|
|
|
to: _3
|
|
|
}, loc(_1loc, _3loc))];
|
|
|
|
|
|
if (_4) {
|
|
|
__ = __.concat(_4);
|
|
|
}
|
|
|
}], [20, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [20, 2, function (_1, _2, _1loc, _2loc) {
|
|
|
__loc = yyloc(_1loc, _2loc);__ = [_1].concat(_2);
|
|
|
}], [20, 4, function (_1, _2, _3, _4, _1loc, _2loc, _3loc, _4loc) {
|
|
|
__loc = yyloc(_1loc, _4loc);
|
|
|
checkClassRange(_1, _3);
|
|
|
|
|
|
__ = [Node({
|
|
|
type: 'ClassRange',
|
|
|
from: _1,
|
|
|
to: _3
|
|
|
}, loc(_1loc, _3loc))];
|
|
|
|
|
|
if (_4) {
|
|
|
__ = __.concat(_4);
|
|
|
}
|
|
|
}], [21, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Char(_1, 'simple', __loc);
|
|
|
}], [21, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [22, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = _1;
|
|
|
}], [22, 1, function (_1, _1loc) {
|
|
|
__loc = yyloc(_1loc, _1loc);__ = Char(_1, 'meta', __loc);
|
|
|
}]];
|
|
|
|
|
|
/**
|
|
|
* Encoded tokens map.
|
|
|
*/
|
|
|
var tokens = { "SLASH": "23", "CHAR": "24", "BAR": "25", "BOS": "26", "EOS": "27", "ESC_b": "28", "ESC_B": "29", "POS_LA_ASSERT": "30", "R_PAREN": "31", "NEG_LA_ASSERT": "32", "POS_LB_ASSERT": "33", "NEG_LB_ASSERT": "34", "ESC_CHAR": "35", "U_CODE_SURROGATE": "36", "U_CODE": "37", "U_PROP_VALUE_EXP": "38", "CTRL_CH": "39", "HEX_CODE": "40", "OCT_CODE": "41", "DEC_CODE": "42", "META_CHAR": "43", "ANY": "44", "NAMED_GROUP_REF": "45", "Q_MARK": "46", "STAR": "47", "PLUS": "48", "RANGE_EXACT": "49", "RANGE_OPEN": "50", "RANGE_CLOSED": "51", "NAMED_CAPTURE_GROUP": "52", "L_PAREN": "53", "NON_CAPTURE_GROUP": "54", "NEG_CLASS": "55", "R_BRACKET": "56", "L_BRACKET": "57", "DASH": "58", "$": "59" };
|
|
|
|
|
|
/**
|
|
|
* Parsing table (generated by Syntax tool).
|
|
|
*/
|
|
|
var table = [{ "0": 1, "23": "s2" }, { "59": "acc" }, { "3": 3, "4": 4, "5": 5, "6": 6, "23": "r10", "24": "r10", "25": "r10", "26": "r10", "27": "r10", "28": "r10", "29": "r10", "30": "r10", "32": "r10", "33": "r10", "34": "r10", "35": "r10", "36": "r10", "37": "r10", "38": "r10", "39": "r10", "40": "r10", "41": "r10", "42": "r10", "43": "r10", "44": "r10", "45": "r10", "52": "r10", "53": "r10", "54": "r10", "55": "r10", "57": "r10" }, { "23": "s7" }, { "23": "r6", "25": "s12" }, { "23": "r7", "25": "r7", "31": "r7" }, { "7": 14, "8": 15, "9": 16, "10": 25, "14": 27, "15": 42, "16": 43, "17": 26, "23": "r9", "24": "s28", "25": "r9", "26": "s17", "27": "s18", "28": "s19", "29": "s20", "30": "s21", "31": "r9", "32": "s22", "33": "s23", "34": "s24", "35": "s29", "36": "s30", "37": "s31", "38": "s32", "39": "s33", "40": "s34", "41": "s35", "42": "s36", "43": "s37", "44": "s38", "45": "s39", "52": "s44", "53": "s45", "54": "s46", "55": "s40", "57": "s41" }, { "1": 8, "2": 9, "24": "s10", "59": "r3" }, { "59": "r1" }, { "24": "s11", "59": "r2" }, { "24": "r4", "59": "r4" }, { "24": "r5", "59": "r5" }, { "5": 13, "6": 6, "23": "r10", "24": "r10", "25": "r10", "26": "r10", "27": "r10", "28": "r10", "29": "r10", "30": "r10", "31": "r10", "32": "r10", "33": "r10", "34": "r10", "35": "r10", "36": "r10", "37": "r10", "38": "r10", "39": "r10", "40": "r10", "41": "r10", "42": "r10", "43": "r10", "44": "r10", "45": "r10", "52": "r10", "53": "r10", "54": "r10", "55": "r10", "57": "r10" }, { "23": "r8", "25": "r8", "31": "r8" }, { "23": "r11", "24": "r11", "25": "r11", "26": "r11", "27": "r11", "28": "r11", "29": "r11", "30": "r11", "31": "r11", "32": "r11", "33": "r11", "34": "r11", "35": "r11", "36": "r11", "37": "r11", "38": "r11", "39": "r11", "40": "r11", "41": "r11", "42": "r11", "43": "r11", "44": "r11", "45": "r11", "52": "r11", "53": "r11", "54": "r11", "55": "r11", "57": "r11" }, { "23": "r12", "24": "r12", "25": "r12", "26": "r12", "27": "r12", "28": "r12", "29": "r12", "30": "r12", "31": "r12", "32": "r12", "33": "r12", "34": "r12", "35": "r12", "36": "r12", "37": "r12", "38": "r12", "39": "r12", "40": "r12", "41": "r12", "42": "r12", "43": "r12", "44": "r12", "45": "r12", "52": "r12", "53": "r12", "54": "r12", "55": "r12", "57": "r12" }, { "11": 47, "12": 48, "13": 49, "23": "r38", "24": "r38", "25": "r38", "26": "r38", "27": "r38", "28": "r38", "29": "r38", "30": "r38", "31": "r38", "32": "r38", "33": "r38", "34": "r38", "35": "r38", "36": "r38", "37": "r38", "38": "r38", "39": "r38", "40": "r38", "41": "r38", "42": "r38", "43": "r38", "44": "r38", "45": "r38", "46": "s52", "47": "s50", "48": "s51", "49": "s53", "50": "s54", "51": "s55", "52": "r38", "53": "r38", "54": "r38", "55": "r38", "57": "r38" }, { "23": "r14", "24": "r14", "25": "r14", "26": "r14", "27": "r14", "28": "r14", "29": "r14", "30": "r14", "31": "r14", "32": "r14", "33": "r14", "34": "r14", "35": "r14", "36": "r14", "37": "r14", "38": "r14", "39": "r14", "40": "r14", "41": "r14", "42": "r14", "43": "r14", "44": "r14", "45": "r14", "52": "r14", "53": "r14", "54": "r14", "55": "r14", "57": "r14" }, { "23": "r15", "24": "r15", "25": "r15", "26": "r15", "27": "r15", "28": "r15", "29": "r15", "30": "r15", "31": "r15", "32": "r15", "33": "r15", "34": "r15", "35": "r15", "36": "r15", "37": "r15", "38": "r15", "39": "r15", "40": "r15", "41": "r15", "42": "r15", "43": "r15", "44": "r15", "45": "r15", "52": "r15", "53": "r15", "54": "r15", "55": "r15", "57": "r15" }, { "23": "r16", "24": "r16", "25": "r16", "26": "r16", "27": "r16", "28": "r16", "29": "r16", "30": "r16", "31": "r16", "32": "r16", "33": "r16", "34": "r16", "35": "r16", "36": "r16", "37": "r16", "38": "r16", "39": "r16", "40": "r16", "41": "r16", "42": "r16", "43": "r16", "44": "r16", "45": "r16", "52": "r16", "53": "r16", "54": "r16", "55": "r16", "57": "r16" }, { "23": "r17", "24": "r17", "25": "r17", "26": "r17", "27": "r17", "28": "r17", "29": "r17", "30": "r17", "31": "r17", "32": "r17", "33": "r17", "34": "r17", "35": "r17", "36": "r17", "37": "r17", "38": "r17", "39": "r17", "40": "r17", "41": "r17", "42": "r17", "43": "r17", "44": "r17", "45": "r17", "52": "r17", "53": "r17", "54": "r17", "55": "r17", "57": "r17" }, { "4": 57, "5": 5, "6": 6, "24": "r10", "25": "r10", "26": "r10", "27": "r10", "28": "r10", "29": "r10", "30": "r10", "31": "r10", "32": "r10", "33": "r10", "34": "r10", "35": "r10", "36": "r10", "37": "r10", "38": "r10", "39": "r10", "40": "r10", "41": "r10", "42": "r10", "43": "r10", "44": "r10", "45": "r10", "52": "r10", "53": "r10", "54": "r10", "55": "r10", "57": "r10" }, { "4": 59, "5": 5, "6": 6, "24": "r10", "25": "r10", "26": "r10", "27": "r10", "28": "r10", "29": "r10", "30": "r10", "31": "r10", "32": "r10", "33": "r10", "34": "r10", "35": "r10", "36": "r10", "37": "r10", "38": "r10", "39": "r10", "40": "r10", "41": "r10", "42": "r10", "43": "r10", "44": "r10", "45": "r10", "52": "r10", "53": "r10", "54": "r10", "55": "r10", "57": "r10" }, { "4": 61, "5": 5, "6": 6, "24": "r10", "25": "r10", "26": "r10", "27": "r10", "28": "r10", "29": "r10", "30": "r10", "31": "r10", "32": "r10", "33": "r10", "34": "r10", "35": "r10", "36": "r10", "37": "r10", "38": "r10", "39": "r10", "40": "r10", "41": "r10", "42": "r10", "43": "r10", "44": "r10", "45": "r10", "52": "r10", "53": "r10", "54": "r10", "55": "r10", "57": "r10" }, { "4": 63, "5": 5, "6": 6, "24": "r10", "25": "r10", "26": "r10", "27": "r10", "28": "r10", "29": "r10", "30": "r10", "31": "r10", "32": "r10", "33": "r10", "34": "r10", "35": "r10", "36": "r10", "37": "r10", "38": "r10", "39": "r10", "40": "r10", "41": "r10", "42": "r10", "43": "r10", "44": "r10", "45": "r10", "52": "r10", "53": "r10", "54": "r10", "55": "r10", "57": "r10" }, { "23": "r22", "24": "r22", "25": "r22", "26": "r22", "27": "r22", "28": "r22", "29": "r22", "30": "r22", "31": "r22", "32": "r22", "33": "r22", "34": "r22", "35": "r22", "36": "r22", "37": "r22", "38": "r22", "39": "r22", "40": "r22", "41": "r22", "42": "r22", "43": "r22", "44": "r22", "45": "r22", "46": "r22", "47": "r22", "48": "r22", "49": "r22", "50": "r22", "51": "r22", "52": "r22", "53": "r22", "54": "r22", "55": "r22", "57": "r22" }, { "23": "r23", "24": "r23", "25": "r23", "26": "r23", "27": "r23", "28": "r23", "29": "r23", "30": "r23", "31": "r23", "32": "r23", "33": "r23", "34": "r23", "35": "r23", "36": "r23", "37": "r23", "38": "r23", "39": "r23", "40": "r23", "41": "r23", "42": "r23", "43": "r23", "44": "r23", "45": "r23", "46": "r23", "47": "r23", "48": "r23", "49": "r23", "50": "r23", "51": "r23", "52": "r23", "53": "r23", "54": "r23", "55": "r23", "57": "r23" }, { "23": "r24", "24": "r24", "25": "r24", "26": "r24", "27": "r24", "28": "r24", "29": "r24", "30": "r24", "31": "r24", "32": "r24", "33": "r24", "34": "r24", "35": "r24", "36": "r24", "37": "r24", "38": "r24", "39": "r24", "40": "r24", "41": "r24", "42": "r24", "43": "r24", "44": "r24", "45": "r24", "46": "r24", "47": "r24", "48": "r24", "49": "r24", "50": "r24", "51": "r24", "52": "r24", "53": "r24", "54": "r24", "55": "r24", "57": "r24" }, { "23": "r25", "24": "r25", "25": "r25", "26": "r25", "27": "r25", "28": "r25", "29": "r25", "30": "r25", "31": "r25", "32": "r25", "33": "r25", "34": "r25", "35": "r25", "36": "r25", "37": "r25", "38": "r25", "39": "r25", "40": "r25", "41": "r25", "42": "r25", "43": "r25", "44": "r25", "45": "r25", "46": "r25", "47": "r25", "48": "r25", "49": "r25", "50": "r25", "51": "r25", "52": "r25", "53": "r25", "54": "r25", "55": "r25", "56": "r25", "57": "r25", "58": "r25" }, { "23": "r26", "24": "r26", "25": "r26", "26": "r26", "27": "r26", "28": "r26", "29": "r26", "30": "r26", "31": "r26", "32": "r26", "33": "r26", "34": "r26", "35": "r26", "36": "r26", "37": "r26", "38": "r26", "39": "r26", "40": "r26", "41": "r26", "42": "r26", "43": "r26", "44": "r26", "45": "r26", "46": "r26", "47": "r26", "48": "r26", "49": "r26", "50": "r26", "51": "r26", "52": "r26", "53": "r26", "54": "r26", "55": "r26", "56": "r26", "57": "r26", "58": "r26" }, { "23": "r27", "24": "r27", "25": "r27", "26": "r27", "27": "r27", "28": "r27", "29": "r27", "30": "r27", "31": "r27", "32": "r27", "33": "r27", "34": "r27", "35": "r27", "36": "r27", "37": "r27", "38": "r27", "39": "r27", "40": "r27", "41": "r27", "42": "r27", "43": "r27", "44": "r27", "45": "r27", "46": "r27", "47": "r27", "48": "r27", "49": "r27", "50": "r27", "51": "r27", "52": "r27", "53": "r27", "54": "r27", "55": "r27", "56": "r27", "57": "r27", "58": "r27" }, { "23": "r28", "24": "r28", "25": "r28", "26": "r28", "27": "r28", "28": "r28", "29": "r28", "30": "r28", "31": "r28", "32": "r28", "33": "r28", "34": "r28", "35": "r28", "36": "r28", "37": "r28", "38": "r28", "39": "r28", "40": "r28", "41": "r28", "42": "r28", "43": "r28", "44": "r28", "45": "r28", "46": "r28", "47": "r28", "48": "r28", "49": "r28", "50": "r28", "51": "r28", "52": "r28", "53": "r28", "54": "r28", "55": "r28", "56": "r28", "57": "r28", "58": "r28" }, { "23": "r29", "24": "r29", "25": "r29", "26": "r29", "27": "r29", "28": "r29", "29": "r29", "30": "r29", "31": "r29", "32": "r29", "33": "r29", "34": "r29", "35": "r29", "36": "r29", "37": "r29", "38": "r29", "39": "r29", "40": "r29", "41": "r29", "42": "r29", "43": "r29", "44": "r29", "45": "r29", "46": "r29", "47": "r29", "48": "r29", "49": "r29", "50": "r29", "51": "r29", "52": "r29", "53": "r29", "54": "r29", "55": "r29", "56": "r29", "57": "r29", "58": "r29" }, { "23": "r30", "24": "r30", "25": "r30", "26": "r30", "27": "r30", "28": "r30", "29": "r30", "30": "r30", "31": "r30", "32": "r30", "33": "r30", "34": "r30", "35": "r30", "36": "r30", "37": "r30", "38": "r30", "39": "r30", "40": "r30", "41": "r30", "42": "r30", "43": "r30", "44": "r30", "45": "r30", "46": "r30", "47": "r30", "48": "r30", "49": "r30", "50": "r30", "51": "r30", "52": "r30", "53": "r30", "54": "r30", "55": "r30", "56": "r30", "57": "r30", "58": "r30" }, { "23": "r31", "24": "r31", "25": "r31", "26": "r31", "27": "r31", "28": "r31", "29": "r31", "30": "r31", "31": "r31", "32": "r31", "33": "r31", "34": "r31", "35": "r31", "36": "r31", "37": "r31", "38": "r31", "39": "r31", "40": "r31", "41": "r31", "42": "r31", "43": "r31", "44": "r31", "45": "r31", "46": "r31", "47": "r31", "48": "r31", "49": "r31", "50": "r31", "51": "r31", "52": "r31", "53": "r31", "54": "r31", "55": "r31", "56": "r31", "57": "r31", "58": "r31" }, { "23": "r32", "24": "r32", "25": "r32", "26": "r32", "27": "r32", "28": "r32", "29": "r32", "30": "r32", "31": "r32", "32": "r32", "33": "r32", "34": "r32", "35": "r32", "36": "r32", "37": "r32", "38": "r32", "39": "r32", "40": "r32", "41": "r32", "42": "r32", "43": "r32", "44": "r32", "45": "r32", "46": "r32", "47": "r32", "48": "r32", "49": "r32", "50": "r32", "51": "r32", "52": "r32", "53": "r32", "54": "r32", "55": "r32", "56": "r32", "57": "r32", "58": "r32" }, { "23": "r33", "24": "r33", "25": "r33", "26": "r33", "27": "r33", "28": "r33", "29": "r33", "30": "r33", "31": "r33", "32": "r33", "33": "r33", "34": "r33", "35": "r33", "36": "r33", "37": "r33", "38": "r33", "39": "r33", "40": "r33", "41": "r33", "42": "r33", "43": "r33", "44": "r33", "45": "r33", "46": "r33", "47": "r33", "48": "r33", "49": "r33", "50": "r33", "51": "r33", "52": "r33", "53": "r33", "54": "r33", "55": "r33", "56": "r33", "57": "r33", "58": "r33" }, { "23": "r34", "24": "r34", "25": "r34", "26": "r34", "27": "r34", "28": "r34", "29": "r34", "30": "r34", "31": "r34", "32": "r34", "33": "r34", "34": "r34", "35": "r34", "36": "r34", "37": "r34", "38": "r34", "39": "r34", "40": "r34", "41": "r34", "42": "r34", "43": "r34", "44": "r34", "45": "r34", "46": "r34", "47": "r34", "48": "r34", "49": "r34", "50": "r34", "51": "r34", "52": "r34", "53": "r34", "54": "r34", "55": "r34", "56": "r34", "57": "r34", "58": "r34" }, { "23": "r35", "24": "r35", "25": "r35", "26": "r35", "27": "r35", "28": "r35", "29": "r35", "30": "r35", "31": "r35", "32": "r35", "33": "r35", "34": "r35", "35": "r35", "36": "r35", "37": "r35", "38": "r35", "39": "r35", "40": "r35", "41": "r35", "42": "r35", "43": "r35", "44": "r35", "45": "r35", "46": "r35", "47": "r35", "48": "r35", "49": "r35", "50": "r35", "51": "r35", "52": "r35", "53": "r35", "54": "r35", "55": "r35", "56": "r35", "57": "r35", "58": "r35" }, { "23": "r36", "24": "r36", "25": "r36", "26": "r36", "27": "r36", "28": "r36", "29": "r36", "30": "r36", "31": "r36", "32": "r36", "33": "r36", "34": "r36", "35": "r36", "36": "r36", "37": "r36", "38": "r36", "39": "r36", "40": "r36", "41": "r36", "42": "r36", "43": "r36", "44": "r36", "45": "r36", "46": "r36", "47": "r36", "48": "r36", "49": "r36", "50": "r36", "51": "r36", "52": "r36", "53": "r36", "54": "r36", "55": "r36", "56": "r36", "57": "r36", "58": "r36" }, { "10": 70, "18": 65, "19": 66, "21": 67, "22": 69, "24": "s28", "28": "s71", "35": "s29", "36": "s30", "37": "s31", "38": "s32", "39": "s33", "40": "s34", "41": "s35", "42": "s36", "43": "s37", "44": "s38", "45": "s39", "56": "r54", "58": "s68" }, { "10": 70, "18": 83, "19": 66, "21": 67, "22": 69, "24": "s28", "28": "s71", "35": "s29", "36": "s30", "37": "s31", "38": "s32", "39": "s33", "40": "s34", "41": "s35", "42": "s36", "43": "s37", "44": "s38", "45": "s39", "56": "r54", "58": "s68" }, { "23": "r47", "24": "r47", "25": "r47", "26": "r47", "27": "r47", "28": "r47", "29": "r47", "30": "r47", "31": "r47", "32": "r47", "33": "r47", "34": "r47", "35": "r47", "36": "r47", "37": "r47", "38": "r47", "39": "r47", "40": "r47", "41": "r47", "42": "r47", "43": "r47", "44": "r47", "45": "r47", "46": "r47", "47": "r47", "48": "r47", "49": "r47", "50": "r47", "51": "r47", "52": "r47", "53": "r47", "54": "r47", "55": "r47", "57": "r47" }, { "23": "r48", "24": "r48", "25": "r48", "26": "r48", "27": "r48", "28": "r48", "29": "r48", "30": "r48", "31": "r48", "32": "r48", "33": "r48", "34": "r48", "35": "r48", "36": "r48", "37": "r48", "38": "r48", "39": "r48", "40": "r48", "41": "r48", "42": "r48", "43": "r48", "44": "r48", "45": "r48", "46": "r48", "47": "r48", "48": "r48", "49": "r48", "50": "r48", "51": "r48", "52": "r48", "53": "r48", "54": "r48", "55": "r48", "57": "r48" }, { "4": 85, "5": 5, "6": 6, "24": "r10", "25": "r10", "26": "r10", "27": "r10", "28": "r10", "29": "r10", "30": "r10", "31": "r10", "32": "r10", "33": "r10", "34": "r10", "35": "r10", "36": "r10", "37": "r10", "38": "r10", "39": "r10", "40": "r10", "41": "r10", "42": "r10", "43": "r10", "44": "r10", "45": "r10", "52": "r10", "53": "r10", "54": "r10", "55": "r10", "57": "r10" }, { "4": 87, "5": 5, "6": 6, "24": "r10", "25": "r10", "26": "r10", "27": "r10", "28": "r10", "29": "r10", "30": "r10", "31": "r10", "32": "r10", "33": "r10", "34": "r10", "35": "r10", "36": "r10", "37": "r10", "38": "r10", "39": "r10", "40": "r10", "41": "r10", "42": "r10", "43": "r10", "44": "r10", "45": "r10", "52": "r10", "53": "r10", "54": "r10", "55": "r10", "57": "r10" }, { "4": 89, "5": 5, "6": 6, "24": "r10", "25": "r10", "26": "r10", "27": "r10", "28": "r10", "29": "r10", "30": "r10", "31": "r10", "32": "r10", "33": "r10", "34": "r10", "35": "r10", "36": "r10", "37": "r10", "38": "r10", "39": "r10", "40": "r10", "41": "r10", "42": "r10", "43": "r10", "44": "r10", "45": "r10", "52": "r10", "53": "r10", "54": "r10", "55": "r10", "57": "r10" }, { "23": "r13", "24": "r13", "25": "r13", "26": "r13", "27": "r13", "28": "r13", "29": "r13", "30": "r13", "31": "r13", "32": "r13", "33": "r13", "34": "r13", "35": "r13", "36": "r13", "37": "r13", "38": "r13", "39": "r13", "40": "r13", "41": "r13", "42": "r13", "43": "r13", "44": "r13", "45": "r13", "52": "r13", "53": "r13", "54": "r13", "55": "r13", "57": "r13" }, { "23": "r37", "24": "r37", "25": "r37", "26": "r37", "27": "r37", "28": "r37", "29": "r37", "30": "r37", "31": "r37", "32": "r37", "33": "r37", "34": "r37", "35": "r37", "36": "r37", "37": "r37", "38": "r37", "39": "r37", "40": "r37", "41": "r37", "42": "r37", "43": "r37", "44": "r37", "45": "r37", "52": "r37", "53": "r37", "54": "r37", "55": "r37", "57": "r37" }, { "23": "r39", "24": "r39", "25": "r39", "26": "r39", "27": "r39", "28": "r39", "29": "r39", "30": "r39", "31": "r39", "32": "r39", "33": "r39", "34": "r39", "35": "r39", "36": "r39", "37": "r39", "38": "r39", "39": "r39", "40": "r39", "41": "r39", "42": "r39", "43": "r39", "44": "r39", "45": "r39", "46": "s56", "52": "r39", "53": "r39", "54": "r39", "55": "r39", "57": "r39" }, { "23": "r41", "24": "r41", "25": "r41", "26": "r41", "27": "r41", "28": "r41", "29": "r41", "30": "r41", "31": "r41", "32": "r41", "33": "r41", "34": "r41", "35": "r41", "36": "r41", "37": "r41", "38": "r41", "39": "r41", "40": "r41", "41": "r41", "42": "r41", "43": "r41", "44": "r41", "45": "r41", "46": "r41", "52": "r41", "53": "r41", "54": "r41", "55": "r41", "57": "r41" }, { "23": "r42", "24": "r42", "25": "r42", "26": "r42", "27": "r42", "28": "r42", "29": "r42", "30": "r42", "31": "r42", "32": "r42", "33": "r42", "34": "r42", "35": "r42", "36": "r42", "37": "r42", "38": "r42", "39": "r42", "40": "r42", "41": "r42", "42": "r42", "43": "r42", "44": "r42", "45": "r42", "46": "r42", "52": "r42", "53": "r42", "54": "r42", "55": "r42", "57": "r42" }, { "23": "r43", "24": "r43", "25": "r43", "26": "r43", "27": "r43", "28": "r43", "29": "r43", "30": "r43", "31": "r43", "32": "r43", "33": "r43", "34": "r43", "35": "r43", "36": "r43", "37": "r43", "38": "r43", "39": "r43", "40": "r43", "41": "r43", "42": "r43", "43": "r43", "44": "r43", "45": "r43", "46": "r43", "52": "r43", "53": "r43", "54": "r43", "55": "r43", "57": "r43" }, { "23": "r44", "24": "r44", "25": "r44", "26": "r44", "27": "r44", "28": "r44", "29": "r44", "30": "r44", "31": "r44", "32": "r44", "33": "r44", "34": "r44", "35": "r44", "36": "r44", "37": "r44", "38": "r44", "39": "r44", "40": "r44", "41": "r44", "42": "r44", "43": "r44", "44": "r44", "45": "r44", "46": "r44", "52": "r44", "53": "r44", "54": "r44", "55": "r44", "57": "r44" }, { "23": "r45", "24": "r45", "25": "r45", "26": "r45", "27": "r45", "28": "r45", "29": "r45", "30": "r45", "31": "r45", "32": "r45", "33": "r45", "34": "r45", "35": "r45", "36": "r45", "37": "r45", "38": "r45", "39": "r45", "40": "r45", "41": "r45", "42": "r45", "43": "r45", "44": "r45", "45": "r45", "46": "r45", "52": "r45", "53": "r45", "54": "r45", "55": "r45", "57": "r45" }, { "23": "r46", "24": "r46", "25": "r46", "26": "r46", "27": "r46", "28": "r46", "29": "r46", "30": "r46", "31": "r46", "32": "r46", "33": "r46", "34": "r46", "35": "r46", "36": "r46", "37": "r46", "38": "r46", "39": "r46", "40": "r46", "41": "r46", "42": "r46", "43": "r46", "44": "r46", "45": "r46", "46": "r46", "52": "r46", "53": "r46", "54": "r46", "55": "r46", "57": "r46" }, { "23": "r40", "24": "r40", "25": "r40", "26": "r40", "27": "r40", "28": "r40", "29": "r40", "30": "r40", "31": "r40", "32": "r40", "33": "r40", "34": "r40", "35": "r40", "36": "r40", "37": "r40", "38": "r40", "39": "r40", "40": "r40", "41": "r40", "42": "r40", "43": "r40", "44": "r40", "45": "r40", "52": "r40", "53": "r40", "54": "r40", "55": "r40", "57": "r40" }, { "25": "s12", "31": "s58" }, { "23": "r18", "24": "r18", "25": "r18", "26": "r18", "27": "r18", "28": "r18", "29": "r18", "30": "r18", "31": "r18", "32": "r18", "33": "r18", "34": "r18", "35": "r18", "36": "r18", "37": "r18", "38": "r18", "39": "r18", "40": "r18", "41": "r18", "42": "r18", "43": "r18", "44": "r18", "45": "r18", "52": "r18", "53": "r18", "54": "r18", "55": "r18", "57": "r18" }, { "25": "s12", "31": "s60" }, { "23": "r19", "24": "r19", "25": "r19", "26": "r19", "27": "r19", "28": "r19", "29": "r19", "30": "r19", "31": "r19", "32": "r19", "33": "r19", "34": "r19", "35": "r19", "36": "r19", "37": "r19", "38": "r19", "39": "r19", "40": "r19", "41": "r19", "42": "r19", "43": "r19", "44": "r19", "45": "r19", "52": "r19", "53": "r19", "54": "r19", "55": "r19", "57": "r19" }, { "25": "s12", "31": "s62" }, { "23": "r20", "24": "r20", "25": "r20", "26": "r20", "27": "r20", "28": "r20", "29": "r20", "30": "r20", "31": "r20", "32": "r20", "33": "r20", "34": "r20", "35": "r20", "36": "r20", "37": "r20", "38": "r20", "39": "r20", "40": "r20", "41": "r20", "42": "r20", "43": "r20", "44": "r20", "45": "r20", "52": "r20", "53": "r20", "54": "r20", "55": "r20", "57": "r20" }, { "25": "s12", "31": "s64" }, { "23": "r21", "24": "r21", "25": "r21", "26": "r21", "27": "r21", "28": "r21", "29": "r21", "30": "r21", "31": "r21", "32": "r21", "33": "r21", "34": "r21", "35": "r21", "36": "r21", "37": "r21", "38": "r21", "39": "r21", "40": "r21", "41": "r21", "42": "r21", "43": "r21", "44": "r21", "45": "r21", "52": "r21", "53": "r21", "54": "r21", "55": "r21", "57": "r21" }, { "56": "s72" }, { "56": "r55" }, { "10": 70, "20": 73, "21": 75, "22": 76, "24": "s28", "28": "s71", "35": "s29", "36": "s30", "37": "s31", "38": "s32", "39": "s33", "40": "s34", "41": "s35", "42": "s36", "43": "s37", "44": "s38", "45": "s39", "56": "r56", "58": "s74" }, { "24": "r62", "28": "r62", "35": "r62", "36": "r62", "37": "r62", "38": "r62", "39": "r62", "40": "r62", "41": "r62", "42": "r62", "43": "r62", "44": "r62", "45": "r62", "56": "r62", "58": "r62" }, { "24": "r63", "28": "r63", "35": "r63", "36": "r63", "37": "r63", "38": "r63", "39": "r63", "40": "r63", "41": "r63", "42": "r63", "43": "r63", "44": "r63", "45": "r63", "56": "r63", "58": "r63" }, { "24": "r64", "28": "r64", "35": "r64", "36": "r64", "37": "r64", "38": "r64", "39": "r64", "40": "r64", "41": "r64", "42": "r64", "43": "r64", "44": "r64", "45": "r64", "56": "r64", "58": "r64" }, { "24": "r65", "28": "r65", "35": "r65", "36": "r65", "37": "r65", "38": "r65", "39": "r65", "40": "r65", "41": "r65", "42": "r65", "43": "r65", "44": "r65", "45": "r65", "56": "r65", "58": "r65" }, { "23": "r52", "24": "r52", "25": "r52", "26": "r52", "27": "r52", "28": "r52", "29": "r52", "30": "r52", "31": "r52", "32": "r52", "33": "r52", "34": "r52", "35": "r52", "36": "r52", "37": "r52", "38": "r52", "39": "r52", "40": "r52", "41": "r52", "42": "r52", "43": "r52", "44": "r52", "45": "r52", "46": "r52", "47": "r52", "48": "r52", "49": "r52", "50": "r52", "51": "r52", "52": "r52", "53": "r52", "54": "r52", "55": "r52", "57": "r52" }, { "56": "r57" }, { "10": 70, "21": 77, "22": 69, "24": "s28", "28": "s71", "35": "s29", "36": "s30", "37": "s31", "38": "s32", "39": "s33", "40": "s34", "41": "s35", "42": "s36", "43": "s37", "44": "s38", "45": "s39", "56": "r62", "58": "s68" }, { "56": "r59" }, { "10": 70, "20": 79, "21": 75, "22": 76, "24": "s28", "28": "s71", "35": "s29", "36": "s30", "37": "s31", "38": "s32", "39": "s33", "40": "s34", "41": "s35", "42": "s36", "43": "s37", "44": "s38", "45": "s39", "56": "r63", "58": "s80" }, { "10": 70, "18": 78, "19": 66, "21": 67, "22": 69, "24": "s28", "28": "s71", "35": "s29", "36": "s30", "37": "s31", "38": "s32", "39": "s33", "40": "s34", "41": "s35", "42": "s36", "43": "s37", "44": "s38", "45": "s39", "56": "r54", "58": "s68" }, { "56": "r58" }, { "56": "r60" }, { "10": 70, "21": 81, "22": 69, "24": "s28", "28": "s71", "35": "s29", "36": "s30", "37": "s31", "38": "s32", "39": "s33", "40": "s34", "41": "s35", "42": "s36", "43": "s37", "44": "s38", "45": "s39", "56": "r62", "58": "s68" }, { "10": 70, "18": 82, "19": 66, "21": 67, "22": 69, "24": "s28", "28": "s71", "35": "s29", "36": "s30", "37": "s31", "38": "s32", "39": "s33", "40": "s34", "41": "s35", "42": "s36", "43": "s37", "44": "s38", "45": "s39", "56": "r54", "58": "s68" }, { "56": "r61" }, { "56": "s84" }, { "23": "r53", "24": "r53", "25": "r53", "26": "r53", "27": "r53", "28": "r53", "29": "r53", "30": "r53", "31": "r53", "32": "r53", "33": "r53", "34": "r53", "35": "r53", "36": "r53", "37": "r53", "38": "r53", "39": "r53", "40": "r53", "41": "r53", "42": "r53", "43": "r53", "44": "r53", "45": "r53", "46": "r53", "47": "r53", "48": "r53", "49": "r53", "50": "r53", "51": "r53", "52": "r53", "53": "r53", "54": "r53", "55": "r53", "57": "r53" }, { "25": "s12", "31": "s86" }, { "23": "r49", "24": "r49", "25": "r49", "26": "r49", "27": "r49", "28": "r49", "29": "r49", "30": "r49", "31": "r49", "32": "r49", "33": "r49", "34": "r49", "35": "r49", "36": "r49", "37": "r49", "38": "r49", "39": "r49", "40": "r49", "41": "r49", "42": "r49", "43": "r49", "44": "r49", "45": "r49", "46": "r49", "47": "r49", "48": "r49", "49": "r49", "50": "r49", "51": "r49", "52": "r49", "53": "r49", "54": "r49", "55": "r49", "57": "r49" }, { "25": "s12", "31": "s88" }, { "23": "r50", "24": "r50", "25": "r50", "26": "r50", "27": "r50", "28": "r50", "29": "r50", "30": "r50", "31": "r50", "32": "r50", "33": "r50", "34": "r50", "35": "r50", "36": "r50", "37": "r50", "38": "r50", "39": "r50", "40": "r50", "41": "r50", "42": "r50", "43": "r50", "44": "r50", "45": "r50", "46": "r50", "47": "r50", "48": "r50", "49": "r50", "50": "r50", "51": "r50", "52": "r50", "53": "r50", "54": "r50", "55": "r50", "57": "r50" }, { "25": "s12", "31": "s90" }, { "23": "r51", "24": "r51", "25": "r51", "26": "r51", "27": "r51", "28": "r51", "29": "r51", "30": "r51", "31": "r51", "32": "r51", "33": "r51", "34": "r51", "35": "r51", "36": "r51", "37": "r51", "38": "r51", "39": "r51", "40": "r51", "41": "r51", "42": "r51", "43": "r51", "44": "r51", "45": "r51", "46": "r51", "47": "r51", "48": "r51", "49": "r51", "50": "r51", "51": "r51", "52": "r51", "53": "r51", "54": "r51", "55": "r51", "57": "r51" }];
|
|
|
|
|
|
/**
|
|
|
* Parsing stack.
|
|
|
*/
|
|
|
var stack = [];
|
|
|
|
|
|
/**
|
|
|
* Tokenizer instance.
|
|
|
*/
|
|
|
var tokenizer = void 0;
|
|
|
/**
|
|
|
* Generic tokenizer used by the parser in the Syntax tool.
|
|
|
*
|
|
|
* https://www.npmjs.com/package/syntax-cli
|
|
|
*
|
|
|
* See `--custom-tokinzer` to skip this generation, and use a custom one.
|
|
|
*/
|
|
|
|
|
|
var lexRules = [[/^#[^\n]+/, function () {/* skip comments */}], [/^\s+/, function () {/* skip whitespace */}], [/^-/, function () {
|
|
|
return 'DASH';
|
|
|
}], [/^\//, function () {
|
|
|
return 'CHAR';
|
|
|
}], [/^#/, function () {
|
|
|
return 'CHAR';
|
|
|
}], [/^\|/, function () {
|
|
|
return 'CHAR';
|
|
|
}], [/^\./, function () {
|
|
|
return 'CHAR';
|
|
|
}], [/^\{/, function () {
|
|
|
return 'CHAR';
|
|
|
}], [/^\{\d+\}/, function () {
|
|
|
return 'RANGE_EXACT';
|
|
|
}], [/^\{\d+,\}/, function () {
|
|
|
return 'RANGE_OPEN';
|
|
|
}], [/^\{\d+,\d+\}/, function () {
|
|
|
return 'RANGE_CLOSED';
|
|
|
}], [/^\\k<(([\u0041-\u005a\u0061-\u007a\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376-\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e-\u066f\u0671-\u06d3\u06d5\u06e5-\u06e6\u06ee-\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4-\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f1\u09fc\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0-\u0ae1\u0af9\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60-\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0-\u0ce1\u0cf1-\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32-\u0e33\u0e40-\u0e46\u0e81-\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2-\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae-\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5-\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\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\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a-\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7c6\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd-\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5-\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab67\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\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-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]|\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c-\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf2d-\udf4a\udf50-\udf75\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37-\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4-\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe-\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude35\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2\udd00-\udd23\udf00-\udf1c\udf27\udf30-\udf45\udfe0-\udff6]|\ud804[\udc03-\udc37\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd44\udd50-\udd72\udd76\udd83-\uddb2\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude2b\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udede\udf05-\udf0c\udf0f-\udf10\udf13-\udf28\udf2a-\udf30\udf32-\udf33\udf35-\udf39\udf3d\udf50\udf5d-\udf61]|\ud805[\udc00-\udc34\udc47-\udc4a\udc5f\udc80-\udcaf\udcc4-\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udeb8\udf00-\udf1a]|\ud806[\udc00-\udc2b\udca0-\udcdf\udcff\udda0-\udda7\uddaa-\uddd0\udde1\udde3\ude00\ude0b-\ude32\ude3a\ude50\ude5c-\ude89\ude9d\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f\udd00-\udd06\udd08-\udd09\udd0b-\udd30\udd46\udd60-\udd65\udd67-\udd68\udd6a-\udd89\udd98\udee0-\udef2]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf2f\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\ude40-\ude7f\udf00-\udf4a\udf50\udf93-\udf9f\udfe0-\udfe1\udfe3]|\ud81c[\udc00-\udfff]|\ud81d[\udc00-\udfff]|\ud81e[\udc00-\udfff]|\ud81f[\udc00-\udfff]|\ud820[\udc00-\udfff]|\ud821[\udc00-\udff7]|\ud822[\udc00-\udef2]|\ud82c[\udc00-\udd1e\udd50-\udd52\udd64-\udd67\udd70-\udefb]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e-\udc9f\udca2\udca5-\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud838[\udd00-\udd2c\udd37-\udd3d\udd4e\udec0-\udeeb]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd4b]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21-\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51-\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61-\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud840[\udc00-\udfff]|\ud841[\udc00-\udfff]|\ud842[\udc00-\udfff]|\ud843[\udc00-\udfff]|\ud844[\udc00-\udfff]|\ud845[\udc00-\udfff]|\ud846[\udc00-\udfff]|\ud847[\udc00-\udfff]|\ud848[\udc00-\udfff]|\ud849[\udc00-\udfff]|\ud84a[\udc00-\udfff]|\ud84b[\udc00-\udfff]|\ud84c[\udc00-\udfff]|\ud84d[\udc00-\udfff]|\ud84e[\udc00-\udfff]|\ud84f[\udc00-\udfff]|\ud850[\udc00-\udfff]|\ud851[\udc00-\udfff]|\ud852[\udc00-\udfff]|\ud853[\udc00-\udfff]|\ud854[\udc00-\udfff]|\ud855[\udc00-\udfff]|\ud856[\udc00-\udfff]|\ud857[\udc00-\udfff]|\ud858[\udc00-\udfff]|\ud859[\udc00-\udfff]|\ud85a[\udc00-\udfff]|\ud85b[\udc00-\udfff]|\ud85c[\udc00-\udfff]|\ud85d[\udc00-\udfff]|\ud85e[\udc00-\udfff]|\ud85f[\udc00-\udfff]|\ud860[\udc00-\udfff]|\ud861[\udc00-\udfff]|\ud862[\udc00-\udfff]|\ud863[\udc00-\udfff]|\ud864[\udc00-\udfff]|\ud865[\udc00-\udfff]|\ud866[\udc00-\udfff]|\ud867[\udc00-\udfff]|\ud868[\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86a[\udc00-\udfff]|\ud86b[\udc00-\udfff]|\ud86c[\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud86f[\udc00-\udfff]|\ud870[\udc00-\udfff]|\ud871[\udc00-\udfff]|\ud872[\udc00-\udfff]|\ud873[\udc00-\udea1\udeb0-\udfff]|\ud874[\udc00-\udfff]|\ud875[\udc00-\udfff]|\ud876[\udc00-\udfff]|\ud877[\udc00-\udfff]|\ud878[\udc00-\udfff]|\ud879[\udc00-\udfff]|\ud87a[\udc00-\udfe0]|\ud87e[\udc00-\ude1d])|[$_]|(\\u[0-9a-fA-F]{4}|\\u\{[0-9a-fA-F]{1,}\}))(([\u0030-\u0039\u0041-\u005a\u005f\u0061-\u007a\u00aa\u00b5\u00b7\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376-\u0377\u037a-\u037d\u037f\u0386-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u05d0-\u05ea\u05ef-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u07fd\u0800-\u082d\u0840-\u085b\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u08d3-\u08e1\u08e3-\u0963\u0966-\u096f\u0971-\u0983\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7-\u09c8\u09cb-\u09ce\u09d7\u09dc-\u09dd\u09df-\u09e3\u09e6-\u09f1\u09fc\u09fe\u0a01-\u0a03\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a3c\u0a3e-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0af9-\u0aff\u0b01-\u0b03\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47-\u0b48\u0b4b-\u0b4d\u0b56-\u0b57\u0b5c-\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82-\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c00-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5-\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1-\u0cf2\u0d00-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82-\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81-\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18-\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1369-\u1371\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772-\u1773\u1780-\u17d3\u17d7\u17dc-\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1878\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1ab0-\u1abd\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1cd0-\u1cd2\u1cd4-\u1cfa\u1d00-\u1df9\u1dfb-\u1f15\u1f18-\u1f1d\u1f20-\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\u203f-\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7c6\ua7f7-\ua827\ua840-\ua873\ua880-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua8fd-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\ua9e0-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab67\uab70-\uabea\uabec-\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe2f\ufe33-\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]|\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c-\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\uddfd\ude80-\ude9c\udea0-\uded0\udee0\udf00-\udf1f\udf2d-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udca0-\udca9\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37-\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4-\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe-\uddbf\ude00-\ude03\ude05-\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude35\ude38-\ude3a\ude3f\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee6\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2\udd00-\udd27\udd30-\udd39\udf00-\udf1c\udf27\udf30-\udf50\udfe0-\udff6]|\ud804[\udc00-\udc46\udc66-\udc6f\udc7f-\udcba\udcd0-\udce8\udcf0-\udcf9\udd00-\udd34\udd36-\udd3f\udd44-\udd46\udd50-\udd73\udd76\udd80-\uddc4\uddc9-\uddcc\uddd0-\uddda\udddc\ude00-\ude11\ude13-\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udeea\udef0-\udef9\udf00-\udf03\udf05-\udf0c\udf0f-\udf10\udf13-\udf28\udf2a-\udf30\udf32-\udf33\udf35-\udf39\udf3b-\udf44\udf47-\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]|\ud805[\udc00-\udc4a\udc50-\udc59\udc5e-\udc5f\udc80-\udcc5\udcc7\udcd0-\udcd9\udd80-\uddb5\uddb8-\uddc0\uddd8-\udddd\ude00-\ude40\ude44\ude50-\ude59\ude80-\udeb8\udec0-\udec9\udf00-\udf1a\udf1d-\udf2b\udf30-\udf39]|\ud806[\udc00-\udc3a\udca0-\udce9\udcff\udda0-\udda7\uddaa-\uddd7\uddda-\udde1\udde3-\udde4\ude00-\ude3e\ude47\ude50-\ude99\ude9d\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc40\udc50-\udc59\udc72-\udc8f\udc92-\udca7\udca9-\udcb6\udd00-\udd06\udd08-\udd09\udd0b-\udd36\udd3a\udd3c-\udd3d\udd3f-\udd47\udd50-\udd59\udd60-\udd65\udd67-\udd68\udd6a-\udd8e\udd90-\udd91\udd93-\udd98\udda0-\udda9\udee0-\udef6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\ude60-\ude69\uded0-\udeed\udef0-\udef4\udf00-\udf36\udf40-\udf43\udf50-\udf59\udf63-\udf77\udf7d-\udf8f]|\ud81b[\ude40-\ude7f\udf00-\udf4a\udf4f-\udf87\udf8f-\udf9f\udfe0-\udfe1\udfe3]|\ud81c[\udc00-\udfff]|\ud81d[\udc00-\udfff]|\ud81e[\udc00-\udfff]|\ud81f[\udc00-\udfff]|\ud820[\udc00-\udfff]|\ud821[\udc00-\udff7]|\ud822[\udc00-\udef2]|\ud82c[\udc00-\udd1e\udd50-\udd52\udd64-\udd67\udd70-\udefb]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9d-\udc9e]|\ud834[\udd65-\udd69\udd6d-\udd72\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e-\udc9f\udca2\udca5-\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb\udfce-\udfff]|\ud836[\ude00-\ude36\ude3b-\ude6c\ude75\ude84\ude9b-\ude9f\udea1-\udeaf]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23-\udc24\udc26-\udc2a\udd00-\udd2c\udd30-\udd3d\udd40-\udd49\udd4e\udec0-\udef9]|\ud83a[\udc00-\udcc4\udcd0-\udcd6\udd00-\udd4b\udd50-\udd59]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21-\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51-\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61-\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud840[\udc00-\udfff]|\ud841[\udc00-\udfff]|\ud842[\udc00-\udfff]|\ud843[\udc00-\udfff]|\ud844[\udc00-\udfff]|\ud845[\udc00-\udfff]|\ud846[\udc00-\udfff]|\ud847[\udc00-\udfff]|\ud848[\udc00-\udfff]|\ud849[\udc00-\udfff]|\ud84a[\udc00-\udfff]|\ud84b[\udc00-\udfff]|\ud84c[\udc00-\udfff]|\ud84d[\udc00-\udfff]|\ud84e[\udc00-\udfff]|\ud84f[\udc00-\udfff]|\ud850[\udc00-\udfff]|\ud851[\udc00-\udfff]|\ud852[\udc00-\udfff]|\ud853[\udc00-\udfff]|\ud854[\udc00-\udfff]|\ud855[\udc00-\udfff]|\ud856[\udc00-\udfff]|\ud857[\udc00-\udfff]|\ud858[\udc00-\udfff]|\ud859[\udc00-\udfff]|\ud85a[\udc00-\udfff]|\ud85b[\udc00-\udfff]|\ud85c[\udc00-\udfff]|\ud85d[\udc00-\udfff]|\ud85e[\udc00-\udfff]|\ud85f[\udc00-\udfff]|\ud860[\udc00-\udfff]|\ud861[\udc00-\udfff]|\ud862[\udc00-\udfff]|\ud863[\udc00-\udfff]|\ud864[\udc00-\udfff]|\ud865[\udc00-\udfff]|\ud866[\udc00-\udfff]|\ud867[\udc00-\udfff]|\ud868[\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86a[\udc00-\udfff]|\ud86b[\udc00-\udfff]|\ud86c[\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud86f[\udc00-\udfff]|\ud870[\udc00-\udfff]|\ud871[\udc00-\udfff]|\ud872[\udc00-\udfff]|\ud873[\udc00-\udea1\udeb0-\udfff]|\ud874[\udc00-\udfff]|\ud875[\udc00-\udfff]|\ud876[\udc00-\udfff]|\ud877[\udc00-\udfff]|\ud878[\udc00-\udfff]|\ud879[\udc00-\udfff]|\ud87a[\udc00-\udfe0]|\ud87e[\udc00-\ude1d]|\udb40[\udd00-\uddef])|[$_]|(\\u[0-9a-fA-F]{4}|\\u\{[0-9a-fA-F]{1,}\})|[\u200c\u200d])*>/, function () {
|
|
|
var groupName = yytext.slice(3, -1);
|
|
|
validateUnicodeGroupName(groupName, this.getCurrentState());
|
|
|
return 'NAMED_GROUP_REF';
|
|
|
}], [/^\\b/, function () {
|
|
|
return 'ESC_b';
|
|
|
}], [/^\\B/, function () {
|
|
|
return 'ESC_B';
|
|
|
}], [/^\\c[a-zA-Z]/, function () {
|
|
|
return 'CTRL_CH';
|
|
|
}], [/^\\0\d{1,2}/, function () {
|
|
|
return 'OCT_CODE';
|
|
|
}], [/^\\0/, function () {
|
|
|
return 'DEC_CODE';
|
|
|
}], [/^\\\d{1,3}/, function () {
|
|
|
return 'DEC_CODE';
|
|
|
}], [/^\\u[dD][89abAB][0-9a-fA-F]{2}\\u[dD][c-fC-F][0-9a-fA-F]{2}/, function () {
|
|
|
return 'U_CODE_SURROGATE';
|
|
|
}], [/^\\u\{[0-9a-fA-F]{1,}\}/, function () {
|
|
|
return 'U_CODE';
|
|
|
}], [/^\\u[0-9a-fA-F]{4}/, function () {
|
|
|
return 'U_CODE';
|
|
|
}], [/^\\[pP]\{\w+(?:=\w+)?\}/, function () {
|
|
|
return 'U_PROP_VALUE_EXP';
|
|
|
}], [/^\\x[0-9a-fA-F]{2}/, function () {
|
|
|
return 'HEX_CODE';
|
|
|
}], [/^\\[tnrdDsSwWvf]/, function () {
|
|
|
return 'META_CHAR';
|
|
|
}], [/^\\\//, function () {
|
|
|
return 'ESC_CHAR';
|
|
|
}], [/^\\[ #]/, function () {
|
|
|
return 'ESC_CHAR';
|
|
|
}], [/^\\[\^\$\.\*\+\?\(\)\\\[\]\{\}\|\/]/, function () {
|
|
|
return 'ESC_CHAR';
|
|
|
}], [/^\\[^*?+\[()\\|]/, function () {
|
|
|
var s = this.getCurrentState();
|
|
|
if (s === 'u_class' && yytext === "\\-") {
|
|
|
return 'ESC_CHAR';
|
|
|
} else if (s === 'u' || s === 'xu' || s === 'u_class') {
|
|
|
throw new SyntaxError('invalid Unicode escape ' + yytext);
|
|
|
}
|
|
|
return 'ESC_CHAR';
|
|
|
}], [/^\(/, function () {
|
|
|
return 'CHAR';
|
|
|
}], [/^\)/, function () {
|
|
|
return 'CHAR';
|
|
|
}], [/^\(\?=/, function () {
|
|
|
return 'POS_LA_ASSERT';
|
|
|
}], [/^\(\?!/, function () {
|
|
|
return 'NEG_LA_ASSERT';
|
|
|
}], [/^\(\?<=/, function () {
|
|
|
return 'POS_LB_ASSERT';
|
|
|
}], [/^\(\?<!/, function () {
|
|
|
return 'NEG_LB_ASSERT';
|
|
|
}], [/^\(\?:/, function () {
|
|
|
return 'NON_CAPTURE_GROUP';
|
|
|
}], [/^\(\?<(([\u0041-\u005a\u0061-\u007a\u00aa\u00b5\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376-\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e-\u066f\u0671-\u06d3\u06d5\u06e5-\u06e6\u06ee-\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4-\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f1\u09fc\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0-\u0ae1\u0af9\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60-\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0-\u0ce1\u0cf1-\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32-\u0e33\u0e40-\u0e46\u0e81-\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2-\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae-\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5-\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\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\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a-\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7c6\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd-\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5-\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab67\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\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-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]|\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c-\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\ude80-\ude9c\udea0-\uded0\udf00-\udf1f\udf2d-\udf4a\udf50-\udf75\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37-\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4-\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe-\uddbf\ude00\ude10-\ude13\ude15-\ude17\ude19-\ude35\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee4\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2\udd00-\udd23\udf00-\udf1c\udf27\udf30-\udf45\udfe0-\udff6]|\ud804[\udc03-\udc37\udc83-\udcaf\udcd0-\udce8\udd03-\udd26\udd44\udd50-\udd72\udd76\udd83-\uddb2\uddc1-\uddc4\uddda\udddc\ude00-\ude11\ude13-\ude2b\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udede\udf05-\udf0c\udf0f-\udf10\udf13-\udf28\udf2a-\udf30\udf32-\udf33\udf35-\udf39\udf3d\udf50\udf5d-\udf61]|\ud805[\udc00-\udc34\udc47-\udc4a\udc5f\udc80-\udcaf\udcc4-\udcc5\udcc7\udd80-\uddae\uddd8-\udddb\ude00-\ude2f\ude44\ude80-\udeaa\udeb8\udf00-\udf1a]|\ud806[\udc00-\udc2b\udca0-\udcdf\udcff\udda0-\udda7\uddaa-\uddd0\udde1\udde3\ude00\ude0b-\ude32\ude3a\ude50\ude5c-\ude89\ude9d\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc2e\udc40\udc72-\udc8f\udd00-\udd06\udd08-\udd09\udd0b-\udd30\udd46\udd60-\udd65\udd67-\udd68\udd6a-\udd89\udd98\udee0-\udef2]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udf00-\udf2f\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\ude40-\ude7f\udf00-\udf4a\udf50\udf93-\udf9f\udfe0-\udfe1\udfe3]|\ud81c[\udc00-\udfff]|\ud81d[\udc00-\udfff]|\ud81e[\udc00-\udfff]|\ud81f[\udc00-\udfff]|\ud820[\udc00-\udfff]|\ud821[\udc00-\udff7]|\ud822[\udc00-\udef2]|\ud82c[\udc00-\udd1e\udd50-\udd52\udd64-\udd67\udd70-\udefb]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e-\udc9f\udca2\udca5-\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud838[\udd00-\udd2c\udd37-\udd3d\udd4e\udec0-\udeeb]|\ud83a[\udc00-\udcc4\udd00-\udd43\udd4b]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21-\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51-\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61-\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud840[\udc00-\udfff]|\ud841[\udc00-\udfff]|\ud842[\udc00-\udfff]|\ud843[\udc00-\udfff]|\ud844[\udc00-\udfff]|\ud845[\udc00-\udfff]|\ud846[\udc00-\udfff]|\ud847[\udc00-\udfff]|\ud848[\udc00-\udfff]|\ud849[\udc00-\udfff]|\ud84a[\udc00-\udfff]|\ud84b[\udc00-\udfff]|\ud84c[\udc00-\udfff]|\ud84d[\udc00-\udfff]|\ud84e[\udc00-\udfff]|\ud84f[\udc00-\udfff]|\ud850[\udc00-\udfff]|\ud851[\udc00-\udfff]|\ud852[\udc00-\udfff]|\ud853[\udc00-\udfff]|\ud854[\udc00-\udfff]|\ud855[\udc00-\udfff]|\ud856[\udc00-\udfff]|\ud857[\udc00-\udfff]|\ud858[\udc00-\udfff]|\ud859[\udc00-\udfff]|\ud85a[\udc00-\udfff]|\ud85b[\udc00-\udfff]|\ud85c[\udc00-\udfff]|\ud85d[\udc00-\udfff]|\ud85e[\udc00-\udfff]|\ud85f[\udc00-\udfff]|\ud860[\udc00-\udfff]|\ud861[\udc00-\udfff]|\ud862[\udc00-\udfff]|\ud863[\udc00-\udfff]|\ud864[\udc00-\udfff]|\ud865[\udc00-\udfff]|\ud866[\udc00-\udfff]|\ud867[\udc00-\udfff]|\ud868[\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86a[\udc00-\udfff]|\ud86b[\udc00-\udfff]|\ud86c[\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud86f[\udc00-\udfff]|\ud870[\udc00-\udfff]|\ud871[\udc00-\udfff]|\ud872[\udc00-\udfff]|\ud873[\udc00-\udea1\udeb0-\udfff]|\ud874[\udc00-\udfff]|\ud875[\udc00-\udfff]|\ud876[\udc00-\udfff]|\ud877[\udc00-\udfff]|\ud878[\udc00-\udfff]|\ud879[\udc00-\udfff]|\ud87a[\udc00-\udfe0]|\ud87e[\udc00-\ude1d])|[$_]|(\\u[0-9a-fA-F]{4}|\\u\{[0-9a-fA-F]{1,}\}))(([\u0030-\u0039\u0041-\u005a\u005f\u0061-\u007a\u00aa\u00b5\u00b7\u00ba\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376-\u0377\u037a-\u037d\u037f\u0386-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u05d0-\u05ea\u05ef-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u07fd\u0800-\u082d\u0840-\u085b\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u08d3-\u08e1\u08e3-\u0963\u0966-\u096f\u0971-\u0983\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7-\u09c8\u09cb-\u09ce\u09d7\u09dc-\u09dd\u09df-\u09e3\u09e6-\u09f1\u09fc\u09fe\u0a01-\u0a03\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a3c\u0a3e-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0af9-\u0aff\u0b01-\u0b03\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47-\u0b48\u0b4b-\u0b4d\u0b56-\u0b57\u0b5c-\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82-\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c00-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5-\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1-\u0cf2\u0d00-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82-\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81-\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18-\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1369-\u1371\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772-\u1773\u1780-\u17d3\u17d7\u17dc-\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1878\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1ab0-\u1abd\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1cd0-\u1cd2\u1cd4-\u1cfa\u1d00-\u1df9\u1dfb-\u1f15\u1f18-\u1f1d\u1f20-\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\u203f-\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7c6\ua7f7-\ua827\ua840-\ua873\ua880-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua8fd-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\ua9e0-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab67\uab70-\uabea\uabec-\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe2f\ufe33-\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]|\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c-\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\udd40-\udd74\uddfd\ude80-\ude9c\udea0-\uded0\udee0\udf00-\udf1f\udf2d-\udf4a\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf\udfd1-\udfd5]|\ud801[\udc00-\udc9d\udca0-\udca9\udcb0-\udcd3\udcd8-\udcfb\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37-\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udce0-\udcf2\udcf4-\udcf5\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe-\uddbf\ude00-\ude03\ude05-\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude35\ude38-\ude3a\ude3f\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee6\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48\udc80-\udcb2\udcc0-\udcf2\udd00-\udd27\udd30-\udd39\udf00-\udf1c\udf27\udf30-\udf50\udfe0-\udff6]|\ud804[\udc00-\udc46\udc66-\udc6f\udc7f-\udcba\udcd0-\udce8\udcf0-\udcf9\udd00-\udd34\udd36-\udd3f\udd44-\udd46\udd50-\udd73\udd76\udd80-\uddc4\uddc9-\uddcc\uddd0-\uddda\udddc\ude00-\ude11\ude13-\ude37\ude3e\ude80-\ude86\ude88\ude8a-\ude8d\ude8f-\ude9d\ude9f-\udea8\udeb0-\udeea\udef0-\udef9\udf00-\udf03\udf05-\udf0c\udf0f-\udf10\udf13-\udf28\udf2a-\udf30\udf32-\udf33\udf35-\udf39\udf3b-\udf44\udf47-\udf48\udf4b-\udf4d\udf50\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]|\ud805[\udc00-\udc4a\udc50-\udc59\udc5e-\udc5f\udc80-\udcc5\udcc7\udcd0-\udcd9\udd80-\uddb5\uddb8-\uddc0\uddd8-\udddd\ude00-\ude40\ude44\ude50-\ude59\ude80-\udeb8\udec0-\udec9\udf00-\udf1a\udf1d-\udf2b\udf30-\udf39]|\ud806[\udc00-\udc3a\udca0-\udce9\udcff\udda0-\udda7\uddaa-\uddd7\uddda-\udde1\udde3-\udde4\ude00-\ude3e\ude47\ude50-\ude99\ude9d\udec0-\udef8]|\ud807[\udc00-\udc08\udc0a-\udc36\udc38-\udc40\udc50-\udc59\udc72-\udc8f\udc92-\udca7\udca9-\udcb6\udd00-\udd06\udd08-\udd09\udd0b-\udd36\udd3a\udd3c-\udd3d\udd3f-\udd47\udd50-\udd59\udd60-\udd65\udd67-\udd68\udd6a-\udd8e\udd90-\udd91\udd93-\udd98\udda0-\udda9\udee0-\udef6]|\ud808[\udc00-\udf99]|\ud809[\udc00-\udc6e\udc80-\udd43]|\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud811[\udc00-\ude46]|\ud81a[\udc00-\ude38\ude40-\ude5e\ude60-\ude69\uded0-\udeed\udef0-\udef4\udf00-\udf36\udf40-\udf43\udf50-\udf59\udf63-\udf77\udf7d-\udf8f]|\ud81b[\ude40-\ude7f\udf00-\udf4a\udf4f-\udf87\udf8f-\udf9f\udfe0-\udfe1\udfe3]|\ud81c[\udc00-\udfff]|\ud81d[\udc00-\udfff]|\ud81e[\udc00-\udfff]|\ud81f[\udc00-\udfff]|\ud820[\udc00-\udfff]|\ud821[\udc00-\udff7]|\ud822[\udc00-\udef2]|\ud82c[\udc00-\udd1e\udd50-\udd52\udd64-\udd67\udd70-\udefb]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9d-\udc9e]|\ud834[\udd65-\udd69\udd6d-\udd72\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e-\udc9f\udca2\udca5-\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb\udfce-\udfff]|\ud836[\ude00-\ude36\ude3b-\ude6c\ude75\ude84\ude9b-\ude9f\udea1-\udeaf]|\ud838[\udc00-\udc06\udc08-\udc18\udc1b-\udc21\udc23-\udc24\udc26-\udc2a\udd00-\udd2c\udd30-\udd3d\udd40-\udd49\udd4e\udec0-\udef9]|\ud83a[\udc00-\udcc4\udcd0-\udcd6\udd00-\udd4b\udd50-\udd59]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21-\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51-\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61-\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud840[\udc00-\udfff]|\ud841[\udc00-\udfff]|\ud842[\udc00-\udfff]|\ud843[\udc00-\udfff]|\ud844[\udc00-\udfff]|\ud845[\udc00-\udfff]|\ud846[\udc00-\udfff]|\ud847[\udc00-\udfff]|\ud848[\udc00-\udfff]|\ud849[\udc00-\udfff]|\ud84a[\udc00-\udfff]|\ud84b[\udc00-\udfff]|\ud84c[\udc00-\udfff]|\ud84d[\udc00-\udfff]|\ud84e[\udc00-\udfff]|\ud84f[\udc00-\udfff]|\ud850[\udc00-\udfff]|\ud851[\udc00-\udfff]|\ud852[\udc00-\udfff]|\ud853[\udc00-\udfff]|\ud854[\udc00-\udfff]|\ud855[\udc00-\udfff]|\ud856[\udc00-\udfff]|\ud857[\udc00-\udfff]|\ud858[\udc00-\udfff]|\ud859[\udc00-\udfff]|\ud85a[\udc00-\udfff]|\ud85b[\udc00-\udfff]|\ud85c[\udc00-\udfff]|\ud85d[\udc00-\udfff]|\ud85e[\udc00-\udfff]|\ud85f[\udc00-\udfff]|\ud860[\udc00-\udfff]|\ud861[\udc00-\udfff]|\ud862[\udc00-\udfff]|\ud863[\udc00-\udfff]|\ud864[\udc00-\udfff]|\ud865[\udc00-\udfff]|\ud866[\udc00-\udfff]|\ud867[\udc00-\udfff]|\ud868[\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86a[\udc00-\udfff]|\ud86b[\udc00-\udfff]|\ud86c[\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d\udc20-\udfff]|\ud86f[\udc00-\udfff]|\ud870[\udc00-\udfff]|\ud871[\udc00-\udfff]|\ud872[\udc00-\udfff]|\ud873[\udc00-\udea1\udeb0-\udfff]|\ud874[\udc00-\udfff]|\ud875[\udc00-\udfff]|\ud876[\udc00-\udfff]|\ud877[\udc00-\udfff]|\ud878[\udc00-\udfff]|\ud879[\udc00-\udfff]|\ud87a[\udc00-\udfe0]|\ud87e[\udc00-\ude1d]|\udb40[\udd00-\uddef])|[$_]|(\\u[0-9a-fA-F]{4}|\\u\{[0-9a-fA-F]{1,}\})|[\u200c\u200d])*>/, function () {
|
|
|
yytext = yytext.slice(3, -1);
|
|
|
validateUnicodeGroupName(yytext, this.getCurrentState());
|
|
|
return 'NAMED_CAPTURE_GROUP';
|
|
|
}], [/^\(/, function () {
|
|
|
return 'L_PAREN';
|
|
|
}], [/^\)/, function () {
|
|
|
return 'R_PAREN';
|
|
|
}], [/^[*?+[^$]/, function () {
|
|
|
return 'CHAR';
|
|
|
}], [/^\\\]/, function () {
|
|
|
return 'ESC_CHAR';
|
|
|
}], [/^\]/, function () {
|
|
|
this.popState();return 'R_BRACKET';
|
|
|
}], [/^\^/, function () {
|
|
|
return 'BOS';
|
|
|
}], [/^\$/, function () {
|
|
|
return 'EOS';
|
|
|
}], [/^\*/, function () {
|
|
|
return 'STAR';
|
|
|
}], [/^\?/, function () {
|
|
|
return 'Q_MARK';
|
|
|
}], [/^\+/, function () {
|
|
|
return 'PLUS';
|
|
|
}], [/^\|/, function () {
|
|
|
return 'BAR';
|
|
|
}], [/^\./, function () {
|
|
|
return 'ANY';
|
|
|
}], [/^\//, function () {
|
|
|
return 'SLASH';
|
|
|
}], [/^[^*?+\[()\\|]/, function () {
|
|
|
return 'CHAR';
|
|
|
}], [/^\[\^/, function () {
|
|
|
var s = this.getCurrentState();this.pushState(s === 'u' || s === 'xu' ? 'u_class' : 'class');return 'NEG_CLASS';
|
|
|
}], [/^\[/, function () {
|
|
|
var s = this.getCurrentState();this.pushState(s === 'u' || s === 'xu' ? 'u_class' : 'class');return 'L_BRACKET';
|
|
|
}]];
|
|
|
var lexRulesByConditions = { "INITIAL": [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20, 22, 23, 24, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51], "u": [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51], "xu": [0, 1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51], "x": [0, 1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20, 22, 23, 24, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51], "u_class": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51], "class": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 20, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51] };
|
|
|
|
|
|
var EOF_TOKEN = {
|
|
|
type: EOF,
|
|
|
value: ''
|
|
|
};
|
|
|
|
|
|
tokenizer = {
|
|
|
initString: function initString(string) {
|
|
|
this._string = string;
|
|
|
this._cursor = 0;
|
|
|
|
|
|
this._states = ['INITIAL'];
|
|
|
this._tokensQueue = [];
|
|
|
|
|
|
this._currentLine = 1;
|
|
|
this._currentColumn = 0;
|
|
|
this._currentLineBeginOffset = 0;
|
|
|
|
|
|
/**
|
|
|
* Matched token location data.
|
|
|
*/
|
|
|
this._tokenStartOffset = 0;
|
|
|
this._tokenEndOffset = 0;
|
|
|
this._tokenStartLine = 1;
|
|
|
this._tokenEndLine = 1;
|
|
|
this._tokenStartColumn = 0;
|
|
|
this._tokenEndColumn = 0;
|
|
|
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Returns tokenizer states.
|
|
|
*/
|
|
|
getStates: function getStates() {
|
|
|
return this._states;
|
|
|
},
|
|
|
getCurrentState: function getCurrentState() {
|
|
|
return this._states[this._states.length - 1];
|
|
|
},
|
|
|
pushState: function pushState(state) {
|
|
|
this._states.push(state);
|
|
|
},
|
|
|
begin: function begin(state) {
|
|
|
this.pushState(state);
|
|
|
},
|
|
|
popState: function popState() {
|
|
|
if (this._states.length > 1) {
|
|
|
return this._states.pop();
|
|
|
}
|
|
|
return this._states[0];
|
|
|
},
|
|
|
getNextToken: function getNextToken() {
|
|
|
// Something was queued, return it.
|
|
|
if (this._tokensQueue.length > 0) {
|
|
|
return this.onToken(this._toToken(this._tokensQueue.shift()));
|
|
|
}
|
|
|
|
|
|
if (!this.hasMoreTokens()) {
|
|
|
return this.onToken(EOF_TOKEN);
|
|
|
}
|
|
|
|
|
|
var string = this._string.slice(this._cursor);
|
|
|
var lexRulesForState = lexRulesByConditions[this.getCurrentState()];
|
|
|
|
|
|
for (var i = 0; i < lexRulesForState.length; i++) {
|
|
|
var lexRuleIndex = lexRulesForState[i];
|
|
|
var lexRule = lexRules[lexRuleIndex];
|
|
|
|
|
|
var matched = this._match(string, lexRule[0]);
|
|
|
|
|
|
// Manual handling of EOF token (the end of string). Return it
|
|
|
// as `EOF` symbol.
|
|
|
if (string === '' && matched === '') {
|
|
|
this._cursor++;
|
|
|
}
|
|
|
|
|
|
if (matched !== null) {
|
|
|
yytext = matched;
|
|
|
yyleng = yytext.length;
|
|
|
var token = lexRule[1].call(this);
|
|
|
|
|
|
if (!token) {
|
|
|
return this.getNextToken();
|
|
|
}
|
|
|
|
|
|
// If multiple tokens are returned, save them to return
|
|
|
// on next `getNextToken` call.
|
|
|
|
|
|
if (Array.isArray(token)) {
|
|
|
var tokensToQueue = token.slice(1);
|
|
|
token = token[0];
|
|
|
if (tokensToQueue.length > 0) {
|
|
|
var _tokensQueue;
|
|
|
|
|
|
(_tokensQueue = this._tokensQueue).unshift.apply(_tokensQueue, _toConsumableArray(tokensToQueue));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return this.onToken(this._toToken(token, yytext));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (this.isEOF()) {
|
|
|
this._cursor++;
|
|
|
return EOF_TOKEN;
|
|
|
}
|
|
|
|
|
|
this.throwUnexpectedToken(string[0], this._currentLine, this._currentColumn);
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Throws default "Unexpected token" exception, showing the actual
|
|
|
* line from the source, pointing with the ^ marker to the bad token.
|
|
|
* In addition, shows `line:column` location.
|
|
|
*/
|
|
|
throwUnexpectedToken: function throwUnexpectedToken(symbol, line, column) {
|
|
|
var lineSource = this._string.split('\n')[line - 1];
|
|
|
var lineData = '';
|
|
|
|
|
|
if (lineSource) {
|
|
|
var pad = ' '.repeat(column);
|
|
|
lineData = '\n\n' + lineSource + '\n' + pad + '^\n';
|
|
|
}
|
|
|
|
|
|
throw new SyntaxError(lineData + 'Unexpected token: "' + symbol + '" ' + ('at ' + line + ':' + column + '.'));
|
|
|
},
|
|
|
getCursor: function getCursor() {
|
|
|
return this._cursor;
|
|
|
},
|
|
|
getCurrentLine: function getCurrentLine() {
|
|
|
return this._currentLine;
|
|
|
},
|
|
|
getCurrentColumn: function getCurrentColumn() {
|
|
|
return this._currentColumn;
|
|
|
},
|
|
|
_captureLocation: function _captureLocation(matched) {
|
|
|
var nlRe = /\n/g;
|
|
|
|
|
|
// Absolute offsets.
|
|
|
this._tokenStartOffset = this._cursor;
|
|
|
|
|
|
// Line-based locations, start.
|
|
|
this._tokenStartLine = this._currentLine;
|
|
|
this._tokenStartColumn = this._tokenStartOffset - this._currentLineBeginOffset;
|
|
|
|
|
|
// Extract `\n` in the matched token.
|
|
|
var nlMatch = void 0;
|
|
|
while ((nlMatch = nlRe.exec(matched)) !== null) {
|
|
|
this._currentLine++;
|
|
|
this._currentLineBeginOffset = this._tokenStartOffset + nlMatch.index + 1;
|
|
|
}
|
|
|
|
|
|
this._tokenEndOffset = this._cursor + matched.length;
|
|
|
|
|
|
// Line-based locations, end.
|
|
|
this._tokenEndLine = this._currentLine;
|
|
|
this._tokenEndColumn = this._currentColumn = this._tokenEndOffset - this._currentLineBeginOffset;
|
|
|
},
|
|
|
_toToken: function _toToken(tokenType) {
|
|
|
var yytext = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
|
|
|
|
return {
|
|
|
// Basic data.
|
|
|
type: tokenType,
|
|
|
value: yytext,
|
|
|
|
|
|
// Location data.
|
|
|
startOffset: this._tokenStartOffset,
|
|
|
endOffset: this._tokenEndOffset,
|
|
|
startLine: this._tokenStartLine,
|
|
|
endLine: this._tokenEndLine,
|
|
|
startColumn: this._tokenStartColumn,
|
|
|
endColumn: this._tokenEndColumn
|
|
|
};
|
|
|
},
|
|
|
isEOF: function isEOF() {
|
|
|
return this._cursor === this._string.length;
|
|
|
},
|
|
|
hasMoreTokens: function hasMoreTokens() {
|
|
|
return this._cursor <= this._string.length;
|
|
|
},
|
|
|
_match: function _match(string, regexp) {
|
|
|
var matched = string.match(regexp);
|
|
|
if (matched) {
|
|
|
// Handle `\n` in the matched token to track line numbers.
|
|
|
this._captureLocation(matched[0]);
|
|
|
this._cursor += matched[0].length;
|
|
|
return matched[0];
|
|
|
}
|
|
|
return null;
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Allows analyzing, and transforming token. Default implementation
|
|
|
* just passes the token through.
|
|
|
*/
|
|
|
onToken: function onToken(token) {
|
|
|
return token;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* Expose tokenizer so it can be accessed in semantic actions.
|
|
|
*/
|
|
|
yy.lexer = tokenizer;
|
|
|
yy.tokenizer = tokenizer;
|
|
|
|
|
|
/**
|
|
|
* Global parsing options. Some options can be shadowed per
|
|
|
* each `parse` call, if the optations are passed.
|
|
|
*
|
|
|
* Initalized to the `captureLocations` which is passed
|
|
|
* from the generator. Other options can be added at runtime.
|
|
|
*/
|
|
|
yy.options = {
|
|
|
captureLocations: true
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* Parsing module.
|
|
|
*/
|
|
|
var yyparse = {
|
|
|
/**
|
|
|
* Sets global parsing options.
|
|
|
*/
|
|
|
setOptions: function setOptions(options) {
|
|
|
yy.options = options;
|
|
|
return this;
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Returns parsing options.
|
|
|
*/
|
|
|
getOptions: function getOptions() {
|
|
|
return yy.options;
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Parses a string.
|
|
|
*/
|
|
|
parse: function parse(string, parseOptions) {
|
|
|
if (!tokenizer) {
|
|
|
throw new Error('Tokenizer instance wasn\'t specified.');
|
|
|
}
|
|
|
|
|
|
tokenizer.initString(string);
|
|
|
|
|
|
/**
|
|
|
* If parse options are passed, override global parse options for
|
|
|
* this call, and later restore global options.
|
|
|
*/
|
|
|
var globalOptions = yy.options;
|
|
|
if (parseOptions) {
|
|
|
yy.options = Object.assign({}, yy.options, parseOptions);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Allow callers to do setup work based on the
|
|
|
* parsing string, and passed options.
|
|
|
*/
|
|
|
yyparse.onParseBegin(string, tokenizer, yy.options);
|
|
|
|
|
|
stack.length = 0;
|
|
|
stack.push(0);
|
|
|
|
|
|
var token = tokenizer.getNextToken();
|
|
|
var shiftedToken = null;
|
|
|
|
|
|
do {
|
|
|
if (!token) {
|
|
|
// Restore options.
|
|
|
yy.options = globalOptions;
|
|
|
unexpectedEndOfInput();
|
|
|
}
|
|
|
|
|
|
var state = stack[stack.length - 1];
|
|
|
var column = tokens[token.type];
|
|
|
|
|
|
if (!table[state].hasOwnProperty(column)) {
|
|
|
yy.options = globalOptions;
|
|
|
unexpectedToken(token);
|
|
|
}
|
|
|
|
|
|
var entry = table[state][column];
|
|
|
|
|
|
// Shift action.
|
|
|
if (entry[0] === 's') {
|
|
|
var _loc2 = null;
|
|
|
|
|
|
if (yy.options.captureLocations) {
|
|
|
_loc2 = {
|
|
|
startOffset: token.startOffset,
|
|
|
endOffset: token.endOffset,
|
|
|
startLine: token.startLine,
|
|
|
endLine: token.endLine,
|
|
|
startColumn: token.startColumn,
|
|
|
endColumn: token.endColumn
|
|
|
};
|
|
|
}
|
|
|
|
|
|
shiftedToken = this.onShift(token);
|
|
|
|
|
|
stack.push({ symbol: tokens[shiftedToken.type], semanticValue: shiftedToken.value, loc: _loc2 }, Number(entry.slice(1)));
|
|
|
|
|
|
token = tokenizer.getNextToken();
|
|
|
}
|
|
|
|
|
|
// Reduce action.
|
|
|
else if (entry[0] === 'r') {
|
|
|
var productionNumber = entry.slice(1);
|
|
|
var production = productions[productionNumber];
|
|
|
var hasSemanticAction = typeof production[2] === 'function';
|
|
|
var semanticValueArgs = hasSemanticAction ? [] : null;
|
|
|
|
|
|
var locationArgs = hasSemanticAction && yy.options.captureLocations ? [] : null;
|
|
|
|
|
|
if (production[1] !== 0) {
|
|
|
var rhsLength = production[1];
|
|
|
while (rhsLength-- > 0) {
|
|
|
stack.pop();
|
|
|
var stackEntry = stack.pop();
|
|
|
|
|
|
if (hasSemanticAction) {
|
|
|
semanticValueArgs.unshift(stackEntry.semanticValue);
|
|
|
|
|
|
if (locationArgs) {
|
|
|
locationArgs.unshift(stackEntry.loc);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var reduceStackEntry = { symbol: production[0] };
|
|
|
|
|
|
if (hasSemanticAction) {
|
|
|
yytext = shiftedToken ? shiftedToken.value : null;
|
|
|
yyleng = shiftedToken ? shiftedToken.value.length : null;
|
|
|
|
|
|
var semanticActionArgs = locationArgs !== null ? semanticValueArgs.concat(locationArgs) : semanticValueArgs;
|
|
|
|
|
|
production[2].apply(production, _toConsumableArray(semanticActionArgs));
|
|
|
|
|
|
reduceStackEntry.semanticValue = __;
|
|
|
|
|
|
if (locationArgs) {
|
|
|
reduceStackEntry.loc = __loc;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var nextState = stack[stack.length - 1];
|
|
|
var symbolToReduceWith = production[0];
|
|
|
|
|
|
stack.push(reduceStackEntry, table[nextState][symbolToReduceWith]);
|
|
|
}
|
|
|
|
|
|
// Accept.
|
|
|
else if (entry === 'acc') {
|
|
|
stack.pop();
|
|
|
var parsed = stack.pop();
|
|
|
|
|
|
if (stack.length !== 1 || stack[0] !== 0 || tokenizer.hasMoreTokens()) {
|
|
|
// Restore options.
|
|
|
yy.options = globalOptions;
|
|
|
unexpectedToken(token);
|
|
|
}
|
|
|
|
|
|
if (parsed.hasOwnProperty('semanticValue')) {
|
|
|
yy.options = globalOptions;
|
|
|
yyparse.onParseEnd(parsed.semanticValue);
|
|
|
return parsed.semanticValue;
|
|
|
}
|
|
|
|
|
|
yyparse.onParseEnd();
|
|
|
|
|
|
// Restore options.
|
|
|
yy.options = globalOptions;
|
|
|
return true;
|
|
|
}
|
|
|
} while (tokenizer.hasMoreTokens() || stack.length > 1);
|
|
|
},
|
|
|
setTokenizer: function setTokenizer(customTokenizer) {
|
|
|
tokenizer = customTokenizer;
|
|
|
return yyparse;
|
|
|
},
|
|
|
getTokenizer: function getTokenizer() {
|
|
|
return tokenizer;
|
|
|
},
|
|
|
onParseBegin: function onParseBegin(string, tokenizer, options) {},
|
|
|
onParseEnd: function onParseEnd(parsed) {},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Allows analyzing, and transforming shifted token. Default implementation
|
|
|
* just passes the token through.
|
|
|
*/
|
|
|
onShift: function onShift(token) {
|
|
|
return token;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* Tracks capturing groups.
|
|
|
*/
|
|
|
var capturingGroupsCount = 0;
|
|
|
|
|
|
/**
|
|
|
* Tracks named groups.
|
|
|
*/
|
|
|
var namedGroups = {};
|
|
|
|
|
|
/**
|
|
|
* Parsing string.
|
|
|
*/
|
|
|
var parsingString = '';
|
|
|
|
|
|
yyparse.onParseBegin = function (string, lexer) {
|
|
|
parsingString = string;
|
|
|
capturingGroupsCount = 0;
|
|
|
namedGroups = {};
|
|
|
|
|
|
var lastSlash = string.lastIndexOf('/');
|
|
|
var flags = string.slice(lastSlash);
|
|
|
|
|
|
if (flags.includes('x') && flags.includes('u')) {
|
|
|
lexer.pushState('xu');
|
|
|
} else {
|
|
|
if (flags.includes('x')) {
|
|
|
lexer.pushState('x');
|
|
|
}
|
|
|
if (flags.includes('u')) {
|
|
|
lexer.pushState('u');
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* On shifting `(` remember its number to used on reduce.
|
|
|
*/
|
|
|
yyparse.onShift = function (token) {
|
|
|
if (token.type === 'L_PAREN' || token.type === 'NAMED_CAPTURE_GROUP') {
|
|
|
token.value = new String(token.value);
|
|
|
token.value.groupNumber = ++capturingGroupsCount;
|
|
|
}
|
|
|
return token;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* Extracts ranges from the range string.
|
|
|
*/
|
|
|
function getRange(text) {
|
|
|
var range = text.match(/\d+/g).map(Number);
|
|
|
|
|
|
if (Number.isFinite(range[1]) && range[1] < range[0]) {
|
|
|
throw new SyntaxError('Numbers out of order in ' + text + ' quantifier');
|
|
|
}
|
|
|
|
|
|
return range;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Checks class range
|
|
|
*/
|
|
|
function checkClassRange(from, to) {
|
|
|
if (from.kind === 'control' || to.kind === 'control' || !isNaN(from.codePoint) && !isNaN(to.codePoint) && from.codePoint > to.codePoint) {
|
|
|
throw new SyntaxError('Range ' + from.value + '-' + to.value + ' out of order in character class');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// ---------------------- Unicode property -------------------------------------------
|
|
|
|
|
|
var unicodeProperties = __webpack_require__(54009);
|
|
|
|
|
|
/**
|
|
|
* Unicode property.
|
|
|
*/
|
|
|
function UnicodeProperty(matched, loc) {
|
|
|
var negative = matched[1] === 'P';
|
|
|
var separatorIdx = matched.indexOf('=');
|
|
|
|
|
|
var name = matched.slice(3, separatorIdx !== -1 ? separatorIdx : -1);
|
|
|
var value = void 0;
|
|
|
|
|
|
// General_Category allows using only value as a shorthand.
|
|
|
var isShorthand = separatorIdx === -1 && unicodeProperties.isGeneralCategoryValue(name);
|
|
|
|
|
|
// Binary propery name.
|
|
|
var isBinaryProperty = separatorIdx === -1 && unicodeProperties.isBinaryPropertyName(name);
|
|
|
|
|
|
if (isShorthand) {
|
|
|
value = name;
|
|
|
name = 'General_Category';
|
|
|
} else if (isBinaryProperty) {
|
|
|
value = name;
|
|
|
} else {
|
|
|
if (!unicodeProperties.isValidName(name)) {
|
|
|
throw new SyntaxError('Invalid unicode property name: ' + name + '.');
|
|
|
}
|
|
|
|
|
|
value = matched.slice(separatorIdx + 1, -1);
|
|
|
|
|
|
if (!unicodeProperties.isValidValue(name, value)) {
|
|
|
throw new SyntaxError('Invalid ' + name + ' unicode property value: ' + value + '.');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return Node({
|
|
|
type: 'UnicodeProperty',
|
|
|
name: name,
|
|
|
value: value,
|
|
|
negative: negative,
|
|
|
shorthand: isShorthand,
|
|
|
binary: isBinaryProperty,
|
|
|
canonicalName: unicodeProperties.getCanonicalName(name) || name,
|
|
|
canonicalValue: unicodeProperties.getCanonicalValue(value) || value
|
|
|
}, loc);
|
|
|
}
|
|
|
|
|
|
// ----------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Creates a character node.
|
|
|
*/
|
|
|
function Char(value, kind, loc) {
|
|
|
var symbol = void 0;
|
|
|
var codePoint = void 0;
|
|
|
|
|
|
switch (kind) {
|
|
|
case 'decimal':
|
|
|
{
|
|
|
codePoint = Number(value.slice(1));
|
|
|
symbol = String.fromCodePoint(codePoint);
|
|
|
break;
|
|
|
}
|
|
|
case 'oct':
|
|
|
{
|
|
|
codePoint = parseInt(value.slice(1), 8);
|
|
|
symbol = String.fromCodePoint(codePoint);
|
|
|
break;
|
|
|
}
|
|
|
case 'hex':
|
|
|
case 'unicode':
|
|
|
{
|
|
|
if (value.lastIndexOf('\\u') > 0) {
|
|
|
var _value$split$slice = value.split('\\u').slice(1),
|
|
|
_value$split$slice2 = _slicedToArray(_value$split$slice, 2),
|
|
|
lead = _value$split$slice2[0],
|
|
|
trail = _value$split$slice2[1];
|
|
|
|
|
|
lead = parseInt(lead, 16);
|
|
|
trail = parseInt(trail, 16);
|
|
|
codePoint = (lead - 0xd800) * 0x400 + (trail - 0xdc00) + 0x10000;
|
|
|
|
|
|
symbol = String.fromCodePoint(codePoint);
|
|
|
} else {
|
|
|
var hex = value.slice(2).replace('{', '');
|
|
|
codePoint = parseInt(hex, 16);
|
|
|
if (codePoint > 0x10ffff) {
|
|
|
throw new SyntaxError('Bad character escape sequence: ' + value);
|
|
|
}
|
|
|
|
|
|
symbol = String.fromCodePoint(codePoint);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
case 'meta':
|
|
|
{
|
|
|
switch (value) {
|
|
|
case '\\t':
|
|
|
symbol = '\t';
|
|
|
codePoint = symbol.codePointAt(0);
|
|
|
break;
|
|
|
case '\\n':
|
|
|
symbol = '\n';
|
|
|
codePoint = symbol.codePointAt(0);
|
|
|
break;
|
|
|
case '\\r':
|
|
|
symbol = '\r';
|
|
|
codePoint = symbol.codePointAt(0);
|
|
|
break;
|
|
|
case '\\v':
|
|
|
symbol = '\v';
|
|
|
codePoint = symbol.codePointAt(0);
|
|
|
break;
|
|
|
case '\\f':
|
|
|
symbol = '\f';
|
|
|
codePoint = symbol.codePointAt(0);
|
|
|
break;
|
|
|
case '\\b':
|
|
|
symbol = '\b';
|
|
|
codePoint = symbol.codePointAt(0);
|
|
|
case '\\0':
|
|
|
symbol = '\0';
|
|
|
codePoint = 0;
|
|
|
case '.':
|
|
|
symbol = '.';
|
|
|
codePoint = NaN;
|
|
|
break;
|
|
|
default:
|
|
|
codePoint = NaN;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
case 'simple':
|
|
|
{
|
|
|
symbol = value;
|
|
|
codePoint = symbol.codePointAt(0);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return Node({
|
|
|
type: 'Char',
|
|
|
value: value,
|
|
|
kind: kind,
|
|
|
symbol: symbol,
|
|
|
codePoint: codePoint
|
|
|
}, loc);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Valid flags per current ECMAScript spec and
|
|
|
* stage 3+ proposals.
|
|
|
*/
|
|
|
var validFlags = 'gimsuxy';
|
|
|
|
|
|
/**
|
|
|
* Checks the flags are valid, and that
|
|
|
* we don't duplicate flags.
|
|
|
*/
|
|
|
function checkFlags(flags) {
|
|
|
var seen = new Set();
|
|
|
|
|
|
var _iteratorNormalCompletion = true;
|
|
|
var _didIteratorError = false;
|
|
|
var _iteratorError = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator = flags[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
|
var flag = _step.value;
|
|
|
|
|
|
if (seen.has(flag) || !validFlags.includes(flag)) {
|
|
|
throw new SyntaxError('Invalid flags: ' + flags);
|
|
|
}
|
|
|
seen.add(flag);
|
|
|
}
|
|
|
} catch (err) {
|
|
|
_didIteratorError = true;
|
|
|
_iteratorError = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion && _iterator.return) {
|
|
|
_iterator.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError) {
|
|
|
throw _iteratorError;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return flags.split('').sort().join('');
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Parses patterns like \1, \2, etc. either as a backreference
|
|
|
* to a group, or a deciaml char code.
|
|
|
*/
|
|
|
function GroupRefOrDecChar(text, textLoc) {
|
|
|
var reference = Number(text.slice(1));
|
|
|
|
|
|
if (reference > 0 && reference <= capturingGroupsCount) {
|
|
|
return Node({
|
|
|
type: 'Backreference',
|
|
|
kind: 'number',
|
|
|
number: reference,
|
|
|
reference: reference
|
|
|
}, textLoc);
|
|
|
}
|
|
|
|
|
|
return Char(text, 'decimal', textLoc);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Unicode names.
|
|
|
*/
|
|
|
var uReStart = /^\\u[0-9a-fA-F]{4}/; // only matches start of string
|
|
|
var ucpReStart = /^\\u\{[0-9a-fA-F]{1,}\}/; // only matches start of string
|
|
|
var ucpReAnywhere = /\\u\{[0-9a-fA-F]{1,}\}/; // matches anywhere in string
|
|
|
|
|
|
/**
|
|
|
* Validates Unicode group name.
|
|
|
*/
|
|
|
function validateUnicodeGroupName(name, state) {
|
|
|
var isUnicodeName = ucpReAnywhere.test(name);
|
|
|
var isUnicodeState = state === 'u' || state === 'xu' || state === 'u_class';
|
|
|
|
|
|
if (isUnicodeName && !isUnicodeState) {
|
|
|
throw new SyntaxError('invalid group Unicode name "' + name + '", use `u` flag.');
|
|
|
}
|
|
|
|
|
|
return name;
|
|
|
}
|
|
|
|
|
|
// Matches the following production: https://tc39.es/ecma262/#prod-RegExpUnicodeEscapeSequence
|
|
|
//
|
|
|
// RegExpUnicodeEscapeSequence ::
|
|
|
// `u` LeadSurrogate `\u` TrailSurrogate # as 'leadSurrogate', 'trailSurrogate'
|
|
|
// `u` LeadSurrogate # as 'leadSurrogateOnly'
|
|
|
// `u` TrailSurrogate # as 'trailSurrogateOnly'
|
|
|
// `u` NonSurrogate # as 'nonSurrogate'
|
|
|
// `u` `{` CodePoint `}` # as 'codePoint'
|
|
|
//
|
|
|
// LeadSurrogate ::
|
|
|
// Hex4Digits but only if the SV of Hex4Digits is in the inclusive range 0xD800 to 0xDBFF # [dD][89aAbB][0-9a-fA-F]{2}
|
|
|
//
|
|
|
// TrailSurrogate ::
|
|
|
// Hex4Digits but only if the SV of Hex4Digits is in the inclusive range 0xDC00 to 0xDFFF # [dD][c-fC-F][0-9a-fA-F]{2}
|
|
|
//
|
|
|
// NonSurrogate ::
|
|
|
// Hex4Digits but only if the SV of Hex4Digits is not in the inclusive range 0xD800 to 0xDFFF # [0-9a-ce-fA-CE-F][0-9a-fA-F]{3}|[dD][0-7][0-9a-fA-F]{2}
|
|
|
//
|
|
|
// CodePoint ::
|
|
|
// HexDigits but only if MV of HexDigits ≤ 0x10FFFF # 0*(?:[0-9a-fA-F]{1,5}|10[0-9a-fA-F]{4})
|
|
|
//
|
|
|
var uidRe = /\\u(?:([dD][89aAbB][0-9a-fA-F]{2})\\u([dD][c-fC-F][0-9a-fA-F]{2})|([dD][89aAbB][0-9a-fA-F]{2})|([dD][c-fC-F][0-9a-fA-F]{2})|([0-9a-ce-fA-CE-F][0-9a-fA-F]{3}|[dD][0-7][0-9a-fA-F]{2})|\{(0*(?:[0-9a-fA-F]{1,5}|10[0-9a-fA-F]{4}))\})/;
|
|
|
|
|
|
function decodeUnicodeGroupName(name) {
|
|
|
return name.replace(new RegExp(uidRe, 'g'), function (_, leadSurrogate, trailSurrogate, leadSurrogateOnly, trailSurrogateOnly, nonSurrogate, codePoint) {
|
|
|
if (leadSurrogate) {
|
|
|
return String.fromCodePoint(parseInt(leadSurrogate, 16), parseInt(trailSurrogate, 16));
|
|
|
}
|
|
|
if (leadSurrogateOnly) {
|
|
|
return String.fromCodePoint(parseInt(leadSurrogateOnly, 16));
|
|
|
}
|
|
|
if (trailSurrogateOnly) {
|
|
|
// TODO: Per the spec: https://tc39.es/ecma262/#prod-RegExpUnicodeEscapeSequence
|
|
|
// > Each `\u` TrailSurrogate for which the choice of associated `u` LeadSurrogate is ambiguous shall be associated with the nearest possible `u` LeadSurrogate that would otherwise have no corresponding `\u` TrailSurrogate.
|
|
|
return String.fromCodePoint(parseInt(trailSurrogateOnly, 16));
|
|
|
}
|
|
|
if (nonSurrogate) {
|
|
|
return String.fromCodePoint(parseInt(nonSurrogate, 16));
|
|
|
}
|
|
|
if (codePoint) {
|
|
|
return String.fromCodePoint(parseInt(codePoint, 16));
|
|
|
}
|
|
|
return _;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Extracts from `\k<foo>` pattern either a backreference
|
|
|
* to a named capturing group (if it presents), or parses it
|
|
|
* as a list of char: `\k`, `<`, `f`, etc.
|
|
|
*/
|
|
|
function NamedGroupRefOrChars(text, textLoc) {
|
|
|
var referenceRaw = text.slice(3, -1);
|
|
|
var reference = decodeUnicodeGroupName(referenceRaw);
|
|
|
|
|
|
if (namedGroups.hasOwnProperty(reference)) {
|
|
|
return Node({
|
|
|
type: 'Backreference',
|
|
|
kind: 'name',
|
|
|
number: namedGroups[reference],
|
|
|
reference: reference,
|
|
|
referenceRaw: referenceRaw
|
|
|
}, textLoc);
|
|
|
}
|
|
|
|
|
|
// Else `\k<foo>` should be parsed as a list of `Char`s.
|
|
|
// This is really a 0.01% edge case, but we should handle it.
|
|
|
|
|
|
var startOffset = null;
|
|
|
var startLine = null;
|
|
|
var endLine = null;
|
|
|
var startColumn = null;
|
|
|
|
|
|
if (textLoc) {
|
|
|
startOffset = textLoc.startOffset;
|
|
|
startLine = textLoc.startLine;
|
|
|
endLine = textLoc.endLine;
|
|
|
startColumn = textLoc.startColumn;
|
|
|
}
|
|
|
|
|
|
var charRe = /^[\w$<>]/;
|
|
|
var loc = void 0;
|
|
|
|
|
|
var chars = [
|
|
|
// Init to first \k, taking 2 symbols.
|
|
|
Char(text.slice(1, 2), 'simple', startOffset ? {
|
|
|
startLine: startLine,
|
|
|
endLine: endLine,
|
|
|
startColumn: startColumn,
|
|
|
startOffset: startOffset,
|
|
|
endOffset: startOffset += 2,
|
|
|
endColumn: startColumn += 2
|
|
|
} : null)];
|
|
|
|
|
|
// For \k
|
|
|
chars[0].escaped = true;
|
|
|
|
|
|
// Other symbols.
|
|
|
text = text.slice(2);
|
|
|
|
|
|
while (text.length > 0) {
|
|
|
var matched = null;
|
|
|
|
|
|
// Unicode, \u003B or \u{003B}
|
|
|
if ((matched = text.match(uReStart)) || (matched = text.match(ucpReStart))) {
|
|
|
if (startOffset) {
|
|
|
loc = {
|
|
|
startLine: startLine,
|
|
|
endLine: endLine,
|
|
|
startColumn: startColumn,
|
|
|
startOffset: startOffset,
|
|
|
endOffset: startOffset += matched[0].length,
|
|
|
endColumn: startColumn += matched[0].length
|
|
|
};
|
|
|
}
|
|
|
chars.push(Char(matched[0], 'unicode', loc));
|
|
|
text = text.slice(matched[0].length);
|
|
|
}
|
|
|
|
|
|
// Simple char.
|
|
|
else if (matched = text.match(charRe)) {
|
|
|
if (startOffset) {
|
|
|
loc = {
|
|
|
startLine: startLine,
|
|
|
endLine: endLine,
|
|
|
startColumn: startColumn,
|
|
|
startOffset: startOffset,
|
|
|
endOffset: ++startOffset,
|
|
|
endColumn: ++startColumn
|
|
|
};
|
|
|
}
|
|
|
chars.push(Char(matched[0], 'simple', loc));
|
|
|
text = text.slice(1);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return chars;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Creates an AST node with a location.
|
|
|
*/
|
|
|
function Node(node, loc) {
|
|
|
if (yy.options.captureLocations) {
|
|
|
node.loc = {
|
|
|
source: parsingString.slice(loc.startOffset, loc.endOffset),
|
|
|
start: {
|
|
|
line: loc.startLine,
|
|
|
column: loc.startColumn,
|
|
|
offset: loc.startOffset
|
|
|
},
|
|
|
end: {
|
|
|
line: loc.endLine,
|
|
|
column: loc.endColumn,
|
|
|
offset: loc.endOffset
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
return node;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Creates location node.
|
|
|
*/
|
|
|
function loc(start, end) {
|
|
|
if (!yy.options.captureLocations) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
startOffset: start.startOffset,
|
|
|
endOffset: end.endOffset,
|
|
|
startLine: start.startLine,
|
|
|
endLine: end.endLine,
|
|
|
startColumn: start.startColumn,
|
|
|
endColumn: end.endColumn
|
|
|
};
|
|
|
}
|
|
|
|
|
|
function unexpectedToken(token) {
|
|
|
if (token.type === EOF) {
|
|
|
unexpectedEndOfInput();
|
|
|
}
|
|
|
|
|
|
tokenizer.throwUnexpectedToken(token.value, token.startLine, token.startColumn);
|
|
|
}
|
|
|
|
|
|
function unexpectedEndOfInput() {
|
|
|
parseError('Unexpected end of input.');
|
|
|
}
|
|
|
|
|
|
function parseError(message) {
|
|
|
throw new SyntaxError(message);
|
|
|
}
|
|
|
|
|
|
module.exports = yyparse;
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 46418:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var regexpTreeParser = __webpack_require__(19495);
|
|
|
|
|
|
/**
|
|
|
* Original parse function.
|
|
|
*/
|
|
|
var generatedParseFn = regexpTreeParser.parse.bind(regexpTreeParser);
|
|
|
|
|
|
/**
|
|
|
* Parses a regular expression.
|
|
|
*
|
|
|
* Override original `regexpTreeParser.parse` to convert a value to a string,
|
|
|
* since in regexp-tree we may pass strings, and RegExp instance.
|
|
|
*/
|
|
|
regexpTreeParser.parse = function (regexp, options) {
|
|
|
return generatedParseFn('' + regexp, options);
|
|
|
};
|
|
|
|
|
|
// By default do not capture locations; callers may override.
|
|
|
regexpTreeParser.setOptions({ captureLocations: false });
|
|
|
|
|
|
module.exports = regexpTreeParser;
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 54009:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
var NON_BINARY_PROP_NAMES_TO_ALIASES = {
|
|
|
General_Category: 'gc',
|
|
|
Script: 'sc',
|
|
|
Script_Extensions: 'scx'
|
|
|
};
|
|
|
|
|
|
var NON_BINARY_ALIASES_TO_PROP_NAMES = inverseMap(NON_BINARY_PROP_NAMES_TO_ALIASES);
|
|
|
|
|
|
var BINARY_PROP_NAMES_TO_ALIASES = {
|
|
|
ASCII: 'ASCII',
|
|
|
ASCII_Hex_Digit: 'AHex',
|
|
|
Alphabetic: 'Alpha',
|
|
|
Any: 'Any',
|
|
|
Assigned: 'Assigned',
|
|
|
Bidi_Control: 'Bidi_C',
|
|
|
Bidi_Mirrored: 'Bidi_M',
|
|
|
Case_Ignorable: 'CI',
|
|
|
Cased: 'Cased',
|
|
|
Changes_When_Casefolded: 'CWCF',
|
|
|
Changes_When_Casemapped: 'CWCM',
|
|
|
Changes_When_Lowercased: 'CWL',
|
|
|
Changes_When_NFKC_Casefolded: 'CWKCF',
|
|
|
Changes_When_Titlecased: 'CWT',
|
|
|
Changes_When_Uppercased: 'CWU',
|
|
|
Dash: 'Dash',
|
|
|
Default_Ignorable_Code_Point: 'DI',
|
|
|
Deprecated: 'Dep',
|
|
|
Diacritic: 'Dia',
|
|
|
Emoji: 'Emoji',
|
|
|
Emoji_Component: 'Emoji_Component',
|
|
|
Emoji_Modifier: 'Emoji_Modifier',
|
|
|
Emoji_Modifier_Base: 'Emoji_Modifier_Base',
|
|
|
Emoji_Presentation: 'Emoji_Presentation',
|
|
|
Extended_Pictographic: 'Extended_Pictographic',
|
|
|
Extender: 'Ext',
|
|
|
Grapheme_Base: 'Gr_Base',
|
|
|
Grapheme_Extend: 'Gr_Ext',
|
|
|
Hex_Digit: 'Hex',
|
|
|
IDS_Binary_Operator: 'IDSB',
|
|
|
IDS_Trinary_Operator: 'IDST',
|
|
|
ID_Continue: 'IDC',
|
|
|
ID_Start: 'IDS',
|
|
|
Ideographic: 'Ideo',
|
|
|
Join_Control: 'Join_C',
|
|
|
Logical_Order_Exception: 'LOE',
|
|
|
Lowercase: 'Lower',
|
|
|
Math: 'Math',
|
|
|
Noncharacter_Code_Point: 'NChar',
|
|
|
Pattern_Syntax: 'Pat_Syn',
|
|
|
Pattern_White_Space: 'Pat_WS',
|
|
|
Quotation_Mark: 'QMark',
|
|
|
Radical: 'Radical',
|
|
|
Regional_Indicator: 'RI',
|
|
|
Sentence_Terminal: 'STerm',
|
|
|
Soft_Dotted: 'SD',
|
|
|
Terminal_Punctuation: 'Term',
|
|
|
Unified_Ideograph: 'UIdeo',
|
|
|
Uppercase: 'Upper',
|
|
|
Variation_Selector: 'VS',
|
|
|
White_Space: 'space',
|
|
|
XID_Continue: 'XIDC',
|
|
|
XID_Start: 'XIDS'
|
|
|
};
|
|
|
|
|
|
var BINARY_ALIASES_TO_PROP_NAMES = inverseMap(BINARY_PROP_NAMES_TO_ALIASES);
|
|
|
|
|
|
var GENERAL_CATEGORY_VALUE_TO_ALIASES = {
|
|
|
Cased_Letter: 'LC',
|
|
|
Close_Punctuation: 'Pe',
|
|
|
Connector_Punctuation: 'Pc',
|
|
|
Control: ['Cc', 'cntrl'],
|
|
|
Currency_Symbol: 'Sc',
|
|
|
Dash_Punctuation: 'Pd',
|
|
|
Decimal_Number: ['Nd', 'digit'],
|
|
|
Enclosing_Mark: 'Me',
|
|
|
Final_Punctuation: 'Pf',
|
|
|
Format: 'Cf',
|
|
|
Initial_Punctuation: 'Pi',
|
|
|
Letter: 'L',
|
|
|
Letter_Number: 'Nl',
|
|
|
Line_Separator: 'Zl',
|
|
|
Lowercase_Letter: 'Ll',
|
|
|
Mark: ['M', 'Combining_Mark'],
|
|
|
Math_Symbol: 'Sm',
|
|
|
Modifier_Letter: 'Lm',
|
|
|
Modifier_Symbol: 'Sk',
|
|
|
Nonspacing_Mark: 'Mn',
|
|
|
Number: 'N',
|
|
|
Open_Punctuation: 'Ps',
|
|
|
Other: 'C',
|
|
|
Other_Letter: 'Lo',
|
|
|
Other_Number: 'No',
|
|
|
Other_Punctuation: 'Po',
|
|
|
Other_Symbol: 'So',
|
|
|
Paragraph_Separator: 'Zp',
|
|
|
Private_Use: 'Co',
|
|
|
Punctuation: ['P', 'punct'],
|
|
|
Separator: 'Z',
|
|
|
Space_Separator: 'Zs',
|
|
|
Spacing_Mark: 'Mc',
|
|
|
Surrogate: 'Cs',
|
|
|
Symbol: 'S',
|
|
|
Titlecase_Letter: 'Lt',
|
|
|
Unassigned: 'Cn',
|
|
|
Uppercase_Letter: 'Lu'
|
|
|
};
|
|
|
|
|
|
var GENERAL_CATEGORY_VALUE_ALIASES_TO_VALUES = inverseMap(GENERAL_CATEGORY_VALUE_TO_ALIASES);
|
|
|
|
|
|
var SCRIPT_VALUE_TO_ALIASES = {
|
|
|
Adlam: 'Adlm',
|
|
|
Ahom: 'Ahom',
|
|
|
Anatolian_Hieroglyphs: 'Hluw',
|
|
|
Arabic: 'Arab',
|
|
|
Armenian: 'Armn',
|
|
|
Avestan: 'Avst',
|
|
|
Balinese: 'Bali',
|
|
|
Bamum: 'Bamu',
|
|
|
Bassa_Vah: 'Bass',
|
|
|
Batak: 'Batk',
|
|
|
Bengali: 'Beng',
|
|
|
Bhaiksuki: 'Bhks',
|
|
|
Bopomofo: 'Bopo',
|
|
|
Brahmi: 'Brah',
|
|
|
Braille: 'Brai',
|
|
|
Buginese: 'Bugi',
|
|
|
Buhid: 'Buhd',
|
|
|
Canadian_Aboriginal: 'Cans',
|
|
|
Carian: 'Cari',
|
|
|
Caucasian_Albanian: 'Aghb',
|
|
|
Chakma: 'Cakm',
|
|
|
Cham: 'Cham',
|
|
|
Cherokee: 'Cher',
|
|
|
Common: 'Zyyy',
|
|
|
Coptic: ['Copt', 'Qaac'],
|
|
|
Cuneiform: 'Xsux',
|
|
|
Cypriot: 'Cprt',
|
|
|
Cyrillic: 'Cyrl',
|
|
|
Deseret: 'Dsrt',
|
|
|
Devanagari: 'Deva',
|
|
|
Dogra: 'Dogr',
|
|
|
Duployan: 'Dupl',
|
|
|
Egyptian_Hieroglyphs: 'Egyp',
|
|
|
Elbasan: 'Elba',
|
|
|
Ethiopic: 'Ethi',
|
|
|
Georgian: 'Geor',
|
|
|
Glagolitic: 'Glag',
|
|
|
Gothic: 'Goth',
|
|
|
Grantha: 'Gran',
|
|
|
Greek: 'Grek',
|
|
|
Gujarati: 'Gujr',
|
|
|
Gunjala_Gondi: 'Gong',
|
|
|
Gurmukhi: 'Guru',
|
|
|
Han: 'Hani',
|
|
|
Hangul: 'Hang',
|
|
|
Hanifi_Rohingya: 'Rohg',
|
|
|
Hanunoo: 'Hano',
|
|
|
Hatran: 'Hatr',
|
|
|
Hebrew: 'Hebr',
|
|
|
Hiragana: 'Hira',
|
|
|
Imperial_Aramaic: 'Armi',
|
|
|
Inherited: ['Zinh', 'Qaai'],
|
|
|
Inscriptional_Pahlavi: 'Phli',
|
|
|
Inscriptional_Parthian: 'Prti',
|
|
|
Javanese: 'Java',
|
|
|
Kaithi: 'Kthi',
|
|
|
Kannada: 'Knda',
|
|
|
Katakana: 'Kana',
|
|
|
Kayah_Li: 'Kali',
|
|
|
Kharoshthi: 'Khar',
|
|
|
Khmer: 'Khmr',
|
|
|
Khojki: 'Khoj',
|
|
|
Khudawadi: 'Sind',
|
|
|
Lao: 'Laoo',
|
|
|
Latin: 'Latn',
|
|
|
Lepcha: 'Lepc',
|
|
|
Limbu: 'Limb',
|
|
|
Linear_A: 'Lina',
|
|
|
Linear_B: 'Linb',
|
|
|
Lisu: 'Lisu',
|
|
|
Lycian: 'Lyci',
|
|
|
Lydian: 'Lydi',
|
|
|
Mahajani: 'Mahj',
|
|
|
Makasar: 'Maka',
|
|
|
Malayalam: 'Mlym',
|
|
|
Mandaic: 'Mand',
|
|
|
Manichaean: 'Mani',
|
|
|
Marchen: 'Marc',
|
|
|
Medefaidrin: 'Medf',
|
|
|
Masaram_Gondi: 'Gonm',
|
|
|
Meetei_Mayek: 'Mtei',
|
|
|
Mende_Kikakui: 'Mend',
|
|
|
Meroitic_Cursive: 'Merc',
|
|
|
Meroitic_Hieroglyphs: 'Mero',
|
|
|
Miao: 'Plrd',
|
|
|
Modi: 'Modi',
|
|
|
Mongolian: 'Mong',
|
|
|
Mro: 'Mroo',
|
|
|
Multani: 'Mult',
|
|
|
Myanmar: 'Mymr',
|
|
|
Nabataean: 'Nbat',
|
|
|
New_Tai_Lue: 'Talu',
|
|
|
Newa: 'Newa',
|
|
|
Nko: 'Nkoo',
|
|
|
Nushu: 'Nshu',
|
|
|
Ogham: 'Ogam',
|
|
|
Ol_Chiki: 'Olck',
|
|
|
Old_Hungarian: 'Hung',
|
|
|
Old_Italic: 'Ital',
|
|
|
Old_North_Arabian: 'Narb',
|
|
|
Old_Permic: 'Perm',
|
|
|
Old_Persian: 'Xpeo',
|
|
|
Old_Sogdian: 'Sogo',
|
|
|
Old_South_Arabian: 'Sarb',
|
|
|
Old_Turkic: 'Orkh',
|
|
|
Oriya: 'Orya',
|
|
|
Osage: 'Osge',
|
|
|
Osmanya: 'Osma',
|
|
|
Pahawh_Hmong: 'Hmng',
|
|
|
Palmyrene: 'Palm',
|
|
|
Pau_Cin_Hau: 'Pauc',
|
|
|
Phags_Pa: 'Phag',
|
|
|
Phoenician: 'Phnx',
|
|
|
Psalter_Pahlavi: 'Phlp',
|
|
|
Rejang: 'Rjng',
|
|
|
Runic: 'Runr',
|
|
|
Samaritan: 'Samr',
|
|
|
Saurashtra: 'Saur',
|
|
|
Sharada: 'Shrd',
|
|
|
Shavian: 'Shaw',
|
|
|
Siddham: 'Sidd',
|
|
|
SignWriting: 'Sgnw',
|
|
|
Sinhala: 'Sinh',
|
|
|
Sogdian: 'Sogd',
|
|
|
Sora_Sompeng: 'Sora',
|
|
|
Soyombo: 'Soyo',
|
|
|
Sundanese: 'Sund',
|
|
|
Syloti_Nagri: 'Sylo',
|
|
|
Syriac: 'Syrc',
|
|
|
Tagalog: 'Tglg',
|
|
|
Tagbanwa: 'Tagb',
|
|
|
Tai_Le: 'Tale',
|
|
|
Tai_Tham: 'Lana',
|
|
|
Tai_Viet: 'Tavt',
|
|
|
Takri: 'Takr',
|
|
|
Tamil: 'Taml',
|
|
|
Tangut: 'Tang',
|
|
|
Telugu: 'Telu',
|
|
|
Thaana: 'Thaa',
|
|
|
Thai: 'Thai',
|
|
|
Tibetan: 'Tibt',
|
|
|
Tifinagh: 'Tfng',
|
|
|
Tirhuta: 'Tirh',
|
|
|
Ugaritic: 'Ugar',
|
|
|
Vai: 'Vaii',
|
|
|
Warang_Citi: 'Wara',
|
|
|
Yi: 'Yiii',
|
|
|
Zanabazar_Square: 'Zanb'
|
|
|
};
|
|
|
|
|
|
var SCRIPT_VALUE_ALIASES_TO_VALUE = inverseMap(SCRIPT_VALUE_TO_ALIASES);
|
|
|
|
|
|
function inverseMap(data) {
|
|
|
var inverse = {};
|
|
|
|
|
|
for (var name in data) {
|
|
|
if (!data.hasOwnProperty(name)) {
|
|
|
continue;
|
|
|
}
|
|
|
var value = data[name];
|
|
|
if (Array.isArray(value)) {
|
|
|
for (var i = 0; i < value.length; i++) {
|
|
|
inverse[value[i]] = name;
|
|
|
}
|
|
|
} else {
|
|
|
inverse[value] = name;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return inverse;
|
|
|
}
|
|
|
|
|
|
function isValidName(name) {
|
|
|
return NON_BINARY_PROP_NAMES_TO_ALIASES.hasOwnProperty(name) || NON_BINARY_ALIASES_TO_PROP_NAMES.hasOwnProperty(name) || BINARY_PROP_NAMES_TO_ALIASES.hasOwnProperty(name) || BINARY_ALIASES_TO_PROP_NAMES.hasOwnProperty(name);
|
|
|
}
|
|
|
|
|
|
function isValidValue(name, value) {
|
|
|
if (isGeneralCategoryName(name)) {
|
|
|
return isGeneralCategoryValue(value);
|
|
|
}
|
|
|
|
|
|
if (isScriptCategoryName(name)) {
|
|
|
return isScriptCategoryValue(value);
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
function isAlias(name) {
|
|
|
return NON_BINARY_ALIASES_TO_PROP_NAMES.hasOwnProperty(name) || BINARY_ALIASES_TO_PROP_NAMES.hasOwnProperty(name);
|
|
|
}
|
|
|
|
|
|
function isGeneralCategoryName(name) {
|
|
|
return name === 'General_Category' || name == 'gc';
|
|
|
}
|
|
|
|
|
|
function isScriptCategoryName(name) {
|
|
|
return name === 'Script' || name === 'Script_Extensions' || name === 'sc' || name === 'scx';
|
|
|
}
|
|
|
|
|
|
function isGeneralCategoryValue(value) {
|
|
|
return GENERAL_CATEGORY_VALUE_TO_ALIASES.hasOwnProperty(value) || GENERAL_CATEGORY_VALUE_ALIASES_TO_VALUES.hasOwnProperty(value);
|
|
|
}
|
|
|
|
|
|
function isScriptCategoryValue(value) {
|
|
|
return SCRIPT_VALUE_TO_ALIASES.hasOwnProperty(value) || SCRIPT_VALUE_ALIASES_TO_VALUE.hasOwnProperty(value);
|
|
|
}
|
|
|
|
|
|
function isBinaryPropertyName(name) {
|
|
|
return BINARY_PROP_NAMES_TO_ALIASES.hasOwnProperty(name) || BINARY_ALIASES_TO_PROP_NAMES.hasOwnProperty(name);
|
|
|
}
|
|
|
|
|
|
function getCanonicalName(name) {
|
|
|
if (NON_BINARY_ALIASES_TO_PROP_NAMES.hasOwnProperty(name)) {
|
|
|
return NON_BINARY_ALIASES_TO_PROP_NAMES[name];
|
|
|
}
|
|
|
|
|
|
if (BINARY_ALIASES_TO_PROP_NAMES.hasOwnProperty(name)) {
|
|
|
return BINARY_ALIASES_TO_PROP_NAMES[name];
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
function getCanonicalValue(value) {
|
|
|
if (GENERAL_CATEGORY_VALUE_ALIASES_TO_VALUES.hasOwnProperty(value)) {
|
|
|
return GENERAL_CATEGORY_VALUE_ALIASES_TO_VALUES[value];
|
|
|
}
|
|
|
|
|
|
if (SCRIPT_VALUE_ALIASES_TO_VALUE.hasOwnProperty(value)) {
|
|
|
return SCRIPT_VALUE_ALIASES_TO_VALUE[value];
|
|
|
}
|
|
|
|
|
|
if (BINARY_ALIASES_TO_PROP_NAMES.hasOwnProperty(value)) {
|
|
|
return BINARY_ALIASES_TO_PROP_NAMES[value];
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
|
isAlias: isAlias,
|
|
|
isValidName: isValidName,
|
|
|
isValidValue: isValidValue,
|
|
|
isGeneralCategoryValue: isGeneralCategoryValue,
|
|
|
isScriptCategoryValue: isScriptCategoryValue,
|
|
|
isBinaryPropertyName: isBinaryPropertyName,
|
|
|
getCanonicalName: getCanonicalName,
|
|
|
getCanonicalValue: getCanonicalValue,
|
|
|
|
|
|
NON_BINARY_PROP_NAMES_TO_ALIASES: NON_BINARY_PROP_NAMES_TO_ALIASES,
|
|
|
NON_BINARY_ALIASES_TO_PROP_NAMES: NON_BINARY_ALIASES_TO_PROP_NAMES,
|
|
|
|
|
|
BINARY_PROP_NAMES_TO_ALIASES: BINARY_PROP_NAMES_TO_ALIASES,
|
|
|
BINARY_ALIASES_TO_PROP_NAMES: BINARY_ALIASES_TO_PROP_NAMES,
|
|
|
|
|
|
GENERAL_CATEGORY_VALUE_TO_ALIASES: GENERAL_CATEGORY_VALUE_TO_ALIASES,
|
|
|
GENERAL_CATEGORY_VALUE_ALIASES_TO_VALUES: GENERAL_CATEGORY_VALUE_ALIASES_TO_VALUES,
|
|
|
|
|
|
SCRIPT_VALUE_TO_ALIASES: SCRIPT_VALUE_TO_ALIASES,
|
|
|
SCRIPT_VALUE_ALIASES_TO_VALUE: SCRIPT_VALUE_ALIASES_TO_VALUE
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 1315:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var compatTranspiler = __webpack_require__(47921);
|
|
|
var generator = __webpack_require__(44340);
|
|
|
var optimizer = __webpack_require__(33186);
|
|
|
var parser = __webpack_require__(46418);
|
|
|
var _transform = __webpack_require__(42113);
|
|
|
var _traverse = __webpack_require__(34862);
|
|
|
var fa = __webpack_require__(76186);
|
|
|
|
|
|
var _require = __webpack_require__(3561),
|
|
|
RegExpTree = _require.RegExpTree;
|
|
|
|
|
|
/**
|
|
|
* An API object for RegExp processing (parsing/transform/generation).
|
|
|
*/
|
|
|
|
|
|
|
|
|
var regexpTree = {
|
|
|
/**
|
|
|
* Parser module exposed.
|
|
|
*/
|
|
|
parser: parser,
|
|
|
|
|
|
/**
|
|
|
* Expose finite-automaton module.
|
|
|
*/
|
|
|
fa: fa,
|
|
|
|
|
|
/**
|
|
|
* `TransformResult` exposed.
|
|
|
*/
|
|
|
TransformResult: _transform.TransformResult,
|
|
|
|
|
|
/**
|
|
|
* Parses a regexp string, producing an AST.
|
|
|
*
|
|
|
* @param string regexp
|
|
|
*
|
|
|
* a regular expression in different formats: string, AST, RegExp.
|
|
|
*
|
|
|
* @param Object options
|
|
|
*
|
|
|
* parsing options for this parse call. Default are:
|
|
|
*
|
|
|
* - captureLocations: boolean
|
|
|
* - any other custom options
|
|
|
*
|
|
|
* @return Object AST
|
|
|
*/
|
|
|
parse: function parse(regexp, options) {
|
|
|
return parser.parse('' + regexp, options);
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Traverses a RegExp AST.
|
|
|
*
|
|
|
* @param Object ast
|
|
|
* @param Object | Array<Object> handlers
|
|
|
*
|
|
|
* Each `handler` is an object containing handler function for needed
|
|
|
* node types. Example:
|
|
|
*
|
|
|
* regexpTree.traverse(ast, {
|
|
|
* onChar(node) {
|
|
|
* ...
|
|
|
* },
|
|
|
* });
|
|
|
*
|
|
|
* The value for a node type may also be an object with functions pre and post.
|
|
|
* This enables more context-aware analyses, e.g. measuring star height.
|
|
|
*/
|
|
|
traverse: function traverse(ast, handlers, options) {
|
|
|
return _traverse.traverse(ast, handlers, options);
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Transforms a regular expression.
|
|
|
*
|
|
|
* A regexp can be passed in different formats (string, regexp or AST),
|
|
|
* applying a set of transformations. It is a convenient wrapper
|
|
|
* on top of "parse-traverse-generate" tool chain.
|
|
|
*
|
|
|
* @param string | AST | RegExp regexp - a regular expression;
|
|
|
* @param Object | Array<Object> handlers - a list of handlers.
|
|
|
*
|
|
|
* @return TransformResult - a transformation result.
|
|
|
*/
|
|
|
transform: function transform(regexp, handlers) {
|
|
|
return _transform.transform(regexp, handlers);
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Generates a RegExp string from an AST.
|
|
|
*
|
|
|
* @param Object ast
|
|
|
*
|
|
|
* Invariant:
|
|
|
*
|
|
|
* regexpTree.generate(regexpTree.parse('/[a-z]+/i')); // '/[a-z]+/i'
|
|
|
*/
|
|
|
generate: function generate(ast) {
|
|
|
return generator.generate(ast);
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Creates a RegExp object from a regexp string.
|
|
|
*
|
|
|
* @param string regexp
|
|
|
*/
|
|
|
toRegExp: function toRegExp(regexp) {
|
|
|
var compat = this.compatTranspile(regexp);
|
|
|
return new RegExp(compat.getSource(), compat.getFlags());
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Optimizes a regular expression by replacing some
|
|
|
* sub-expressions with their idiomatic patterns.
|
|
|
*
|
|
|
* @param string regexp
|
|
|
*
|
|
|
* @return TransformResult object
|
|
|
*/
|
|
|
optimize: function optimize(regexp, whitelist) {
|
|
|
var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
|
|
|
blacklist = _ref.blacklist;
|
|
|
|
|
|
return optimizer.optimize(regexp, { whitelist: whitelist, blacklist: blacklist });
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Translates a regular expression in new syntax or in new format
|
|
|
* into equivalent expressions in old syntax.
|
|
|
*
|
|
|
* @param string regexp
|
|
|
*
|
|
|
* @return TransformResult object
|
|
|
*/
|
|
|
compatTranspile: function compatTranspile(regexp, whitelist) {
|
|
|
return compatTranspiler.transform(regexp, whitelist);
|
|
|
},
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Executes a regular expression on a string.
|
|
|
*
|
|
|
* @param RegExp|string re - a regular expression.
|
|
|
* @param string string - a testing string.
|
|
|
*/
|
|
|
exec: function exec(re, string) {
|
|
|
if (typeof re === 'string') {
|
|
|
var compat = this.compatTranspile(re);
|
|
|
var extra = compat.getExtra();
|
|
|
|
|
|
if (extra.namedCapturingGroups) {
|
|
|
re = new RegExpTree(compat.toRegExp(), {
|
|
|
flags: compat.getFlags(),
|
|
|
source: compat.getSource(),
|
|
|
groups: extra.namedCapturingGroups
|
|
|
});
|
|
|
} else {
|
|
|
re = compat.toRegExp();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return re.exec(string);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
module.exports = regexpTree;
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 42113:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
var generator = __webpack_require__(44340);
|
|
|
var parser = __webpack_require__(46418);
|
|
|
var traverse = __webpack_require__(34862);
|
|
|
|
|
|
/**
|
|
|
* Transform result.
|
|
|
*/
|
|
|
|
|
|
var TransformResult = function () {
|
|
|
/**
|
|
|
* Initializes a transform result for an AST.
|
|
|
*
|
|
|
* @param Object ast - an AST node
|
|
|
* @param mixed extra - any extra data a transform may return
|
|
|
*/
|
|
|
function TransformResult(ast) {
|
|
|
var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
|
|
|
|
_classCallCheck(this, TransformResult);
|
|
|
|
|
|
this._ast = ast;
|
|
|
this._source = null;
|
|
|
this._string = null;
|
|
|
this._regexp = null;
|
|
|
this._extra = extra;
|
|
|
}
|
|
|
|
|
|
_createClass(TransformResult, [{
|
|
|
key: 'getAST',
|
|
|
value: function getAST() {
|
|
|
return this._ast;
|
|
|
}
|
|
|
}, {
|
|
|
key: 'setExtra',
|
|
|
value: function setExtra(extra) {
|
|
|
this._extra = extra;
|
|
|
}
|
|
|
}, {
|
|
|
key: 'getExtra',
|
|
|
value: function getExtra() {
|
|
|
return this._extra;
|
|
|
}
|
|
|
}, {
|
|
|
key: 'toRegExp',
|
|
|
value: function toRegExp() {
|
|
|
if (!this._regexp) {
|
|
|
this._regexp = new RegExp(this.getSource(), this._ast.flags);
|
|
|
}
|
|
|
return this._regexp;
|
|
|
}
|
|
|
}, {
|
|
|
key: 'getSource',
|
|
|
value: function getSource() {
|
|
|
if (!this._source) {
|
|
|
this._source = generator.generate(this._ast.body);
|
|
|
}
|
|
|
return this._source;
|
|
|
}
|
|
|
}, {
|
|
|
key: 'getFlags',
|
|
|
value: function getFlags() {
|
|
|
return this._ast.flags;
|
|
|
}
|
|
|
}, {
|
|
|
key: 'toString',
|
|
|
value: function toString() {
|
|
|
if (!this._string) {
|
|
|
this._string = generator.generate(this._ast);
|
|
|
}
|
|
|
return this._string;
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return TransformResult;
|
|
|
}();
|
|
|
|
|
|
module.exports = {
|
|
|
/**
|
|
|
* Expose `TransformResult`.
|
|
|
*/
|
|
|
TransformResult: TransformResult,
|
|
|
|
|
|
/**
|
|
|
* Transforms a regular expression applying a set of
|
|
|
* transformation handlers.
|
|
|
*
|
|
|
* @param string | AST | RegExp:
|
|
|
*
|
|
|
* a regular expression in different representations: a string,
|
|
|
* a RegExp object, or an AST.
|
|
|
*
|
|
|
* @param Object | Array<Object>:
|
|
|
*
|
|
|
* a handler (or a list of handlers) from `traverse` API.
|
|
|
*
|
|
|
* @return TransformResult instance.
|
|
|
*
|
|
|
* Example:
|
|
|
*
|
|
|
* transform(/[a-z]/i, {
|
|
|
* onChar(path) {
|
|
|
* const {node} = path;
|
|
|
*
|
|
|
* if (...) {
|
|
|
* path.remove();
|
|
|
* }
|
|
|
* }
|
|
|
* });
|
|
|
*/
|
|
|
transform: function transform(regexp, handlers) {
|
|
|
var ast = regexp;
|
|
|
|
|
|
if (regexp instanceof RegExp) {
|
|
|
regexp = '' + regexp;
|
|
|
}
|
|
|
|
|
|
if (typeof regexp === 'string') {
|
|
|
ast = parser.parse(regexp, {
|
|
|
captureLocations: true
|
|
|
});
|
|
|
}
|
|
|
|
|
|
traverse.traverse(ast, handlers);
|
|
|
|
|
|
return new TransformResult(ast);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 33065:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Flattens a nested disjunction node to a list.
|
|
|
*
|
|
|
* /a|b|c|d/
|
|
|
*
|
|
|
* {{{a, b}, c}, d} -> [a, b, c, d]
|
|
|
*/
|
|
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
|
|
function disjunctionToList(node) {
|
|
|
if (node.type !== 'Disjunction') {
|
|
|
throw new TypeError('Expected "Disjunction" node, got "' + node.type + '"');
|
|
|
}
|
|
|
|
|
|
var list = [];
|
|
|
|
|
|
if (node.left && node.left.type === 'Disjunction') {
|
|
|
list.push.apply(list, _toConsumableArray(disjunctionToList(node.left)).concat([node.right]));
|
|
|
} else {
|
|
|
list.push(node.left, node.right);
|
|
|
}
|
|
|
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Builds a nested disjunction node from a list.
|
|
|
*
|
|
|
* /a|b|c|d/
|
|
|
*
|
|
|
* [a, b, c, d] -> {{{a, b}, c}, d}
|
|
|
*/
|
|
|
function listToDisjunction(list) {
|
|
|
return list.reduce(function (left, right) {
|
|
|
return {
|
|
|
type: 'Disjunction',
|
|
|
left: left,
|
|
|
right: right
|
|
|
};
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Increases a quantifier by one.
|
|
|
* Does not change greediness.
|
|
|
* * -> +
|
|
|
* + -> {2,}
|
|
|
* ? -> {1,2}
|
|
|
* {2} -> {3}
|
|
|
* {2,} -> {3,}
|
|
|
* {2,3} -> {3,4}
|
|
|
*/
|
|
|
function increaseQuantifierByOne(quantifier) {
|
|
|
if (quantifier.kind === '*') {
|
|
|
|
|
|
quantifier.kind = '+';
|
|
|
} else if (quantifier.kind === '+') {
|
|
|
|
|
|
quantifier.kind = 'Range';
|
|
|
quantifier.from = 2;
|
|
|
delete quantifier.to;
|
|
|
} else if (quantifier.kind === '?') {
|
|
|
|
|
|
quantifier.kind = 'Range';
|
|
|
quantifier.from = 1;
|
|
|
quantifier.to = 2;
|
|
|
} else if (quantifier.kind === 'Range') {
|
|
|
|
|
|
quantifier.from += 1;
|
|
|
if (quantifier.to) {
|
|
|
quantifier.to += 1;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
|
disjunctionToList: disjunctionToList,
|
|
|
listToDisjunction: listToDisjunction,
|
|
|
increaseQuantifierByOne: increaseQuantifierByOne
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 34862:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var NodePath = __webpack_require__(53636);
|
|
|
|
|
|
/**
|
|
|
* Does an actual AST traversal, using visitor pattern,
|
|
|
* and calling set of callbacks.
|
|
|
*
|
|
|
* Based on https://github.com/olov/ast-traverse
|
|
|
*
|
|
|
* Expects AST in Mozilla Parser API: nodes which are supposed to be
|
|
|
* handled should have `type` property.
|
|
|
*
|
|
|
* @param Object root - a root node to start traversal from.
|
|
|
*
|
|
|
* @param Object options - an object with set of callbacks:
|
|
|
*
|
|
|
* - `pre(node, parent, prop, index)` - a hook called on node enter
|
|
|
* - `post`(node, parent, prop, index) - a hook called on node exit
|
|
|
* - `skipProperty(prop)` - a predicated whether a property should be skipped
|
|
|
*/
|
|
|
function astTraverse(root) {
|
|
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
|
|
|
|
var pre = options.pre;
|
|
|
var post = options.post;
|
|
|
var skipProperty = options.skipProperty;
|
|
|
|
|
|
function visit(node, parent, prop, idx) {
|
|
|
if (!node || typeof node.type !== 'string') {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var res = undefined;
|
|
|
if (pre) {
|
|
|
res = pre(node, parent, prop, idx);
|
|
|
}
|
|
|
|
|
|
if (res !== false) {
|
|
|
|
|
|
// A node can be replaced during traversal, so we have to
|
|
|
// recalculate it from the parent, to avoid traversing "dead" nodes.
|
|
|
if (parent && parent[prop]) {
|
|
|
if (!isNaN(idx)) {
|
|
|
node = parent[prop][idx];
|
|
|
} else {
|
|
|
node = parent[prop];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for (var _prop in node) {
|
|
|
if (node.hasOwnProperty(_prop)) {
|
|
|
if (skipProperty ? skipProperty(_prop, node) : _prop[0] === '$') {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
var child = node[_prop];
|
|
|
|
|
|
// Collection node.
|
|
|
//
|
|
|
// NOTE: a node (or several nodes) can be removed or inserted
|
|
|
// during traversal.
|
|
|
//
|
|
|
// Current traversing index is stored on top of the
|
|
|
// `NodePath.traversingIndexStack`. The stack is used to support
|
|
|
// recursive nature of the traversal.
|
|
|
//
|
|
|
// In this case `NodePath.traversingIndex` (which we use here) is
|
|
|
// updated in the NodePath remove/insert methods.
|
|
|
//
|
|
|
if (Array.isArray(child)) {
|
|
|
var index = 0;
|
|
|
NodePath.traversingIndexStack.push(index);
|
|
|
while (index < child.length) {
|
|
|
visit(child[index], node, _prop, index);
|
|
|
index = NodePath.updateTraversingIndex(+1);
|
|
|
}
|
|
|
NodePath.traversingIndexStack.pop();
|
|
|
}
|
|
|
|
|
|
// Simple node.
|
|
|
else {
|
|
|
visit(child, node, _prop);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (post) {
|
|
|
post(node, parent, prop, idx);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
visit(root, null);
|
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
|
/**
|
|
|
* Traverses an AST.
|
|
|
*
|
|
|
* @param Object ast - an AST node
|
|
|
*
|
|
|
* @param Object | Array<Object> handlers:
|
|
|
*
|
|
|
* an object (or an array of objects)
|
|
|
*
|
|
|
* Each such object contains a handler function per node.
|
|
|
* In case of an array of handlers, they are applied in order.
|
|
|
* A handler may return a transformed node (or a different type).
|
|
|
*
|
|
|
* The per-node function may instead be an object with functions pre and post.
|
|
|
* pre is called before visiting the node, post after.
|
|
|
* If a handler is a function, it is treated as the pre function, with an empty post.
|
|
|
*
|
|
|
* @param Object options:
|
|
|
*
|
|
|
* a config object, specifying traversal options:
|
|
|
*
|
|
|
* `asNodes`: boolean - whether handlers should receives raw AST nodes
|
|
|
* (false by default), instead of a `NodePath` wrapper. Note, by default
|
|
|
* `NodePath` wrapper provides a set of convenient method to manipulate
|
|
|
* a traversing AST, and also has access to all parents list. A raw
|
|
|
* nodes traversal should be used in rare cases, when no `NodePath`
|
|
|
* features are needed.
|
|
|
*
|
|
|
* Special hooks:
|
|
|
*
|
|
|
* - `shouldRun(ast)` - a predicate determining whether the handler
|
|
|
* should be applied.
|
|
|
*
|
|
|
* NOTE: Multiple handlers are used as an optimization of applying all of
|
|
|
* them in one AST traversal pass.
|
|
|
*/
|
|
|
traverse: function traverse(ast, handlers) {
|
|
|
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { asNodes: false };
|
|
|
|
|
|
|
|
|
if (!Array.isArray(handlers)) {
|
|
|
handlers = [handlers];
|
|
|
}
|
|
|
|
|
|
// Filter out handlers by result of `shouldRun`, if the method is present.
|
|
|
handlers = handlers.filter(function (handler) {
|
|
|
if (typeof handler.shouldRun !== 'function') {
|
|
|
return true;
|
|
|
}
|
|
|
return handler.shouldRun(ast);
|
|
|
});
|
|
|
|
|
|
NodePath.initRegistry();
|
|
|
|
|
|
// Allow handlers to initializer themselves.
|
|
|
handlers.forEach(function (handler) {
|
|
|
if (typeof handler.init === 'function') {
|
|
|
handler.init(ast);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
function getPathFor(node, parent, prop, index) {
|
|
|
var parentPath = NodePath.getForNode(parent);
|
|
|
var nodePath = NodePath.getForNode(node, parentPath, prop, index);
|
|
|
|
|
|
return nodePath;
|
|
|
}
|
|
|
|
|
|
// Handle actual nodes.
|
|
|
astTraverse(ast, {
|
|
|
/**
|
|
|
* Handler on node enter.
|
|
|
*/
|
|
|
pre: function pre(node, parent, prop, index) {
|
|
|
var nodePath = void 0;
|
|
|
if (!options.asNodes) {
|
|
|
nodePath = getPathFor(node, parent, prop, index);
|
|
|
}
|
|
|
|
|
|
var _iteratorNormalCompletion = true;
|
|
|
var _didIteratorError = false;
|
|
|
var _iteratorError = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator = handlers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
|
var handler = _step.value;
|
|
|
|
|
|
// "Catch-all" `*` handler.
|
|
|
if (typeof handler['*'] === 'function') {
|
|
|
if (nodePath) {
|
|
|
// A path/node can be removed by some previous handler.
|
|
|
if (!nodePath.isRemoved()) {
|
|
|
var handlerResult = handler['*'](nodePath);
|
|
|
// Explicitly stop traversal.
|
|
|
if (handlerResult === false) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
handler['*'](node, parent, prop, index);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Per-node handler.
|
|
|
var handlerFuncPre = void 0;
|
|
|
if (typeof handler[node.type] === 'function') {
|
|
|
handlerFuncPre = handler[node.type];
|
|
|
} else if (typeof handler[node.type] === 'object' && typeof handler[node.type].pre === 'function') {
|
|
|
handlerFuncPre = handler[node.type].pre;
|
|
|
}
|
|
|
|
|
|
if (handlerFuncPre) {
|
|
|
if (nodePath) {
|
|
|
// A path/node can be removed by some previous handler.
|
|
|
if (!nodePath.isRemoved()) {
|
|
|
var _handlerResult = handlerFuncPre.call(handler, nodePath);
|
|
|
// Explicitly stop traversal.
|
|
|
if (_handlerResult === false) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
handlerFuncPre.call(handler, node, parent, prop, index);
|
|
|
}
|
|
|
}
|
|
|
} // Loop over handlers
|
|
|
} catch (err) {
|
|
|
_didIteratorError = true;
|
|
|
_iteratorError = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion && _iterator.return) {
|
|
|
_iterator.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError) {
|
|
|
throw _iteratorError;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
// pre func
|
|
|
|
|
|
/**
|
|
|
* Handler on node exit.
|
|
|
*/
|
|
|
post: function post(node, parent, prop, index) {
|
|
|
if (!node) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var nodePath = void 0;
|
|
|
if (!options.asNodes) {
|
|
|
nodePath = getPathFor(node, parent, prop, index);
|
|
|
}
|
|
|
|
|
|
var _iteratorNormalCompletion2 = true;
|
|
|
var _didIteratorError2 = false;
|
|
|
var _iteratorError2 = undefined;
|
|
|
|
|
|
try {
|
|
|
for (var _iterator2 = handlers[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
|
var handler = _step2.value;
|
|
|
|
|
|
// Per-node handler.
|
|
|
var handlerFuncPost = void 0;
|
|
|
if (typeof handler[node.type] === 'object' && typeof handler[node.type].post === 'function') {
|
|
|
handlerFuncPost = handler[node.type].post;
|
|
|
}
|
|
|
|
|
|
if (handlerFuncPost) {
|
|
|
if (nodePath) {
|
|
|
// A path/node can be removed by some previous handler.
|
|
|
if (!nodePath.isRemoved()) {
|
|
|
var handlerResult = handlerFuncPost.call(handler, nodePath);
|
|
|
// Explicitly stop traversal.
|
|
|
if (handlerResult === false) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
handlerFuncPost.call(handler, node, parent, prop, index);
|
|
|
}
|
|
|
}
|
|
|
} // Loop over handlers
|
|
|
} catch (err) {
|
|
|
_didIteratorError2 = true;
|
|
|
_iteratorError2 = err;
|
|
|
} finally {
|
|
|
try {
|
|
|
if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
|
|
_iterator2.return();
|
|
|
}
|
|
|
} finally {
|
|
|
if (_didIteratorError2) {
|
|
|
throw _iteratorError2;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
// post func
|
|
|
|
|
|
/**
|
|
|
* Skip locations by default.
|
|
|
*/
|
|
|
skipProperty: function skipProperty(prop) {
|
|
|
return prop === 'loc';
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 53636:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
|
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
|
|
var DEFAULT_COLLECTION_PROP = 'expressions';
|
|
|
var DEFAULT_SINGLE_PROP = 'expression';
|
|
|
|
|
|
/**
|
|
|
* NodePath class encapsulates a traversing node,
|
|
|
* its parent node, property name in the parent node, and
|
|
|
* an index (in case if a node is part of a collection).
|
|
|
* It also provides set of methods for AST manipulation.
|
|
|
*/
|
|
|
|
|
|
var NodePath = function () {
|
|
|
/**
|
|
|
* NodePath constructor.
|
|
|
*
|
|
|
* @param Object node - an AST node
|
|
|
* @param NodePath parentPath - a nullable parent path
|
|
|
* @param string property - property name of the node in the parent
|
|
|
* @param number index - index of the node in a collection.
|
|
|
*/
|
|
|
function NodePath(node) {
|
|
|
var parentPath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
|
var property = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
|
var index = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
|
|
|
|
|
|
_classCallCheck(this, NodePath);
|
|
|
|
|
|
this.node = node;
|
|
|
this.parentPath = parentPath;
|
|
|
this.parent = parentPath ? parentPath.node : null;
|
|
|
this.property = property;
|
|
|
this.index = index;
|
|
|
}
|
|
|
|
|
|
_createClass(NodePath, [{
|
|
|
key: '_enforceProp',
|
|
|
value: function _enforceProp(property) {
|
|
|
if (!this.node.hasOwnProperty(property)) {
|
|
|
throw new Error('Node of type ' + this.node.type + ' doesn\'t have "' + property + '" collection.');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Sets a node into a children collection or the single child.
|
|
|
* By default child nodes are supposed to be under `expressions` property.
|
|
|
* An explicit property can be passed.
|
|
|
*
|
|
|
* @param Object node - a node to set into a collection or as single child
|
|
|
* @param number index - index at which to set
|
|
|
* @param string property - name of the collection or single property
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'setChild',
|
|
|
value: function setChild(node) {
|
|
|
var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
|
var property = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
|
|
|
|
|
|
|
var childPath = void 0;
|
|
|
if (index != null) {
|
|
|
if (!property) {
|
|
|
property = DEFAULT_COLLECTION_PROP;
|
|
|
}
|
|
|
this._enforceProp(property);
|
|
|
this.node[property][index] = node;
|
|
|
childPath = NodePath.getForNode(node, this, property, index);
|
|
|
} else {
|
|
|
if (!property) {
|
|
|
property = DEFAULT_SINGLE_PROP;
|
|
|
}
|
|
|
this._enforceProp(property);
|
|
|
this.node[property] = node;
|
|
|
childPath = NodePath.getForNode(node, this, property, null);
|
|
|
}
|
|
|
return childPath;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Appends a node to a children collection.
|
|
|
* By default child nodes are supposed to be under `expressions` property.
|
|
|
* An explicit property can be passed.
|
|
|
*
|
|
|
* @param Object node - a node to set into a collection or as single child
|
|
|
* @param string property - name of the collection or single property
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'appendChild',
|
|
|
value: function appendChild(node) {
|
|
|
var property = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
|
|
|
|
|
|
|
if (!property) {
|
|
|
property = DEFAULT_COLLECTION_PROP;
|
|
|
}
|
|
|
this._enforceProp(property);
|
|
|
var end = this.node[property].length;
|
|
|
return this.setChild(node, end, property);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Inserts a node into a collection.
|
|
|
* By default child nodes are supposed to be under `expressions` property.
|
|
|
* An explicit property can be passed.
|
|
|
*
|
|
|
* @param Object node - a node to insert into a collection
|
|
|
* @param number index - index at which to insert
|
|
|
* @param string property - name of the collection property
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'insertChildAt',
|
|
|
value: function insertChildAt(node, index) {
|
|
|
var property = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_COLLECTION_PROP;
|
|
|
|
|
|
this._enforceProp(property);
|
|
|
|
|
|
this.node[property].splice(index, 0, node);
|
|
|
|
|
|
// If we inserted a node before the traversing index,
|
|
|
// we should increase the later.
|
|
|
if (index <= NodePath.getTraversingIndex()) {
|
|
|
NodePath.updateTraversingIndex(+1);
|
|
|
}
|
|
|
|
|
|
this._rebuildIndex(this.node, property);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Removes a node.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'remove',
|
|
|
value: function remove() {
|
|
|
if (this.isRemoved()) {
|
|
|
return;
|
|
|
}
|
|
|
NodePath.registry.delete(this.node);
|
|
|
|
|
|
this.node = null;
|
|
|
|
|
|
if (!this.parent) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// A node is in a collection.
|
|
|
if (this.index !== null) {
|
|
|
this.parent[this.property].splice(this.index, 1);
|
|
|
|
|
|
// If we remove a node before the traversing index,
|
|
|
// we should increase the later.
|
|
|
if (this.index <= NodePath.getTraversingIndex()) {
|
|
|
NodePath.updateTraversingIndex(-1);
|
|
|
}
|
|
|
|
|
|
// Rebuild index.
|
|
|
this._rebuildIndex(this.parent, this.property);
|
|
|
|
|
|
this.index = null;
|
|
|
this.property = null;
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// A simple node.
|
|
|
delete this.parent[this.property];
|
|
|
this.property = null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Rebuilds child nodes index (used on remove/insert).
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: '_rebuildIndex',
|
|
|
value: function _rebuildIndex(parent, property) {
|
|
|
var parentPath = NodePath.getForNode(parent);
|
|
|
|
|
|
for (var i = 0; i < parent[property].length; i++) {
|
|
|
var path = NodePath.getForNode(parent[property][i], parentPath, property, i);
|
|
|
path.index = i;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Whether the path was removed.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'isRemoved',
|
|
|
value: function isRemoved() {
|
|
|
return this.node === null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Replaces a node with the passed one.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'replace',
|
|
|
value: function replace(newNode) {
|
|
|
NodePath.registry.delete(this.node);
|
|
|
|
|
|
this.node = newNode;
|
|
|
|
|
|
if (!this.parent) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
// A node is in a collection.
|
|
|
if (this.index !== null) {
|
|
|
this.parent[this.property][this.index] = newNode;
|
|
|
}
|
|
|
|
|
|
// A simple node.
|
|
|
else {
|
|
|
this.parent[this.property] = newNode;
|
|
|
}
|
|
|
|
|
|
// Rebuild the node path for the new node.
|
|
|
return NodePath.getForNode(newNode, this.parentPath, this.property, this.index);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Updates a node inline.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'update',
|
|
|
value: function update(nodeProps) {
|
|
|
Object.assign(this.node, nodeProps);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns parent.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getParent',
|
|
|
value: function getParent() {
|
|
|
return this.parentPath;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns nth child.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getChild',
|
|
|
value: function getChild() {
|
|
|
var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
|
|
|
|
|
if (this.node.expressions) {
|
|
|
return NodePath.getForNode(this.node.expressions[n], this, DEFAULT_COLLECTION_PROP, n);
|
|
|
} else if (this.node.expression && n == 0) {
|
|
|
return NodePath.getForNode(this.node.expression, this, DEFAULT_SINGLE_PROP);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Whether a path node is syntactically equal to the passed one.
|
|
|
*
|
|
|
* NOTE: we don't rely on `source` property from the `loc` data
|
|
|
* (which would be the fastest comparison), since it might be unsync
|
|
|
* after several modifications. We use here simple `JSON.stringify`
|
|
|
* excluding the `loc` data.
|
|
|
*
|
|
|
* @param NodePath other - path to compare to.
|
|
|
* @return boolean
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'hasEqualSource',
|
|
|
value: function hasEqualSource(path) {
|
|
|
return JSON.stringify(this.node, jsonSkipLoc) === JSON.stringify(path.node, jsonSkipLoc);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* JSON-encodes a node skipping location.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'jsonEncode',
|
|
|
value: function jsonEncode() {
|
|
|
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
|
format = _ref.format,
|
|
|
useLoc = _ref.useLoc;
|
|
|
|
|
|
return JSON.stringify(this.node, useLoc ? null : jsonSkipLoc, format);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns previous sibling.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getPreviousSibling',
|
|
|
value: function getPreviousSibling() {
|
|
|
if (!this.parent || this.index == null) {
|
|
|
return null;
|
|
|
}
|
|
|
return NodePath.getForNode(this.parent[this.property][this.index - 1], NodePath.getForNode(this.parent), this.property, this.index - 1);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns next sibling.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getNextSibling',
|
|
|
value: function getNextSibling() {
|
|
|
if (!this.parent || this.index == null) {
|
|
|
return null;
|
|
|
}
|
|
|
return NodePath.getForNode(this.parent[this.property][this.index + 1], NodePath.getForNode(this.parent), this.property, this.index + 1);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns a NodePath instance for a node.
|
|
|
*
|
|
|
* The same NodePath can be reused in several places, e.g.
|
|
|
* a parent node passed for all its children.
|
|
|
*/
|
|
|
|
|
|
}], [{
|
|
|
key: 'getForNode',
|
|
|
value: function getForNode(node) {
|
|
|
var parentPath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
|
var prop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
|
var index = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -1;
|
|
|
|
|
|
if (!node) {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
if (!NodePath.registry.has(node)) {
|
|
|
NodePath.registry.set(node, new NodePath(node, parentPath, prop, index == -1 ? null : index));
|
|
|
}
|
|
|
|
|
|
var path = NodePath.registry.get(node);
|
|
|
|
|
|
if (parentPath !== null) {
|
|
|
path.parentPath = parentPath;
|
|
|
path.parent = path.parentPath.node;
|
|
|
}
|
|
|
|
|
|
if (prop !== null) {
|
|
|
path.property = prop;
|
|
|
}
|
|
|
|
|
|
if (index >= 0) {
|
|
|
path.index = index;
|
|
|
}
|
|
|
|
|
|
return path;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Initializes the NodePath registry. The registry is a map from
|
|
|
* a node to its NodePath instance.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'initRegistry',
|
|
|
value: function initRegistry() {
|
|
|
if (!NodePath.registry) {
|
|
|
NodePath.registry = new Map();
|
|
|
}
|
|
|
NodePath.registry.clear();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Updates index of a currently traversing collection.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'updateTraversingIndex',
|
|
|
value: function updateTraversingIndex(dx) {
|
|
|
return NodePath.traversingIndexStack[NodePath.traversingIndexStack.length - 1] += dx;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Returns current traversing index.
|
|
|
*/
|
|
|
|
|
|
}, {
|
|
|
key: 'getTraversingIndex',
|
|
|
value: function getTraversingIndex() {
|
|
|
return NodePath.traversingIndexStack[NodePath.traversingIndexStack.length - 1];
|
|
|
}
|
|
|
}]);
|
|
|
|
|
|
return NodePath;
|
|
|
}();
|
|
|
|
|
|
NodePath.initRegistry();
|
|
|
|
|
|
/**
|
|
|
* Index of a currently traversing collection is stored on top of the
|
|
|
* `NodePath.traversingIndexStack`. Remove/insert methods can adjust
|
|
|
* this index.
|
|
|
*/
|
|
|
NodePath.traversingIndexStack = [];
|
|
|
|
|
|
// Helper function used to skip `loc` in JSON operations.
|
|
|
function jsonSkipLoc(prop, value) {
|
|
|
if (prop === 'loc') {
|
|
|
return undefined;
|
|
|
}
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
module.exports = NodePath;
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 64456:
|
|
|
/***/ ((module) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
* Performs a deep copy of an simple object.
|
|
|
* Only handles scalar values, arrays and objects.
|
|
|
*
|
|
|
* @param obj Object
|
|
|
*/
|
|
|
|
|
|
module.exports = function clone(obj) {
|
|
|
if (obj === null || typeof obj !== 'object') {
|
|
|
return obj;
|
|
|
}
|
|
|
var res = void 0;
|
|
|
if (Array.isArray(obj)) {
|
|
|
res = [];
|
|
|
} else {
|
|
|
res = {};
|
|
|
}
|
|
|
for (var i in obj) {
|
|
|
res[i] = clone(obj[i]);
|
|
|
}
|
|
|
return res;
|
|
|
};
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
/***/ 3661:
|
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
|
|
/**
|
|
|
* The MIT License (MIT)
|
|
|
* Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = __webpack_require__(1315);
|
|
|
|
|
|
/***/ })
|
|
|
|
|
|
}]);
|
|
|
//# sourceMappingURL=2913.274b19d8f201991f4a69.js.map?v=274b19d8f201991f4a69
|