12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- /**
- * The MIT License (MIT)
- * Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
- */
- 'use strict';
- 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 = require('../../../parser');
- var _require = require('./builders'),
- 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);
- }
- };
|