parser-combinator
Version:
Parser combinators
77 lines (62 loc) • 2.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _genlex = require('../../genlex/genlex.js');
var _genlex2 = _interopRequireDefault(_genlex);
var _token = require('../../genlex/token');
var _token2 = _interopRequireDefault(_token);
var _index = require('../../parsec/index');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
//
// Facilities
//
var tkNumber = _token2.default.parser.number,
tkString = _token2.default.parser.string,
tkKeyword = _token2.default.parser.keyword; /*
* Parsec
* https://github.com/d-plaindoux/parsec
*
* Copyright (c) 2016 Didier Plaindoux
* Licensed under the LGPL2 license.
*/
function tkKey(s) {
return tkKeyword.match(s);
}
// unit -> Parser ? Token
function arrayOrNothing() {
var value = [],
addValue = function addValue(e) {
value = value.concat(e);
},
getValue = function getValue() {
return value;
},
item = _index.F.lazy(expr).map(addValue);
return item.then(tkKey(',').thenRight(item).optrep()).opt().map(getValue);
}
// unit -> Parser ? Token
function objectOrNothing() {
var value = {},
addValue = function addValue(e) {
value[e[0]] = e[1];
},
getValue = function getValue() {
return value;
},
attribute = tkString.thenLeft(tkKey(':')).then(_index.F.lazy(expr)).map(addValue);
return attribute.thenLeft(tkKey(',').then(attribute).optrep()).opt().map(getValue);
}
// unit -> Parser ? Token
function expr() {
return tkNumber.or(tkString).or(tkKey('null').thenReturns(null)).or(tkKey('true').thenReturns(true)).or(tkKey('false').thenReturns(false)).or(tkKey('[').thenRight(_index.F.lazy(arrayOrNothing)).thenLeft(tkKey(']'))).or(tkKey('{').thenRight(_index.F.lazy(objectOrNothing)).thenLeft(tkKey('}')));
}
//const parse =
exports.default = {
parse: function parse(source) {
var keywords = ['null', 'false', 'true', '{', '}', '[', ']', ':', ','],
tokenizer = _genlex2.default.generator(keywords).tokenBetweenSpaces(_token2.default.builder);
return tokenizer.chain(expr().thenLeft(_index.F.eos)).parse(source, 0);
}
};
//# sourceMappingURL=jsonparser.js.map