Socket
Socket
Sign inDemoInstall

parsimmon

Package Overview
Dependencies
Maintainers
3
Versions
49
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

parsimmon - npm Package Compare versions

Comparing version 0.9.2 to 1.0.0

469

build/parsimmon.browser.js

@@ -0,1 +1,3 @@

/* global module, define */
// This unsightly UMD-module header is here to make this code work without

@@ -18,6 +20,4 @@ // modification with CommonJS, AMD, and browser globals.

}(this, function() {
"use strict";
'use strict';
var Parsimmon = {};
// The Parser object is a wrapper for a parser function.

@@ -29,10 +29,14 @@ // Externally, you use one to parse a string by calling

// parser combinator methods.
function Parser(action) {
if (!(this instanceof Parser)) return new Parser(action);
function Parsimmon(action) {
if (!(this instanceof Parsimmon)) {
return new Parsimmon(action);
}
this._ = action;
};
}
Parsimmon.Parser = Parser;
function isParser(obj) {
return obj instanceof Parsimmon;
}
var _ = Parser.prototype;
var _ = Parsimmon.prototype;

@@ -60,9 +64,11 @@ function makeSuccess(index, value) {

function mergeReplies(result, last) {
if (!last) return result;
if (result.furthest > last.furthest) return result;
if (!last) {
return result;
}
if (result.furthest > last.furthest) {
return result;
}
var expected = (result.furthest === last.furthest)
? unsafeUnion(result.expected, last.expected)
: last.expected;
return {

@@ -74,3 +80,3 @@ status: result.status,

expected: expected
}
};
}

@@ -97,4 +103,4 @@

}
for (var i = 0; i < yn; i++) {
obj[ys[i]] = true;
for (var j = 0; j < yn; j++) {
obj[ys[j]] = true;
}

@@ -113,3 +119,3 @@ var keys = [];

function assertParser(p) {
if (!(p instanceof Parser)) {
if (!isParser(p)) {
throw new Error('not a parser: ' + p);

@@ -154,30 +160,31 @@ }

function formatExpected(expected) {
if (expected.length === 1) return expected[0];
return 'one of ' + expected.join(', ')
if (expected.length === 1) {
return expected[0];
}
return 'one of ' + expected.join(', ');
}
function formatGot(stream, error) {
function formatGot(input, error) {
var index = error.index;
var i = index.offset;
if (i === stream.length) return ', got the end of the stream'
var prefix = (i > 0 ? "'..." : "'");
var suffix = (stream.length - i > 12 ? "...'" : "'");
if (i === input.length) {
return ', got the end of the input';
}
var prefix = (i > 0 ? '\'...' : '\'');
var suffix = (input.length - i > 12 ? '...\'' : '\'');
return ' at line ' + index.line + ' column ' + index.column
+ ', got ' + prefix + stream.slice(i, i+12) + suffix
+ ', got ' + prefix + input.slice(i, i + 12) + suffix;
}
var formatError = Parsimmon.formatError = function(stream, error) {
return 'expected ' + formatExpected(error.expected) + formatGot(stream, error)
};
function formatError(input, error) {
return 'expected ' +
formatExpected(error.expected) +
formatGot(input, error);
}
_.parse = function(stream) {
if (typeof stream !== 'string') {
_.parse = function(input) {
if (typeof input !== 'string') {
throw new Error('.parse must be called with a string as its argument');
}
var result = this.skip(eof)._(stream, 0);
var result = this.skip(eof)._(input, 0);

@@ -189,3 +196,3 @@ return result.status ? {

status: false,
index: makeLineColumnIndex(stream, result.furthest),
index: makeLineColumnIndex(input, result.furthest),
expected: result.expected

@@ -195,28 +202,38 @@ };

// [Parser a] -> Parser [a]
var seq = Parsimmon.seq = function() {
_.tryParse = function(str) {
var result = this.parse(str);
if (result.status) {
return result.value;
} else {
var msg = formatError(str, result);
var err = new Error(msg);
err.type = 'ParsimmonError';
err.result = result;
throw err;
}
};
// [Parsimmon a] -> Parsimmon [a]
function seq() {
var parsers = [].slice.call(arguments);
var numParsers = parsers.length;
for (var j = 0; j < numParsers; j += 1) {
assertParser(parsers[j]);
}
return Parser(function(stream, i) {
return Parsimmon(function(input, i) {
var result;
var accum = new Array(numParsers);
for (var j = 0; j < numParsers; j += 1) {
result = mergeReplies(parsers[j]._(stream, i), result);
if (!result.status) return result;
accum[j] = result.value
result = mergeReplies(parsers[j]._(input, i), result);
if (!result.status) {
return result;
}
accum[j] = result.value;
i = result.index;
}
return mergeReplies(makeSuccess(i, accum), result);
});
};
}
var seqMap = Parsimmon.seqMap = function() {
function seqMap() {
var args = [].slice.call(arguments);

@@ -231,3 +248,3 @@ if (args.length === 0) {

});
};
}

@@ -237,19 +254,19 @@ /**

*/
var custom = Parsimmon.custom = function(parsingFunction) {
return Parser(parsingFunction(makeSuccess, makeFailure));
};
function custom(parsingFunction) {
return Parsimmon(parsingFunction(makeSuccess, makeFailure));
}
var alt = Parsimmon.alt = function() {
function alt() {
var parsers = [].slice.call(arguments);
var numParsers = parsers.length;
if (numParsers === 0) return fail('zero alternates')
if (numParsers === 0) {
return fail('zero alternates');
}
for (var j = 0; j < numParsers; j += 1) {
assertParser(parsers[j]);
}
return Parser(function(stream, i) {
return Parsimmon(function(input, i) {
var result;
for (var j = 0; j < parsers.length; j += 1) {
result = mergeReplies(parsers[j]._(stream, i), result);
result = mergeReplies(parsers[j]._(input, i), result);
if (result.status) return result;

@@ -259,21 +276,19 @@ }

});
};
}
var sepBy = Parsimmon.sepBy = function(parser, separator) {
function sepBy(parser, separator) {
// Argument asserted by sepBy1
return sepBy1(parser, separator).or(Parsimmon.of([]));
};
return sepBy1(parser, separator).or(succeed([]));
}
var sepBy1 = Parsimmon.sepBy1 = function(parser, separator) {
function sepBy1(parser, separator) {
assertParser(parser);
assertParser(separator);
var pairs = separator.then(parser).many();
return parser.chain(function(r) {
return pairs.map(function(rs) {
return [r].concat(rs);
})
})
};
});
});
}

@@ -289,3 +304,2 @@ // -*- primitive combinators -*- //

}
assertParser(next);

@@ -312,15 +326,12 @@ return seq(this, next).map(function(results) { return results[1]; });

return Parser(function(stream, i) {
return Parsimmon(function(input, i) {
var accum = [];
var result;
var prevResult;
var result = undefined;
for (;;) {
result = mergeReplies(self._(stream, i), result);
result = mergeReplies(self._(input, i), result);
if (result.status) {
i = result.index;
accum.push(result.value);
}
else {
} else {
return mergeReplies(makeSuccess(i, accum), result);

@@ -353,16 +364,14 @@ }

_.times = function(min, max) {
if (arguments.length < 2) max = min;
var self = this;
if (arguments.length < 2) {
max = min;
}
assertNumber(min);
assertNumber(max);
return Parser(function(stream, i) {
return Parsimmon(function(input, i) {
var accum = [];
var start = i;
var result;
var prevResult;
var result = undefined;
var prevResult = undefined;
for (var times = 0; times < min; times += 1) {
result = self._(stream, i);
result = self._(input, i);
prevResult = mergeReplies(result, prevResult);

@@ -372,8 +381,8 @@ if (result.status) {

accum.push(result.value);
} else {
return prevResult;
}
else return prevResult;
}
for (; times < max; times += 1) {
result = self._(stream, i);
result = self._(input, i);
prevResult = mergeReplies(result, prevResult);

@@ -383,6 +392,6 @@ if (result.status) {

accum.push(result.value);
} else {
break;
}
else break;
}
return mergeReplies(makeSuccess(i, accum), prevResult);

@@ -393,6 +402,13 @@ });

// -*- higher-level combinators -*- //
_.result = function(res) { return this.map(function(_) { return res; }); };
_.atMost = function(n) { return this.times(0, n); };
_.result = function(res) {
return this.map(function() {
return res;
});
};
_.atMost = function(n) {
return this.times(0, n);
};
_.atLeast = function(n) {
var self = this;
return seqMap(this.times(n), this.many(), function(init, rest) {

@@ -404,12 +420,13 @@ return init.concat(rest);

_.map = function(fn) {
assertFunction(fn);
var self = this;
return Parser(function(stream, i) {
var result = self._(stream, i);
if (!result.status) return result;
return Parsimmon(function(input, i) {
var result = self._(input, i);
if (!result.status) {
return result;
}
return mergeReplies(makeSuccess(result.index, fn(result.value)), result);
});
};
_['fantasy-land/map'] = _.map;

@@ -422,3 +439,7 @@ _.skip = function(next) {

return seqMap(index, this, index, function(start, value, end) {
return { start: start, value: value, end: end };
return {
start: start,
value: value,
end: end
};
});

@@ -429,5 +450,7 @@ };

var self = this;
return Parser(function(stream, i) {
var reply = self._(stream, i);
if (!reply.status) reply.expected = [expected];
return Parsimmon(function(input, i) {
var reply = self._(input, i);
if (!reply.status) {
reply.expected = [expected];
}
return reply;

@@ -437,27 +460,27 @@ });

_.fallback = function(result) {
return this.or(succeed(result));
};
// -*- primitive parsers -*- //
var string = Parsimmon.string = function(str) {
var len = str.length;
var expected = "'"+str+"'";
function string(str) {
assertString(str);
return Parser(function(stream, i) {
var head = stream.slice(i, i+len);
var expected = '\'' + str + '\'';
return Parsimmon(function(input, i) {
var j = i + str.length;
var head = input.slice(i, j);
if (head === str) {
return makeSuccess(i+len, head);
}
else {
return makeSuccess(j, head);
} else {
return makeFailure(i, expected);
}
});
};
}
var flags = function(re) {
function flags(re) {
var s = '' + re;
return s.slice(s.lastIndexOf('/') + 1);
};
}
var regexp = Parsimmon.regexp = function(re, group) {
function regexp(re, group) {
assertRegexp(re);

@@ -469,9 +492,6 @@ if (arguments.length >= 2) {

}
var anchored = RegExp('^(?:' + re.source + ')', flags(re));
var expected = '' + re;
return Parser(function(stream, i) {
var match = anchored.exec(stream.slice(i));
return Parsimmon(function(input, i) {
var match = anchored.exec(input.slice(i));
if (match) {

@@ -484,74 +504,73 @@ var fullMatch = match[0];

}
return makeFailure(i, expected);
});
};
Parsimmon.regex = regexp;
}
var succeed = Parsimmon.succeed = function(value) {
return Parser(function(stream, i) {
function succeed(value) {
return Parsimmon(function(input, i) {
return makeSuccess(i, value);
});
};
}
var fail = Parsimmon.fail = function(expected) {
return Parser(function(stream, i) { return makeFailure(i, expected); });
};
function fail(expected) {
return Parsimmon(function(input, i) {
return makeFailure(i, expected);
});
}
var letter = Parsimmon.letter = regexp(/[a-z]/i).desc('a letter')
var letters = Parsimmon.letters = regexp(/[a-z]*/i)
var digit = Parsimmon.digit = regexp(/[0-9]/).desc('a digit');
var digits = Parsimmon.digits = regexp(/[0-9]*/)
var whitespace = Parsimmon.whitespace = regexp(/\s+/).desc('whitespace');
var optWhitespace = Parsimmon.optWhitespace = regexp(/\s*/);
var any = Parsimmon.any = Parser(function(stream, i) {
if (i >= stream.length) return makeFailure(i, 'any character');
return makeSuccess(i+1, stream.charAt(i));
var any = Parsimmon(function(input, i) {
if (i >= input.length) {
return makeFailure(i, 'any character');
}
return makeSuccess(i+1, input.charAt(i));
});
var all = Parsimmon.all = Parser(function(stream, i) {
return makeSuccess(stream.length, stream.slice(i));
var all = Parsimmon(function(input, i) {
return makeSuccess(input.length, input.slice(i));
});
var eof = Parsimmon.eof = Parser(function(stream, i) {
if (i < stream.length) return makeFailure(i, 'EOF');
var eof = Parsimmon(function(input, i) {
if (i < input.length) {
return makeFailure(i, 'EOF');
}
return makeSuccess(i, null);
});
var test = Parsimmon.test = function(predicate) {
function test(predicate) {
assertFunction(predicate);
return Parser(function(stream, i) {
var char = stream.charAt(i);
if (i < stream.length && predicate(char)) {
return makeSuccess(i+1, char);
return Parsimmon(function(input, i) {
var char = input.charAt(i);
if (i < input.length && predicate(char)) {
return makeSuccess(i + 1, char);
} else {
return makeFailure(i, 'a character matching ' + predicate);
}
else {
return makeFailure(i, 'a character matching '+predicate);
}
});
};
}
var oneOf = Parsimmon.oneOf = function(str) {
return test(function(ch) { return str.indexOf(ch) >= 0; });
};
function oneOf(str) {
return test(function(ch) {
return str.indexOf(ch) >= 0;
});
}
var noneOf = Parsimmon.noneOf = function(str) {
return test(function(ch) { return str.indexOf(ch) < 0; });
};
function noneOf(str) {
return test(function(ch) {
return str.indexOf(ch) < 0;
});
}
var takeWhile = Parsimmon.takeWhile = function(predicate) {
function takeWhile(predicate) {
assertFunction(predicate);
return Parser(function(stream, i) {
return Parsimmon(function(input, i) {
var j = i;
while (j < stream.length && predicate(stream.charAt(j))) j += 1;
return makeSuccess(j, stream.slice(i, j));
while (j < input.length && predicate(input.charAt(j))) {
j++;
}
return makeSuccess(j, input.slice(i, j));
});
};
}
var lazy = Parsimmon.lazy = function(desc, f) {
function lazy(desc, f) {
if (arguments.length < 2) {

@@ -562,14 +581,16 @@ f = desc;

var parser = Parser(function(stream, i) {
var parser = Parsimmon(function(input, i) {
parser._ = f()._;
return parser._(stream, i);
return parser._(input, i);
});
if (desc) parser = parser.desc(desc)
if (desc) {
return parser.desc(desc);
} else {
return parser;
}
}
return parser;
};
var makeLineColumnIndex = function(stream, i) {
var lines = stream.slice(0, i).split("\n");
function makeLineColumnIndex(input, i) {
var lines = input.slice(0, i).split('\n');
// Note that unlike the character offset, the line and column offsets are

@@ -579,3 +600,2 @@ // 1-based.

var columnWeAreUpTo = lines[lines.length - 1].length + 1;
return {

@@ -586,35 +606,94 @@ offset: i,

};
};
}
var index
= Parsimmon.index
= Parser(function(stream, i) {
return makeSuccess(i, makeLineColumnIndex(stream, i));
});
var index = Parsimmon(function(input, i) {
return makeSuccess(i, makeLineColumnIndex(input, i));
});
//- fantasyland compat
function empty() {
return fail('fantasy-land/empty');
}
//- Monoid (Alternative, really)
// Fantasy Land Semigroup support
_.concat = _.or;
_.empty = fail('empty')
_['fantasy-land/concat'] = _.concat;
//- Applicative
_.of = Parser.of = Parsimmon.of = succeed
// Fantasy Land Semigroup and Monoid support
_.empty = empty;
_['fantasy-land/empty'] = _.empty;
// Fantasy Land Applicative support
_.of = succeed;
_['fantasy-land/of'] = _.of;
// Fantasy Land Applicative support
_.ap = function(other) {
return seqMap(this, other, function(f, x) { return f(x); })
return seqMap(other, this, function(f, x) {
return f(x);
});
};
_['fantasy-land/ap'] = _.ap;
//- Monad
// Fantasy Land Monad support
_.chain = function(f) {
var self = this;
return Parser(function(stream, i) {
var result = self._(stream, i);
if (!result.status) return result;
return Parsimmon(function(input, i) {
var result = self._(input, i);
if (!result.status) {
return result;
}
var nextParser = f(result.value);
return mergeReplies(nextParser._(stream, result.index), result);
return mergeReplies(nextParser._(input, result.index), result);
});
};
_['fantasy-land/chain'] = _.chain;
var digit = regexp(/[0-9]/).desc('a digit');
var digits = regexp(/[0-9]*/).desc('optional digits');
var letter = regexp(/[a-z]/i).desc('a letter');
var letters = regexp(/[a-z]*/i).desc('optional letters');
var optWhitespace = regexp(/\s*/).desc('optional whitespace');
var whitespace = regexp(/\s+/).desc('whitespace');
Parsimmon.all = all;
Parsimmon.alt = alt;
Parsimmon.any = any;
Parsimmon.custom = custom;
Parsimmon.digit = digit;
Parsimmon.digits = digits;
Parsimmon.eof = eof;
Parsimmon.fail = fail;
Parsimmon.formatError = formatError;
Parsimmon.index = index;
Parsimmon.isParser = isParser;
Parsimmon.lazy = lazy;
Parsimmon.letter = letter;
Parsimmon.letters = letters;
Parsimmon.makeFailure = makeFailure;
Parsimmon.makeSuccess = makeSuccess;
Parsimmon.noneOf = noneOf;
Parsimmon.oneOf = oneOf;
Parsimmon.optWhitespace = optWhitespace;
Parsimmon.Parser = Parsimmon;
Parsimmon.regex = regexp;
Parsimmon.regexp = regexp;
Parsimmon.sepBy = sepBy;
Parsimmon.sepBy1 = sepBy1;
Parsimmon.seq = seq;
Parsimmon.seqMap = seqMap;
Parsimmon.string = string;
Parsimmon.succeed = succeed;
Parsimmon.takeWhile = takeWhile;
Parsimmon.test = test;
Parsimmon.whitespace = whitespace;
// Fantasy Land Semigroup support
Parsimmon.empty = empty;
Parsimmon['fantasy-land/empty'] = empty;
// Fantasy Land Applicative support
Parsimmon.of = succeed;
Parsimmon['fantasy-land/of'] = succeed;
return Parsimmon;
}));

@@ -1,1 +0,1 @@

(function(r,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{r.Parsimmon=t()}})(this,function(){"use strict";var r={};function t(r){if(!(this instanceof t))return new t(r);this._=r}r.Parser=t;var n=t.prototype;function e(r,t){return{status:true,index:r,value:t,furthest:-1,expected:[]}}function u(r,t){return{status:false,index:-1,value:null,furthest:r,expected:[t]}}function a(r,t){if(!t)return r;if(r.furthest>t.furthest)return r;var n=r.furthest===t.furthest?i(r.expected,t.expected):t.expected;return{status:r.status,index:r.index,value:r.value,furthest:t.furthest,expected:n}}function i(r,t){var n=r.length;var e=t.length;if(n===0){return t}else if(e===0){return r}var u={};for(var a=0;a<n;a++){u[r[a]]=true}for(var a=0;a<e;a++){u[t[a]]=true}var i=[];for(var f in u){if(u.hasOwnProperty(f)){i.push(f)}}i.sort();return i}function f(r){if(!(r instanceof t)){throw new Error("not a parser: "+r)}}function o(r){if(typeof r!=="number"){throw new Error("not a number: "+r)}}function s(r){if(!(r instanceof RegExp)){throw new Error("not a regexp: "+r)}var t=E(r);for(var n=0;n<t.length;n++){var e=t.charAt(n);if(e!="i"&&e!="m"&&e!="u"){throw new Error('unsupported regexp flag "'+e+'": '+r)}}}function c(r){if(typeof r!=="function"){throw new Error("not a function: "+r)}}function v(r){if(typeof r!=="string"){throw new Error("not a string: "+r)}}function l(r){if(r.length===1)return r[0];return"one of "+r.join(", ")}function h(r,t){var n=t.index;var e=n.offset;if(e===r.length)return", got the end of the stream";var u=e>0?"'...":"'";var a=r.length-e>12?"...'":"'";return" at line "+n.line+" column "+n.column+", got "+u+r.slice(e,e+12)+a}var p=r.formatError=function(r,t){return"expected "+l(t.expected)+h(r,t)};n.parse=function(r){if(typeof r!=="string"){throw new Error(".parse must be called with a string as its argument")}var t=this.skip(W)._(r,0);return t.status?{status:true,value:t.value}:{status:false,index:G(r,t.furthest),expected:t.expected}};var d=r.seq=function(){var r=[].slice.call(arguments);var n=r.length;for(var u=0;u<n;u+=1){f(r[u])}return t(function(t,u){var i;var f=new Array(n);for(var o=0;o<n;o+=1){i=a(r[o]._(t,u),i);if(!i.status)return i;f[o]=i.value;u=i.index}return a(e(u,f),i)})};var g=r.seqMap=function(){var r=[].slice.call(arguments);if(r.length===0){throw new Error("seqMap needs at least one argument")}var t=r.pop();c(t);return d.apply(null,r).map(function(r){return t.apply(null,r)})};var x=r.custom=function(r){return t(r(e,u))};var m=r.alt=function(){var r=[].slice.call(arguments);var n=r.length;if(n===0)return k("zero alternates");for(var e=0;e<n;e+=1){f(r[e])}return t(function(t,n){var e;for(var u=0;u<r.length;u+=1){e=a(r[u]._(t,n),e);if(e.status)return e}return e})};var w=r.sepBy=function(t,n){return y(t,n).or(r.of([]))};var y=r.sepBy1=function(r,t){f(r);f(t);var n=t.then(r).many();return r.chain(function(r){return n.map(function(t){return[r].concat(t)})})};n.or=function(r){return m(this,r)};n.then=function(r){if(typeof r==="function"){throw new Error("chaining features of .then are no longer supported, use .chain instead")}f(r);return d(this,r).map(function(r){return r[1]})};n.many=function(){var r=this;return t(function(t,n){var u=[];var i;var f;for(;;){i=a(r._(t,n),i);if(i.status){n=i.index;u.push(i.value)}else{return a(e(n,u),i)}}})};n.times=function(r,n){if(arguments.length<2)n=r;var u=this;o(r);o(n);return t(function(t,i){var f=[];var o=i;var s;var c;for(var v=0;v<r;v+=1){s=u._(t,i);c=a(s,c);if(s.status){i=s.index;f.push(s.value)}else return c}for(;v<n;v+=1){s=u._(t,i);c=a(s,c);if(s.status){i=s.index;f.push(s.value)}else break}return a(e(i,f),c)})};n.result=function(r){return this.map(function(t){return r})};n.atMost=function(r){return this.times(0,r)};n.atLeast=function(r){var t=this;return g(this.times(r),this.many(),function(r,t){return r.concat(t)})};n.map=function(r){c(r);var n=this;return t(function(t,u){var i=n._(t,u);if(!i.status)return i;return a(e(i.index,r(i.value)),i)})};n.skip=function(r){return d(this,r).map(function(r){return r[0]})};n.mark=function(){return g(H,this,H,function(r,t,n){return{start:r,value:t,end:n}})};n.desc=function(r){var n=this;return t(function(t,e){var u=n._(t,e);if(!u.status)u.expected=[r];return u})};var _=r.string=function(r){var n=r.length;var a="'"+r+"'";v(r);return t(function(t,i){var f=t.slice(i,i+n);if(f===r){return e(i+n,f)}else{return u(i,a)}})};var E=function(r){var t=""+r;return t.slice(t.lastIndexOf("/")+1)};var O=r.regexp=function(r,n){s(r);if(arguments.length>=2){o(n)}else{n=0}var a=RegExp("^(?:"+r.source+")",E(r));var i=""+r;return t(function(r,t){var f=a.exec(r.slice(t));if(f){var o=f[0];var s=f[n];if(s!=null){return e(t+o.length,s)}}return u(t,i)})};r.regex=O;var b=r.succeed=function(r){return t(function(t,n){return e(n,r)})};var k=r.fail=function(r){return t(function(t,n){return u(n,r)})};var A=r.letter=O(/[a-z]/i).desc("a letter");var z=r.letters=O(/[a-z]*/i);var q=r.digit=O(/[0-9]/).desc("a digit");var M=r.digits=O(/[0-9]*/);var P=r.whitespace=O(/\s+/).desc("whitespace");var j=r.optWhitespace=O(/\s*/);var B=r.any=t(function(r,t){if(t>=r.length)return u(t,"any character");return e(t+1,r.charAt(t))});var R=r.all=t(function(r,t){return e(r.length,r.slice(t))});var W=r.eof=t(function(r,t){if(t<r.length)return u(t,"EOF");return e(t,null)});var F=r.test=function(r){c(r);return t(function(t,n){var a=t.charAt(n);if(n<t.length&&r(a)){return e(n+1,a)}else{return u(n,"a character matching "+r)}})};var I=r.oneOf=function(r){return F(function(t){return r.indexOf(t)>=0})};var L=r.noneOf=function(r){return F(function(t){return r.indexOf(t)<0})};var C=r.takeWhile=function(r){c(r);return t(function(t,n){var u=n;while(u<t.length&&r(t.charAt(u)))u+=1;return e(u,t.slice(n,u))})};var D=r.lazy=function(r,n){if(arguments.length<2){n=r;r=undefined}var e=t(function(r,t){e._=n()._;return e._(r,t)});if(r)e=e.desc(r);return e};var G=function(r,t){var n=r.slice(0,t).split("\n");var e=n.length;var u=n[n.length-1].length+1;return{offset:t,line:e,column:u}};var H=r.index=t(function(r,t){return e(t,G(r,t))});n.concat=n.or;n.empty=k("empty");n.of=t.of=r.of=b;n.ap=function(r){return g(this,r,function(r,t){return r(t)})};n.chain=function(r){var n=this;return t(function(t,e){var u=n._(t,e);if(!u.status)return u;var i=r(u.value);return a(i._(t,u.index),u)})};return r});
(function(t,n){if(typeof define==="function"&&define.amd){define([],n)}else if(typeof module==="object"&&module.exports){module.exports=n()}else{t.Parsimmon=n()}})(this,function(){"use strict";function t(n){if(!(this instanceof t)){return new t(n)}this._=n}function n(n){return n instanceof t}var r=t.prototype;function e(t,n){return{status:true,index:t,value:n,furthest:-1,expected:[]}}function u(t,n){return{status:false,index:-1,value:null,furthest:t,expected:[n]}}function a(t,n){if(!n){return t}if(t.furthest>n.furthest){return t}var r=t.furthest===n.furthest?i(t.expected,n.expected):n.expected;return{status:t.status,index:t.index,value:t.value,furthest:n.furthest,expected:r}}function i(t,n){var r=t.length;var e=n.length;if(r===0){return n}else if(e===0){return t}var u={};for(var a=0;a<r;a++){u[t[a]]=true}for(var i=0;i<e;i++){u[n[i]]=true}var f=[];for(var o in u){if(u.hasOwnProperty(o)){f.push(o)}}f.sort();return f}function f(t){if(!n(t)){throw new Error("not a parser: "+t)}}function o(t){if(typeof t!=="number"){throw new Error("not a number: "+t)}}function s(t){if(!(t instanceof RegExp)){throw new Error("not a regexp: "+t)}var n=_(t);for(var r=0;r<n.length;r++){var e=n.charAt(r);if(e!="i"&&e!="m"&&e!="u"){throw new Error('unsupported regexp flag "'+e+'": '+t)}}}function c(t){if(typeof t!=="function"){throw new Error("not a function: "+t)}}function l(t){if(typeof t!=="string"){throw new Error("not a string: "+t)}}function h(t){if(t.length===1){return t[0]}return"one of "+t.join(", ")}function v(t,n){var r=n.index;var e=r.offset;if(e===t.length){return", got the end of the input"}var u=e>0?"'...":"'";var a=t.length-e>12?"...'":"'";return" at line "+r.line+" column "+r.column+", got "+u+t.slice(e,e+12)+a}function p(t,n){return"expected "+h(n.expected)+v(t,n)}r.parse=function(t){if(typeof t!=="string"){throw new Error(".parse must be called with a string as its argument")}var n=this.skip(z)._(t,0);return n.status?{status:true,value:n.value}:{status:false,index:R(t,n.furthest),expected:n.expected}};r.tryParse=function(t){var n=this.parse(t);if(n.status){return n.value}else{var r=p(t,n);var e=new Error(r);e.type="ParsimmonError";e.result=n;throw e}};function d(){var n=[].slice.call(arguments);var r=n.length;for(var u=0;u<r;u+=1){f(n[u])}return t(function(t,u){var i;var f=new Array(r);for(var o=0;o<r;o+=1){i=a(n[o]._(t,u),i);if(!i.status){return i}f[o]=i.value;u=i.index}return a(e(u,f),i)})}function g(){var t=[].slice.call(arguments);if(t.length===0){throw new Error("seqMap needs at least one argument")}var n=t.pop();c(n);return d.apply(null,t).map(function(t){return n.apply(null,t)})}function m(n){return t(n(e,u))}function y(){var n=[].slice.call(arguments);var r=n.length;if(r===0){return b("zero alternates")}for(var e=0;e<r;e+=1){f(n[e])}return t(function(t,r){var e;for(var u=0;u<n.length;u+=1){e=a(n[u]._(t,r),e);if(e.status)return e}return e})}function x(t,n){return w(t,n).or(O([]))}function w(t,n){f(t);f(n);var r=n.then(t).many();return t.chain(function(t){return r.map(function(n){return[t].concat(n)})})}r.or=function(t){return y(this,t)};r.then=function(t){if(typeof t==="function"){throw new Error("chaining features of .then are no longer supported, use .chain instead")}f(t);return d(this,t).map(function(t){return t[1]})};r.many=function(){var n=this;return t(function(t,r){var u=[];var i=undefined;for(;;){i=a(n._(t,r),i);if(i.status){r=i.index;u.push(i.value)}else{return a(e(r,u),i)}}})};r.times=function(n,r){var u=this;if(arguments.length<2){r=n}o(n);o(r);return t(function(t,i){var f=[];var o=undefined;var s=undefined;for(var c=0;c<n;c+=1){o=u._(t,i);s=a(o,s);if(o.status){i=o.index;f.push(o.value)}else{return s}}for(;c<r;c+=1){o=u._(t,i);s=a(o,s);if(o.status){i=o.index;f.push(o.value)}else{break}}return a(e(i,f),s)})};r.result=function(t){return this.map(function(){return t})};r.atMost=function(t){return this.times(0,t)};r.atLeast=function(t){return g(this.times(t),this.many(),function(t,n){return t.concat(n)})};r.map=function(n){c(n);var r=this;return t(function(t,u){var i=r._(t,u);if(!i.status){return i}return a(e(i.index,n(i.value)),i)})};r["fantasy-land/map"]=r.map;r.skip=function(t){return d(this,t).map(function(t){return t[0]})};r.mark=function(){return g(W,this,W,function(t,n,r){return{start:t,value:n,end:r}})};r.desc=function(n){var r=this;return t(function(t,e){var u=r._(t,e);if(!u.status){u.expected=[n]}return u})};r.fallback=function(t){return this.or(O(t))};function E(n){l(n);var r="'"+n+"'";return t(function(t,a){var i=a+n.length;var f=t.slice(a,i);if(f===n){return e(i,f)}else{return u(a,r)}})}function _(t){var n=""+t;return n.slice(n.lastIndexOf("/")+1)}function k(n,r){s(n);if(arguments.length>=2){o(r)}else{r=0}var a=RegExp("^(?:"+n.source+")",_(n));var i=""+n;return t(function(t,n){var f=a.exec(t.slice(n));if(f){var o=f[0];var s=f[r];if(s!=null){return e(n+o.length,s)}}return u(n,i)})}function O(n){return t(function(t,r){return e(r,n)})}function b(n){return t(function(t,r){return u(r,n)})}var P=t(function(t,n){if(n>=t.length){return u(n,"any character")}return e(n+1,t.charAt(n))});var A=t(function(t,n){return e(t.length,t.slice(n))});var z=t(function(t,n){if(n<t.length){return u(n,"EOF")}return e(n,null)});function q(n){c(n);return t(function(t,r){var a=t.charAt(r);if(r<t.length&&n(a)){return e(r+1,a)}else{return u(r,"a character matching "+n)}})}function M(t){return q(function(n){return t.indexOf(n)>=0})}function j(t){return q(function(n){return t.indexOf(n)<0})}function B(n){c(n);return t(function(t,r){var u=r;while(u<t.length&&n(t.charAt(u))){u++}return e(u,t.slice(r,u))})}function F(n,r){if(arguments.length<2){r=n;n=undefined}var e=t(function(t,n){e._=r()._;return e._(t,n)});if(n){return e.desc(n)}else{return e}}function R(t,n){var r=t.slice(0,n).split("\n");var e=r.length;var u=r[r.length-1].length+1;return{offset:n,line:e,column:u}}var W=t(function(t,n){return e(n,R(t,n))});function I(){return b("fantasy-land/empty")}r.concat=r.or;r["fantasy-land/concat"]=r.concat;r.empty=I;r["fantasy-land/empty"]=r.empty;r.of=O;r["fantasy-land/of"]=r.of;r.ap=function(t){return g(t,this,function(t,n){return t(n)})};r["fantasy-land/ap"]=r.ap;r.chain=function(n){var r=this;return t(function(t,e){var u=r._(t,e);if(!u.status){return u}var i=n(u.value);return a(i._(t,u.index),u)})};r["fantasy-land/chain"]=r.chain;var L=k(/[0-9]/).desc("a digit");var S=k(/[0-9]*/).desc("optional digits");var C=k(/[a-z]/i).desc("a letter");var D=k(/[a-z]*/i).desc("optional letters");var G=k(/\s*/).desc("optional whitespace");var H=k(/\s+/).desc("whitespace");t.all=A;t.alt=y;t.any=P;t.custom=m;t.digit=L;t.digits=S;t.eof=z;t.fail=b;t.formatError=p;t.index=W;t.isParser=n;t.lazy=F;t.letter=C;t.letters=D;t.makeFailure=u;t.makeSuccess=e;t.noneOf=j;t.oneOf=M;t.optWhitespace=G;t.Parser=t;t.regex=k;t.regexp=k;t.sepBy=x;t.sepBy1=w;t.seq=d;t.seqMap=g;t.string=E;t.succeed=O;t.takeWhile=B;t.test=q;t.whitespace=H;t.empty=I;t["fantasy-land/empty"]=I;t.of=O;t["fantasy-land/of"]=O;return t});

@@ -0,16 +1,29 @@

## version 1.0.0 (2016-11-02)
* **BREAKING:** `parser.empty` is now a function (`parser.empty()`).
* **BREAKING:** `f.ap(x)` is now `x.ap(f)`.
* Adds `parser.tryParse(str)` which either returns the parsed value or throws an exception.
* Adds support for `fantasy-land/*` prefixed versions of methods.
* `Parsimmon.empty()` is a copy of `parser.empty()`.
* Adds `.desc` descriptions for `digits`, `letters`, `optWhitespace`.
* Adds `Parsimmon.isParser`.
* Adds `parser.fallback(value)`.
* Parsimmon now only has one namespace. `Parsimmon.Parser` is equal to `Parsimmon` itself for backwards compatibility purposes.
* Exposes `Parsimmon.makeSuccess` and `Parsimmon.makeFailure`.
* Documentation for `Parsimmon.formatError`, `Parsimmon.parse`, `Parsimmon.Parser`, `Parsimmon.makeSuccess`, `Parsimmon.makeFailure`, `Parsimmon.isParser`, `parser.fallback`.
## version 0.9.2 (2016-08-07)
* Adds `browser` field to `package.json` so npmcdn serves the correct file.
* Adds `browser` field to `package.json` so unpkg serves the correct file.
* Documentation overhaul in `README.md`.
* Examples overhaul.
## version 0.9.1 (2016-07-08)
* **BREAKING:** `P.seqMap` now throws when passed zero arguments, or when the final argument is not a function.
* `P.regex` is now an alias for `P.regexp`.
* `P.seqMap` now throws when passed zero arguments, or when the final argument is not a function.
## version 0.9.0 (2016-07-07)
* `P.regex` throws on regexps with flags other than `imu` now.
* **BREAKING:** `P.regex` throws on regexps with flags other than `imu` now.

@@ -59,4 +72,4 @@ ## version 0.8.1 (2016-06-30)

* breaking: deprecated use of `.then(function(result) { ... })`. Use `chain` instead.
* breaking: errors are no longer thrown on invalid parses. Instead, `.parse(str)` returns
* **BREAKING:** deprecated use of `.then(function(result) { ... })`. Use `chain` instead.
* **BREAKING:** errors are no longer thrown on invalid parses. Instead, `.parse(str)` returns
an object with a `status` tag, indicating whether the parse was successful.

@@ -76,3 +89,3 @@

* started updating the changelog again :x
* breaking from 0.2.x: `seq` and `alt` now take varargs instead of a single list argument.
* **BREAKING:** `seq` and `alt` now take varargs instead of a single list argument.

@@ -79,0 +92,0 @@ ## version 0.1.0 (2014-01-09)

{
"name": "parsimmon",
"version": "0.9.2",
"version": "1.0.0",
"description": "A monadic LL(infinity) parser combinator library",

@@ -23,16 +23,22 @@ "keywords": [

"chai": "^3.5.0",
"eslint": "^3.6.0",
"mkdirp": "^0.5.1",
"mocha": "^2.5.3",
"ncp": "^2.0.0",
"rimraf": "^2.5.2",
"rimraf": "^2.5.4",
"uglify-js": "2.x"
},
"license": "MIT",
"dependencies": {},
"scripts": {
"clean": "rimraf build/*.js",
"prebuild": "rimraf build && mkdirp build",
"build": "npm run build:browser && npm run build:browser.min",
"build:browser": "ncp src/parsimmon.js build/parsimmon.browser.js",
"build:browser.min": "uglifyjs --mangle < src/parsimmon.js > build/parsimmon.browser.min.js",
"prepublish": "npm run test && npm run clean && npm run build:browser && npm run build:browser.min",
"test": "mocha --ui tdd --reporter dot test/intro.js test/*.test.js"
"prepublish": "npm run test && npm run build",
"lint": "eslint .",
"lint:fix": "eslint --fix .",
"pretest": "npm run lint",
"test": "mocha --ui tdd --reporter dot test/intro.js test/*.test.js",
"watch:test": "mocha --ui tdd --reporter min --watch test/intro.js test/*.test.js"
}
}

@@ -1,4 +0,4 @@

<a href="http://travis-ci.org/jneen/parsimmon"><img alt="Build Status" src="https://api.travis-ci.org/jneen/parsimmon.svg"></a>
<a href="https://travis-ci.org/jneen/parsimmon"><img alt="Build Status" src="https://api.travis-ci.org/jneen/parsimmon.svg"></a>
<a href="http://github.com/jneen/parsimmon"><img align="right" src="http://i.imgur.com/wyKOf.png" alt="Parsimmon"></a>
<a href="https://github.com/jneen/parsimmon"><img align="right" src="https://i.imgur.com/wyKOf.png" alt="Parsimmon"></a>

@@ -13,3 +13,3 @@ # Parsimmon

Parsimmon supports IE7 and newer browsers, along with [Node.js][]. It can be used as a standard Node module through [npm][] (named `parsimmon`), or directly in the browser through a script tag, where it exports a global variable called `Parsimmon`. To download the latest browser build, use the [npmcdn version][]. For more information on how to use npmcdn, see the [npmcdn homepage][].
Parsimmon supports IE7 and newer browsers, along with [Node.js][]. It can be used as a standard Node module through [npm][] (named `parsimmon`), or directly in the browser through a script tag, where it exports a global variable called `Parsimmon`. To download the latest browser build, use the [unpkg version][]. For more information on how to use unpkg, see the [unpkg homepage][].

@@ -48,4 +48,10 @@ ## API Documentation

<a href="https://github.com/fantasyland/fantasy-land"><img align="right" alt="Fantasy Land" src="https://github.com/fantasyland/fantasy-land/raw/master/logo.png"></a>
## Questions
Feel free to ask a question by filing a GitHub Issue. I'm happy to help point you in the right direction with the library, and hopefully improve the documentation so less people get confused in the future.
## Contributing
Contributions are *not* just pull requests. Issues clearly describing bugs or confusing parts of Parsimmon are welcome! Also, documentation enhancements and examples are very desirable. Feeling overwhelmed about contributing? Open an issue about what you want to contribute and I'm happy to help you through to completion!
## Performance

@@ -55,2 +61,4 @@

<a href="https://github.com/fantasyland/fantasy-land"><img align="right" alt="Fantasy Land" src="https://github.com/fantasyland/fantasy-land/raw/master/logo.png"></a>
## Fantasyland

@@ -68,4 +76,4 @@

[npmcdn homepage]: https://npmcdn.com/#/
[npmcdn version]: https://npmcdn.com/parsimmon
[unpkg homepage]: https://unpkg.com/#/
[unpkg version]: https://unpkg.com/parsimmon
[npm]: https://www.npmjs.com/

@@ -72,0 +80,0 @@ [node.js]: https://nodejs.org/en/

@@ -0,1 +1,3 @@

/* global module, define */
// This unsightly UMD-module header is here to make this code work without

@@ -18,6 +20,4 @@ // modification with CommonJS, AMD, and browser globals.

}(this, function() {
"use strict";
'use strict';
var Parsimmon = {};
// The Parser object is a wrapper for a parser function.

@@ -29,10 +29,14 @@ // Externally, you use one to parse a string by calling

// parser combinator methods.
function Parser(action) {
if (!(this instanceof Parser)) return new Parser(action);
function Parsimmon(action) {
if (!(this instanceof Parsimmon)) {
return new Parsimmon(action);
}
this._ = action;
};
}
Parsimmon.Parser = Parser;
function isParser(obj) {
return obj instanceof Parsimmon;
}
var _ = Parser.prototype;
var _ = Parsimmon.prototype;

@@ -60,9 +64,11 @@ function makeSuccess(index, value) {

function mergeReplies(result, last) {
if (!last) return result;
if (result.furthest > last.furthest) return result;
if (!last) {
return result;
}
if (result.furthest > last.furthest) {
return result;
}
var expected = (result.furthest === last.furthest)
? unsafeUnion(result.expected, last.expected)
: last.expected;
return {

@@ -74,3 +80,3 @@ status: result.status,

expected: expected
}
};
}

@@ -97,4 +103,4 @@

}
for (var i = 0; i < yn; i++) {
obj[ys[i]] = true;
for (var j = 0; j < yn; j++) {
obj[ys[j]] = true;
}

@@ -113,3 +119,3 @@ var keys = [];

function assertParser(p) {
if (!(p instanceof Parser)) {
if (!isParser(p)) {
throw new Error('not a parser: ' + p);

@@ -154,30 +160,31 @@ }

function formatExpected(expected) {
if (expected.length === 1) return expected[0];
return 'one of ' + expected.join(', ')
if (expected.length === 1) {
return expected[0];
}
return 'one of ' + expected.join(', ');
}
function formatGot(stream, error) {
function formatGot(input, error) {
var index = error.index;
var i = index.offset;
if (i === stream.length) return ', got the end of the stream'
var prefix = (i > 0 ? "'..." : "'");
var suffix = (stream.length - i > 12 ? "...'" : "'");
if (i === input.length) {
return ', got the end of the input';
}
var prefix = (i > 0 ? '\'...' : '\'');
var suffix = (input.length - i > 12 ? '...\'' : '\'');
return ' at line ' + index.line + ' column ' + index.column
+ ', got ' + prefix + stream.slice(i, i+12) + suffix
+ ', got ' + prefix + input.slice(i, i + 12) + suffix;
}
var formatError = Parsimmon.formatError = function(stream, error) {
return 'expected ' + formatExpected(error.expected) + formatGot(stream, error)
};
function formatError(input, error) {
return 'expected ' +
formatExpected(error.expected) +
formatGot(input, error);
}
_.parse = function(stream) {
if (typeof stream !== 'string') {
_.parse = function(input) {
if (typeof input !== 'string') {
throw new Error('.parse must be called with a string as its argument');
}
var result = this.skip(eof)._(stream, 0);
var result = this.skip(eof)._(input, 0);

@@ -189,3 +196,3 @@ return result.status ? {

status: false,
index: makeLineColumnIndex(stream, result.furthest),
index: makeLineColumnIndex(input, result.furthest),
expected: result.expected

@@ -195,28 +202,38 @@ };

// [Parser a] -> Parser [a]
var seq = Parsimmon.seq = function() {
_.tryParse = function(str) {
var result = this.parse(str);
if (result.status) {
return result.value;
} else {
var msg = formatError(str, result);
var err = new Error(msg);
err.type = 'ParsimmonError';
err.result = result;
throw err;
}
};
// [Parsimmon a] -> Parsimmon [a]
function seq() {
var parsers = [].slice.call(arguments);
var numParsers = parsers.length;
for (var j = 0; j < numParsers; j += 1) {
assertParser(parsers[j]);
}
return Parser(function(stream, i) {
return Parsimmon(function(input, i) {
var result;
var accum = new Array(numParsers);
for (var j = 0; j < numParsers; j += 1) {
result = mergeReplies(parsers[j]._(stream, i), result);
if (!result.status) return result;
accum[j] = result.value
result = mergeReplies(parsers[j]._(input, i), result);
if (!result.status) {
return result;
}
accum[j] = result.value;
i = result.index;
}
return mergeReplies(makeSuccess(i, accum), result);
});
};
}
var seqMap = Parsimmon.seqMap = function() {
function seqMap() {
var args = [].slice.call(arguments);

@@ -231,3 +248,3 @@ if (args.length === 0) {

});
};
}

@@ -237,19 +254,19 @@ /**

*/
var custom = Parsimmon.custom = function(parsingFunction) {
return Parser(parsingFunction(makeSuccess, makeFailure));
};
function custom(parsingFunction) {
return Parsimmon(parsingFunction(makeSuccess, makeFailure));
}
var alt = Parsimmon.alt = function() {
function alt() {
var parsers = [].slice.call(arguments);
var numParsers = parsers.length;
if (numParsers === 0) return fail('zero alternates')
if (numParsers === 0) {
return fail('zero alternates');
}
for (var j = 0; j < numParsers; j += 1) {
assertParser(parsers[j]);
}
return Parser(function(stream, i) {
return Parsimmon(function(input, i) {
var result;
for (var j = 0; j < parsers.length; j += 1) {
result = mergeReplies(parsers[j]._(stream, i), result);
result = mergeReplies(parsers[j]._(input, i), result);
if (result.status) return result;

@@ -259,21 +276,19 @@ }

});
};
}
var sepBy = Parsimmon.sepBy = function(parser, separator) {
function sepBy(parser, separator) {
// Argument asserted by sepBy1
return sepBy1(parser, separator).or(Parsimmon.of([]));
};
return sepBy1(parser, separator).or(succeed([]));
}
var sepBy1 = Parsimmon.sepBy1 = function(parser, separator) {
function sepBy1(parser, separator) {
assertParser(parser);
assertParser(separator);
var pairs = separator.then(parser).many();
return parser.chain(function(r) {
return pairs.map(function(rs) {
return [r].concat(rs);
})
})
};
});
});
}

@@ -289,3 +304,2 @@ // -*- primitive combinators -*- //

}
assertParser(next);

@@ -312,15 +326,12 @@ return seq(this, next).map(function(results) { return results[1]; });

return Parser(function(stream, i) {
return Parsimmon(function(input, i) {
var accum = [];
var result;
var prevResult;
var result = undefined;
for (;;) {
result = mergeReplies(self._(stream, i), result);
result = mergeReplies(self._(input, i), result);
if (result.status) {
i = result.index;
accum.push(result.value);
}
else {
} else {
return mergeReplies(makeSuccess(i, accum), result);

@@ -353,16 +364,14 @@ }

_.times = function(min, max) {
if (arguments.length < 2) max = min;
var self = this;
if (arguments.length < 2) {
max = min;
}
assertNumber(min);
assertNumber(max);
return Parser(function(stream, i) {
return Parsimmon(function(input, i) {
var accum = [];
var start = i;
var result;
var prevResult;
var result = undefined;
var prevResult = undefined;
for (var times = 0; times < min; times += 1) {
result = self._(stream, i);
result = self._(input, i);
prevResult = mergeReplies(result, prevResult);

@@ -372,8 +381,8 @@ if (result.status) {

accum.push(result.value);
} else {
return prevResult;
}
else return prevResult;
}
for (; times < max; times += 1) {
result = self._(stream, i);
result = self._(input, i);
prevResult = mergeReplies(result, prevResult);

@@ -383,6 +392,6 @@ if (result.status) {

accum.push(result.value);
} else {
break;
}
else break;
}
return mergeReplies(makeSuccess(i, accum), prevResult);

@@ -393,6 +402,13 @@ });

// -*- higher-level combinators -*- //
_.result = function(res) { return this.map(function(_) { return res; }); };
_.atMost = function(n) { return this.times(0, n); };
_.result = function(res) {
return this.map(function() {
return res;
});
};
_.atMost = function(n) {
return this.times(0, n);
};
_.atLeast = function(n) {
var self = this;
return seqMap(this.times(n), this.many(), function(init, rest) {

@@ -404,12 +420,13 @@ return init.concat(rest);

_.map = function(fn) {
assertFunction(fn);
var self = this;
return Parser(function(stream, i) {
var result = self._(stream, i);
if (!result.status) return result;
return Parsimmon(function(input, i) {
var result = self._(input, i);
if (!result.status) {
return result;
}
return mergeReplies(makeSuccess(result.index, fn(result.value)), result);
});
};
_['fantasy-land/map'] = _.map;

@@ -422,3 +439,7 @@ _.skip = function(next) {

return seqMap(index, this, index, function(start, value, end) {
return { start: start, value: value, end: end };
return {
start: start,
value: value,
end: end
};
});

@@ -429,5 +450,7 @@ };

var self = this;
return Parser(function(stream, i) {
var reply = self._(stream, i);
if (!reply.status) reply.expected = [expected];
return Parsimmon(function(input, i) {
var reply = self._(input, i);
if (!reply.status) {
reply.expected = [expected];
}
return reply;

@@ -437,27 +460,27 @@ });

_.fallback = function(result) {
return this.or(succeed(result));
};
// -*- primitive parsers -*- //
var string = Parsimmon.string = function(str) {
var len = str.length;
var expected = "'"+str+"'";
function string(str) {
assertString(str);
return Parser(function(stream, i) {
var head = stream.slice(i, i+len);
var expected = '\'' + str + '\'';
return Parsimmon(function(input, i) {
var j = i + str.length;
var head = input.slice(i, j);
if (head === str) {
return makeSuccess(i+len, head);
}
else {
return makeSuccess(j, head);
} else {
return makeFailure(i, expected);
}
});
};
}
var flags = function(re) {
function flags(re) {
var s = '' + re;
return s.slice(s.lastIndexOf('/') + 1);
};
}
var regexp = Parsimmon.regexp = function(re, group) {
function regexp(re, group) {
assertRegexp(re);

@@ -469,9 +492,6 @@ if (arguments.length >= 2) {

}
var anchored = RegExp('^(?:' + re.source + ')', flags(re));
var expected = '' + re;
return Parser(function(stream, i) {
var match = anchored.exec(stream.slice(i));
return Parsimmon(function(input, i) {
var match = anchored.exec(input.slice(i));
if (match) {

@@ -484,74 +504,73 @@ var fullMatch = match[0];

}
return makeFailure(i, expected);
});
};
Parsimmon.regex = regexp;
}
var succeed = Parsimmon.succeed = function(value) {
return Parser(function(stream, i) {
function succeed(value) {
return Parsimmon(function(input, i) {
return makeSuccess(i, value);
});
};
}
var fail = Parsimmon.fail = function(expected) {
return Parser(function(stream, i) { return makeFailure(i, expected); });
};
function fail(expected) {
return Parsimmon(function(input, i) {
return makeFailure(i, expected);
});
}
var letter = Parsimmon.letter = regexp(/[a-z]/i).desc('a letter')
var letters = Parsimmon.letters = regexp(/[a-z]*/i)
var digit = Parsimmon.digit = regexp(/[0-9]/).desc('a digit');
var digits = Parsimmon.digits = regexp(/[0-9]*/)
var whitespace = Parsimmon.whitespace = regexp(/\s+/).desc('whitespace');
var optWhitespace = Parsimmon.optWhitespace = regexp(/\s*/);
var any = Parsimmon.any = Parser(function(stream, i) {
if (i >= stream.length) return makeFailure(i, 'any character');
return makeSuccess(i+1, stream.charAt(i));
var any = Parsimmon(function(input, i) {
if (i >= input.length) {
return makeFailure(i, 'any character');
}
return makeSuccess(i+1, input.charAt(i));
});
var all = Parsimmon.all = Parser(function(stream, i) {
return makeSuccess(stream.length, stream.slice(i));
var all = Parsimmon(function(input, i) {
return makeSuccess(input.length, input.slice(i));
});
var eof = Parsimmon.eof = Parser(function(stream, i) {
if (i < stream.length) return makeFailure(i, 'EOF');
var eof = Parsimmon(function(input, i) {
if (i < input.length) {
return makeFailure(i, 'EOF');
}
return makeSuccess(i, null);
});
var test = Parsimmon.test = function(predicate) {
function test(predicate) {
assertFunction(predicate);
return Parser(function(stream, i) {
var char = stream.charAt(i);
if (i < stream.length && predicate(char)) {
return makeSuccess(i+1, char);
return Parsimmon(function(input, i) {
var char = input.charAt(i);
if (i < input.length && predicate(char)) {
return makeSuccess(i + 1, char);
} else {
return makeFailure(i, 'a character matching ' + predicate);
}
else {
return makeFailure(i, 'a character matching '+predicate);
}
});
};
}
var oneOf = Parsimmon.oneOf = function(str) {
return test(function(ch) { return str.indexOf(ch) >= 0; });
};
function oneOf(str) {
return test(function(ch) {
return str.indexOf(ch) >= 0;
});
}
var noneOf = Parsimmon.noneOf = function(str) {
return test(function(ch) { return str.indexOf(ch) < 0; });
};
function noneOf(str) {
return test(function(ch) {
return str.indexOf(ch) < 0;
});
}
var takeWhile = Parsimmon.takeWhile = function(predicate) {
function takeWhile(predicate) {
assertFunction(predicate);
return Parser(function(stream, i) {
return Parsimmon(function(input, i) {
var j = i;
while (j < stream.length && predicate(stream.charAt(j))) j += 1;
return makeSuccess(j, stream.slice(i, j));
while (j < input.length && predicate(input.charAt(j))) {
j++;
}
return makeSuccess(j, input.slice(i, j));
});
};
}
var lazy = Parsimmon.lazy = function(desc, f) {
function lazy(desc, f) {
if (arguments.length < 2) {

@@ -562,14 +581,16 @@ f = desc;

var parser = Parser(function(stream, i) {
var parser = Parsimmon(function(input, i) {
parser._ = f()._;
return parser._(stream, i);
return parser._(input, i);
});
if (desc) parser = parser.desc(desc)
if (desc) {
return parser.desc(desc);
} else {
return parser;
}
}
return parser;
};
var makeLineColumnIndex = function(stream, i) {
var lines = stream.slice(0, i).split("\n");
function makeLineColumnIndex(input, i) {
var lines = input.slice(0, i).split('\n');
// Note that unlike the character offset, the line and column offsets are

@@ -579,3 +600,2 @@ // 1-based.

var columnWeAreUpTo = lines[lines.length - 1].length + 1;
return {

@@ -586,35 +606,94 @@ offset: i,

};
};
}
var index
= Parsimmon.index
= Parser(function(stream, i) {
return makeSuccess(i, makeLineColumnIndex(stream, i));
});
var index = Parsimmon(function(input, i) {
return makeSuccess(i, makeLineColumnIndex(input, i));
});
//- fantasyland compat
function empty() {
return fail('fantasy-land/empty');
}
//- Monoid (Alternative, really)
// Fantasy Land Semigroup support
_.concat = _.or;
_.empty = fail('empty')
_['fantasy-land/concat'] = _.concat;
//- Applicative
_.of = Parser.of = Parsimmon.of = succeed
// Fantasy Land Semigroup and Monoid support
_.empty = empty;
_['fantasy-land/empty'] = _.empty;
// Fantasy Land Applicative support
_.of = succeed;
_['fantasy-land/of'] = _.of;
// Fantasy Land Applicative support
_.ap = function(other) {
return seqMap(this, other, function(f, x) { return f(x); })
return seqMap(other, this, function(f, x) {
return f(x);
});
};
_['fantasy-land/ap'] = _.ap;
//- Monad
// Fantasy Land Monad support
_.chain = function(f) {
var self = this;
return Parser(function(stream, i) {
var result = self._(stream, i);
if (!result.status) return result;
return Parsimmon(function(input, i) {
var result = self._(input, i);
if (!result.status) {
return result;
}
var nextParser = f(result.value);
return mergeReplies(nextParser._(stream, result.index), result);
return mergeReplies(nextParser._(input, result.index), result);
});
};
_['fantasy-land/chain'] = _.chain;
var digit = regexp(/[0-9]/).desc('a digit');
var digits = regexp(/[0-9]*/).desc('optional digits');
var letter = regexp(/[a-z]/i).desc('a letter');
var letters = regexp(/[a-z]*/i).desc('optional letters');
var optWhitespace = regexp(/\s*/).desc('optional whitespace');
var whitespace = regexp(/\s+/).desc('whitespace');
Parsimmon.all = all;
Parsimmon.alt = alt;
Parsimmon.any = any;
Parsimmon.custom = custom;
Parsimmon.digit = digit;
Parsimmon.digits = digits;
Parsimmon.eof = eof;
Parsimmon.fail = fail;
Parsimmon.formatError = formatError;
Parsimmon.index = index;
Parsimmon.isParser = isParser;
Parsimmon.lazy = lazy;
Parsimmon.letter = letter;
Parsimmon.letters = letters;
Parsimmon.makeFailure = makeFailure;
Parsimmon.makeSuccess = makeSuccess;
Parsimmon.noneOf = noneOf;
Parsimmon.oneOf = oneOf;
Parsimmon.optWhitespace = optWhitespace;
Parsimmon.Parser = Parsimmon;
Parsimmon.regex = regexp;
Parsimmon.regexp = regexp;
Parsimmon.sepBy = sepBy;
Parsimmon.sepBy1 = sepBy1;
Parsimmon.seq = seq;
Parsimmon.seqMap = seqMap;
Parsimmon.string = string;
Parsimmon.succeed = succeed;
Parsimmon.takeWhile = takeWhile;
Parsimmon.test = test;
Parsimmon.whitespace = whitespace;
// Fantasy Land Semigroup support
Parsimmon.empty = empty;
Parsimmon['fantasy-land/empty'] = empty;
// Fantasy Land Applicative support
Parsimmon.of = succeed;
Parsimmon['fantasy-land/of'] = succeed;
return Parsimmon;
}));

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc