94 lines
7.7 KiB
JavaScript
94 lines
7.7 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.evalQuotedToken = exports.evalToken = exports.Expression = void 0;
|
|
const assert_1 = require("../util/assert");
|
|
const literal_1 = require("../util/literal");
|
|
const TypeGuards = require("../util/type-guards");
|
|
const parse_string_literal_1 = require("../parser/parse-string-literal");
|
|
const underscore_1 = require("../util/underscore");
|
|
const error_1 = require("../util/error");
|
|
class Expression {
|
|
constructor(tokens) {
|
|
this.postfix = [...toPostfix(tokens)];
|
|
}
|
|
*evaluate(ctx, lenient) {
|
|
(0, assert_1.assert)(ctx, 'unable to evaluate: context not defined');
|
|
const operands = [];
|
|
for (const token of this.postfix) {
|
|
if (TypeGuards.isOperatorToken(token)) {
|
|
const r = operands.pop();
|
|
const l = operands.pop();
|
|
const result = yield evalOperatorToken(ctx.opts.operators, token, l, r, ctx);
|
|
operands.push(result);
|
|
}
|
|
else {
|
|
operands.push(yield evalToken(token, ctx, lenient && this.postfix.length === 1));
|
|
}
|
|
}
|
|
return operands[0];
|
|
}
|
|
}
|
|
exports.Expression = Expression;
|
|
function evalToken(token, ctx, lenient = false) {
|
|
if (TypeGuards.isPropertyAccessToken(token))
|
|
return evalPropertyAccessToken(token, ctx, lenient);
|
|
if (TypeGuards.isRangeToken(token))
|
|
return evalRangeToken(token, ctx);
|
|
if (TypeGuards.isLiteralToken(token))
|
|
return evalLiteralToken(token);
|
|
if (TypeGuards.isNumberToken(token))
|
|
return evalNumberToken(token);
|
|
if (TypeGuards.isWordToken(token))
|
|
return token.getText();
|
|
if (TypeGuards.isQuotedToken(token))
|
|
return evalQuotedToken(token);
|
|
}
|
|
exports.evalToken = evalToken;
|
|
function evalPropertyAccessToken(token, ctx, lenient) {
|
|
const props = token.props.map(prop => evalToken(prop, ctx, false));
|
|
try {
|
|
return ctx.get([token.propertyName, ...props]);
|
|
}
|
|
catch (e) {
|
|
if (lenient && e.name === 'InternalUndefinedVariableError')
|
|
return null;
|
|
throw (new error_1.UndefinedVariableError(e, token));
|
|
}
|
|
}
|
|
function evalNumberToken(token) {
|
|
const str = token.whole.content + '.' + (token.decimal ? token.decimal.content : '');
|
|
return Number(str);
|
|
}
|
|
function evalQuotedToken(token) {
|
|
return (0, parse_string_literal_1.parseStringLiteral)(token.getText());
|
|
}
|
|
exports.evalQuotedToken = evalQuotedToken;
|
|
function evalOperatorToken(operators, token, lhs, rhs, ctx) {
|
|
const impl = operators[token.operator];
|
|
return impl(lhs, rhs, ctx);
|
|
}
|
|
function evalLiteralToken(token) {
|
|
return literal_1.literalValues[token.literal];
|
|
}
|
|
function evalRangeToken(token, ctx) {
|
|
const low = evalToken(token.lhs, ctx);
|
|
const high = evalToken(token.rhs, ctx);
|
|
return (0, underscore_1.range)(+low, +high + 1);
|
|
}
|
|
function* toPostfix(tokens) {
|
|
const ops = [];
|
|
for (const token of tokens) {
|
|
if (TypeGuards.isOperatorToken(token)) {
|
|
while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) {
|
|
yield ops.pop();
|
|
}
|
|
ops.push(token);
|
|
}
|
|
else
|
|
yield token;
|
|
}
|
|
while (ops.length) {
|
|
yield ops.pop();
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saXF1aWRqcy9yZW5kZXIvZXhwcmVzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSwyQ0FBdUM7QUFDdkMsNkNBQStDO0FBRS9DLGtEQUFpRDtBQUlqRCx5RUFBbUU7QUFFbkUsbURBQTBDO0FBRTFDLHlDQUFzRDtBQUV0RCxNQUFhLFVBQVU7SUFHckIsWUFBb0IsTUFBK0I7UUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUNNLENBQUUsUUFBUSxDQUFFLEdBQVksRUFBRSxPQUFnQjtRQUMvQyxJQUFBLGVBQU0sRUFBQyxHQUFHLEVBQUUseUNBQXlDLENBQUMsQ0FBQTtRQUN0RCxNQUFNLFFBQVEsR0FBVSxFQUFFLENBQUE7UUFDMUIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hDLElBQUksVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDckMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFBO2dCQUN4QixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUE7Z0JBQ3hCLE1BQU0sTUFBTSxHQUFHLE1BQU0saUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7Z0JBQzVFLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7YUFDdEI7aUJBQU07Z0JBQ0wsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMs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
|