12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- /**
- * The MIT License (MIT)
- * Copyright (c) 2017-present Dmitry Soshnikov <dmitry.soshnikov@gmail.com>
- */
- 'use strict';
- /**
- * 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
- };
|