parjs
Version:
A parser-combinator library for JavaScript.
68 lines (67 loc) • 2.36 kB
JavaScript
;
/**
* @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