parser-combinator
Version:
Parser combinators
81 lines (67 loc) • 2.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _charsBundle = require('./chars-bundle');
var _charsBundle2 = _interopRequireDefault(_charsBundle);
var _flowBundle = require('./flow-bundle');
var _flowBundle2 = _interopRequireDefault(_flowBundle);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// unit -> Parser number char
/*
* Parsec
* https://github.com/d-plaindoux/parsec
*
* Copyright (c) 2016 Didier Plaindoux
* Licensed under the LGPL2 license.
*/
function numberLiteral() {
// [-+]?\d+([.]\d+)?([eE][+-]?\d+)?
var join = function join(r) {
return r.join('');
},
joinOrEmpty = function joinOrEmpty(r) {
return r.map(join).orElse('');
},
digits = digit().rep().map(join),
integer = _charsBundle2.default.charIn('+-').opt().then(digits).map(function (r) {
return r[0].orElse('') + r[1];
}),
float = integer.then(_charsBundle2.default.char('.').then(digits).opt().map(joinOrEmpty)).then(_charsBundle2.default.charIn('eE').then(integer).opt().map(joinOrEmpty)).map(function (r) {
return r[0] + r[1] + r[2];
});
return float.map(function (r) {
return parseFloat(r, 10);
});
}
// unit -> Parser char char
function digit() {
return _flowBundle2.default.satisfy(function (v) {
return '0' <= v && v <= '9';
});
}
function digits() {
return digit().rep().map(function (v) {
return v.join('');
});
}
function integer() {
// [-+]?\d+([.]\d+)?([eE][+-]?\d+)?
var join = function join(r) {
return r.join('');
},
digits = digit().rep().map(join),
integer = _charsBundle2.default.charIn('+-').opt().then(digits).map(function (r) {
return r[0].orElse('') + r[1];
});
return integer.map(function (i) {
return parseInt(i, 10);
});
}
exports.default = {
numberLiteral: numberLiteral(),
digit: digit(),
digits: digits(),
integer: integer()
};
//# sourceMappingURL=numbers-bundle.js.map