UNPKG

@drewsonne/maya-calculator-parser

Version:

Typescript package to parse plaintext calculations and create operators

212 lines 9.74 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var layer_0_test_1 = __importDefault(require("./layer-0-test")); var number_token_1 = __importDefault(require("../tokens/layer-0/number-token")); var period_token_1 = __importDefault(require("../tokens/layer-0/period-token")); var line_end_token_1 = __importDefault(require("../tokens/layer-0/line-end-token")); var space_token_1 = __importDefault(require("../tokens/layer-0/space-token")); var word_token_1 = __importDefault(require("../tokens/layer-0/word-token")); var wildcard_token_1 = __importDefault(require("../tokens/layer-0/wildcard-token")); var collection_1 = __importDefault(require("../tokens/collection")); var operator_token_1 = __importDefault(require("../tokens/layer-0/operator-token")); var comment_token_1 = __importDefault(require("../tokens/layer-0/comment-token")); var base_parser_1 = __importDefault(require("./base-parser")); var Layer0ParserStateValue; (function (Layer0ParserStateValue) { Layer0ParserStateValue[Layer0ParserStateValue["WAITING"] = 0] = "WAITING"; Layer0ParserStateValue[Layer0ParserStateValue["PARSING_NUMBER"] = 1] = "PARSING_NUMBER"; Layer0ParserStateValue[Layer0ParserStateValue["PARSING_WORD"] = 2] = "PARSING_WORD"; Layer0ParserStateValue[Layer0ParserStateValue["PARSING_COMMENT_BODY"] = 3] = "PARSING_COMMENT_BODY"; })(Layer0ParserStateValue || (Layer0ParserStateValue = {})); var Layer0ParserState = (function () { function Layer0ParserState() { this.state = Layer0ParserStateValue.WAITING; } Layer0ParserState.prototype.reset = function () { this.state = Layer0ParserStateValue.WAITING; }; Layer0ParserState.prototype.isWaiting = function () { return this.state === Layer0ParserStateValue.WAITING; }; Layer0ParserState.prototype.isParsingNumber = function () { return this.state === Layer0ParserStateValue.PARSING_NUMBER; }; Layer0ParserState.prototype.isParsingWord = function () { return this.state === Layer0ParserStateValue.PARSING_WORD; }; Layer0ParserState.prototype.isParsingCommentBody = function () { return this.state === Layer0ParserStateValue.PARSING_COMMENT_BODY; }; Layer0ParserState.prototype.startParsingNumber = function () { this.state = Layer0ParserStateValue.PARSING_NUMBER; }; Layer0ParserState.prototype.startParsingWord = function () { this.state = Layer0ParserStateValue.PARSING_WORD; }; Layer0ParserState.prototype.startParsingComment = function () { this.state = Layer0ParserStateValue.PARSING_COMMENT_BODY; }; return Layer0ParserState; }()); var Layer0Parser = (function (_super) { __extends(Layer0Parser, _super); function Layer0Parser() { var _this = _super.call(this) || this; _this.state = new Layer0ParserState(); return _this; } Layer0Parser.prototype.parseRaw = function (rawText) { var tokens = []; var cache = []; for (var cursor = 0; cursor < rawText.length; cursor += 1) { var cell = rawText[cursor]; if (this.state.isWaiting()) { if (layer_0_test_1.default.isLetter(cell)) { this.state.startParsingWord(); cache.push(cell); } else if (layer_0_test_1.default.isNumber(cell)) { this.state.startParsingNumber(); cache.push(cell); } else if (layer_0_test_1.default.isPeriod(cell)) { tokens.push(period_token_1.default.parse(cell)); } else if (layer_0_test_1.default.isSpace(cell)) { tokens.push(space_token_1.default.parse(cell)); } else if (layer_0_test_1.default.isWildcard(cell)) { tokens.push(wildcard_token_1.default.parse(cell)); } else if (layer_0_test_1.default.isOperator(cell)) { tokens.push(operator_token_1.default.parse(cell)); this.state.reset(); } else if (layer_0_test_1.default.isCarriageReturn(cell)) { tokens.push(line_end_token_1.default.parse(cell)); } else if (layer_0_test_1.default.isCommentStart(cell)) { this.state.startParsingComment(); } else { throw new Error('Primitive parser in unexpected state'); } } else if (this.state.isParsingNumber()) { if (layer_0_test_1.default.isLetter(cell)) { tokens.push(number_token_1.default.parse(cache.join(''))); cache = [cell]; this.state.startParsingWord(); } else if (layer_0_test_1.default.isNumber(cell)) { cache.push(cell); } else if (layer_0_test_1.default.isPeriod(cell)) { tokens.push(number_token_1.default.parse(cache.join(''))); tokens.push(period_token_1.default.parse(cell)); cache = []; this.state.reset(); } else if (layer_0_test_1.default.isCarriageReturn(cell)) { tokens.push(number_token_1.default.parse(cache.join(''))); tokens.push(line_end_token_1.default.parse(cell)); cache = []; this.state.reset(); } else if (layer_0_test_1.default.isSpace(cell)) { tokens.push(number_token_1.default.parse(cache.join(''))); tokens.push(space_token_1.default.parse(cell)); cache = []; this.state.reset(); } else { throw new Error('Layer-0 parser in unexpected state'); } } else if (this.state.isParsingWord()) { if (layer_0_test_1.default.isLetter(cell)) { cache.push(cell); } else if (layer_0_test_1.default.isNumber(cell)) { throw new Error('Layer-0 parser in unexpected state'); } else if (layer_0_test_1.default.isPeriod(cell)) { throw new Error('Layer-0 parser in unexpected state'); } else if (layer_0_test_1.default.isSpace(cell)) { tokens.push(word_token_1.default.parse(cache.join(''))); tokens.push(space_token_1.default.parse(cell)); cache = []; this.state.reset(); } else if (layer_0_test_1.default.isCarriageReturn(cell)) { tokens.push(word_token_1.default.parse(cache.join(''))); tokens.push(line_end_token_1.default.parse(cell)); cache = []; this.state.reset(); } else { throw new Error('Layer-0 parser in unexpected state'); } } else if (this.state.isParsingCommentBody()) { if ((cache.length === 0) && layer_0_test_1.default.isSpace(cell)) { continue; } if (layer_0_test_1.default.isCarriageReturn(cell)) { tokens.push(comment_token_1.default.parse(cache.join(''))); tokens.push(line_end_token_1.default.parse(cell)); cache = []; this.state.reset(); } else { cache.push(cell); } } else { throw new Error('Layer-0 parser in unexpected state'); } } if (cache.length > 0) { if (this.state.isParsingNumber()) { tokens.push(number_token_1.default.parse(cache.join(''))); cache = []; } else if (this.state.isParsingWord()) { tokens.push(word_token_1.default.parse(cache.join(''))); cache = []; } else if (this.state.isParsingCommentBody()) { tokens.push(comment_token_1.default.parse(cache.join(''))); cache = []; } else { throw new Error('Layer-0 parser in unexpected state'); } } this.state.reset(); return new collection_1.default(this.appendLineEnd(tokens)); }; Layer0Parser.prototype.parse = function (rawTokens) { throw new Error('Can only parse raw text in layer-0 parser'); }; return Layer0Parser; }(base_parser_1.default)); exports.default = Layer0Parser; //# sourceMappingURL=layer-0-parser.js.map