parjs
Version:
A parser-combinator library for JavaScript.
64 lines (63 loc) • 2.2 kB
JavaScript
;
/**
* @module parjs
*/
/** */
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const numeric_helpers_1 = require("./numeric-helpers");
const result_1 = require("../result");
const errors_1 = require("../../errors");
const parser_1 = require("../parser");
const defaults_1 = __importDefault(require("lodash/defaults"));
const defaultOptions = {
allowSign: true,
base: 10
};
/**
* Returns a parser that will parse a single integer, with the options
* given by `options`.
* @param pOptions A set of options for parsing integers.
*/
function int(pOptions) {
let options = defaults_1.default(pOptions, defaultOptions);
if (options.base > 36) {
throw new errors_1.ParserDefinitionError("int", "invalid base");
}
let expecting = `expecting a ${options.allowSign ? "signed" : "unsigned"} integer in base ${options.base}`;
return new class Int extends parser_1.ParjserBase {
constructor() {
super(...arguments);
this.type = "int";
this.displayName = "int";
this.expecting = expecting;
}
_apply(ps) {
let { allowSign, base } = options;
let { position, input } = ps;
let initPos = ps.position;
let sign = allowSign ? numeric_helpers_1.NumericHelpers.parseSign(ps) : 0;
let parsedSign = false;
if (sign !== 0) {
parsedSign = true;
}
else {
sign = 1;
}
position = ps.position;
numeric_helpers_1.NumericHelpers.parseDigitsInBase(ps, base);
let value = parseInt(input.substring(initPos, ps.position), base);
if (ps.position === position) {
ps.kind = parsedSign ? result_1.ResultKind.HardFail : result_1.ResultKind.SoftFail;
}
else {
ps.value = value;
ps.kind = result_1.ResultKind.Ok;
}
}
}();
}
exports.int = int;
//# sourceMappingURL=int.js.map