/** * The MIT License (MIT) * Copyright (c) 2017-present Dmitry Soshnikov */ '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); } };