UNPKG

parjs

Version:

A parser-combinator library for JavaScript.

68 lines (67 loc) 2.36 kB
"use strict"; /** * @module parjs/combinators */ /** */ Object.defineProperty(exports, "__esModule", { value: true }); const issues_1 = require("../issues"); const result_1 = require("../result"); const scalar_converter_1 = require("../scalar-converter"); const parser_1 = require("../parser"); const combinator_1 = require("./combinator"); function manySepBy(implDelimeter, max = Infinity) { let delimeter = scalar_converter_1.ScalarConverter.convert(implDelimeter); return combinator_1.defineCombinator(source => { return new class extends parser_1.ParjserBase { constructor() { super(...arguments); this.type = "manySepBy"; this.expecting = source.expecting; } _apply(ps) { let arr = []; source.apply(ps); if (ps.atLeast(result_1.ResultKind.HardFail)) { return; } else if (ps.isSoft) { ps.value = []; ps.kind = result_1.ResultKind.Ok; return; } let { position } = ps; arr.push(ps.value); let i = 1; while (true) { if (i >= max) break; delimeter.apply(ps); if (ps.isSoft) { break; } else if (ps.atLeast(result_1.ResultKind.HardFail)) { return; } source.apply(ps); if (ps.isSoft) { break; } else if (ps.atLeast(result_1.ResultKind.HardFail)) { return; } if (max >= Infinity && ps.position === position) { issues_1.Issues.guardAgainstInfiniteLoop("many"); } arr.push(ps.value); position = ps.position; i++; } ps.kind = result_1.ResultKind.Ok; ps.position = position; ps.value = arr; } }(); }); } exports.manySepBy = manySepBy; //# sourceMappingURL=many-sep-by.js.map