@drewsonne/maya-calculator-parser
Version:
Typescript package to parse plaintext calculations and create operators
200 lines • 8.78 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 collection_1 = __importDefault(require("../tokens/collection"));
var space_token_1 = __importDefault(require("../tokens/layer-0/space-token"));
var calendar_round_token_1 = __importDefault(require("../tokens/layer-1/calendar-round-token"));
var long_count_token_1 = __importDefault(require("../tokens/layer-1/long-count-token"));
var layer_1_test_1 = require("./layer-1-test");
var base_parser_1 = __importDefault(require("./base-parser"));
var layer_2_test_1 = require("./layer-2-test");
var Layer1ParserStateValue;
(function (Layer1ParserStateValue) {
Layer1ParserStateValue[Layer1ParserStateValue["WAITING"] = 0] = "WAITING";
Layer1ParserStateValue[Layer1ParserStateValue["PARSING_DATE"] = 1] = "PARSING_DATE";
Layer1ParserStateValue[Layer1ParserStateValue["PARSING_CALENDAR_ROUND"] = 2] = "PARSING_CALENDAR_ROUND";
Layer1ParserStateValue[Layer1ParserStateValue["PARSING_LONG_COUNT"] = 3] = "PARSING_LONG_COUNT";
Layer1ParserStateValue[Layer1ParserStateValue["PARSING_COMMENT"] = 4] = "PARSING_COMMENT";
})(Layer1ParserStateValue || (Layer1ParserStateValue = {}));
var Layer1ParserState = (function () {
function Layer1ParserState() {
this.state = Layer1ParserStateValue.WAITING;
}
Layer1ParserState.prototype.reset = function () {
this.state = Layer1ParserStateValue.WAITING;
};
Layer1ParserState.prototype.isWaiting = function () {
return this.state === Layer1ParserStateValue.WAITING;
};
Layer1ParserState.prototype.isParsingDate = function () {
return this.state === Layer1ParserStateValue.PARSING_DATE;
};
Layer1ParserState.prototype.isParsingCalendarRound = function () {
return this.state === Layer1ParserStateValue.PARSING_CALENDAR_ROUND;
};
Layer1ParserState.prototype.isParsingLongCount = function () {
return this.state === Layer1ParserStateValue.PARSING_LONG_COUNT;
};
Layer1ParserState.prototype.isParsingComment = function () {
return this.state === Layer1ParserStateValue.PARSING_COMMENT;
};
Layer1ParserState.prototype.startParsingDate = function () {
this.state = Layer1ParserStateValue.PARSING_DATE;
};
Layer1ParserState.prototype.startParsingCalendarRound = function () {
this.state = Layer1ParserStateValue.PARSING_CALENDAR_ROUND;
};
Layer1ParserState.prototype.startParsingLongCount = function () {
this.state = Layer1ParserStateValue.PARSING_LONG_COUNT;
};
Layer1ParserState.prototype.startParsingComment = function () {
this.state = Layer1ParserStateValue.PARSING_COMMENT;
};
return Layer1ParserState;
}());
var Layer1Parser = (function (_super) {
__extends(Layer1Parser, _super);
function Layer1Parser() {
var _this = _super.call(this) || this;
_this.state = new Layer1ParserState();
return _this;
}
Layer1Parser.prototype.parse = function (rawTokens) {
var tokens = [];
var cache = [];
for (var cursor = 0; cursor < rawTokens.length; cursor += 1) {
var token = rawTokens.index(cursor);
if (this.state.isWaiting()) {
if (layer_1_test_1.isNumberToken(token) ||
layer_1_test_1.isWildcardToken(token)) {
cache.push(token);
this.state.startParsingDate();
}
else if (layer_1_test_1.isCommentToken(token) ||
layer_2_test_1.isOperatorToken(token)) {
tokens.push(token);
}
else if ((token instanceof space_token_1.default)) {
continue;
}
else if (layer_1_test_1.isCommentToken(token) ||
layer_1_test_1.isLineEndToken(token)) {
tokens.push(token);
}
else {
throw new Error('Layer-1 parser in unexpected state');
}
}
else if (this.state.isParsingDate()) {
if (layer_2_test_1.isSpaceToken(token) ||
layer_1_test_1.isWildcardToken(token) ||
layer_1_test_1.isNumberToken(token)) {
cache.push(token);
}
else if (layer_1_test_1.isWordToken(token)) {
cache.push(token);
this.state.startParsingCalendarRound();
}
else if (layer_1_test_1.isPeriodToken(token)) {
cache.push(token);
this.state.startParsingLongCount();
}
else if (layer_1_test_1.isLineEndToken(token)) {
debugger;
}
else {
throw new Error('Layer-1 parser in unexpected state');
}
}
else if (this.state.isParsingCalendarRound()) {
if (layer_1_test_1.isFullCR(cache)) {
tokens.push(calendar_round_token_1.default.parse(cache));
cache = [];
this.state.reset();
cursor -= 1;
}
else if (layer_1_test_1.isPartialCR(cache)) {
cache.push(token);
}
else {
throw new Error('Layer-1 parser in unexpected state');
}
}
else if (this.state.isParsingLongCount()) {
if (layer_2_test_1.isSpaceToken(token)) {
continue;
}
else if (layer_1_test_1.isPartialLC(cache, token)) {
if (layer_1_test_1.isNumberToken(token) ||
layer_1_test_1.isPeriodToken(token) ||
layer_1_test_1.isWildcardToken(token)) {
cache.push(token);
}
else if (layer_1_test_1.isLineEndToken(token) ||
layer_2_test_1.isOperatorToken(token) ||
layer_1_test_1.isCommentToken(token)) {
tokens.push(long_count_token_1.default.parse(cache));
tokens.push(token);
cache = [];
this.state.reset();
}
else if (layer_2_test_1.isSpaceToken(token)) {
continue;
}
else {
throw new Error('Layer-1 parser in unexpected state');
}
}
else {
tokens.push(long_count_token_1.default.parse(cache));
cache = [];
cursor -= 1;
this.state.reset();
}
}
else if (this.state.isParsingComment()) {
throw new Error('Layer-1 parser in unexpected state');
}
else {
throw new Error('Layer-1 parser in unexpected state');
}
}
if (cache.length > 0) {
if (this.state.isParsingCalendarRound()) {
if (layer_1_test_1.isFullCR(cache)) {
tokens.push(calendar_round_token_1.default.parse(cache));
cache = [];
}
else {
throw new Error('Layer-1 parser in unexpected state');
}
}
else if (this.state.isParsingLongCount()) {
tokens.push(long_count_token_1.default.parse(cache));
cache = [];
}
else {
throw new Error('Layer-1 parser in unexpected state');
}
}
return new collection_1.default(this.appendLineEnd(tokens));
};
return Layer1Parser;
}(base_parser_1.default));
exports.default = Layer1Parser;
//# sourceMappingURL=layer-1-parser.js.map