@drewsonne/maya-calculator-parser
Version:
Typescript package to parse plaintext calculations and create operators
212 lines • 9.74 kB
JavaScript
;
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