mirror of https://github.com/ANL-CEEESA/RELOG.git
parent
40506c13eb
commit
c89747e8d4
@ -0,0 +1,50 @@
|
||||
import { Jsep } from "jsep";
|
||||
import { exportValue } from "./export";
|
||||
|
||||
export const evaluateExpr = (expr, data) => {
|
||||
const node = Jsep.parse(expr);
|
||||
return evaluateNode(node, data);
|
||||
};
|
||||
|
||||
const evaluateNode = (node, data) => {
|
||||
if (node.type == "BinaryExpression") {
|
||||
return evaluateBinaryExprNode(node, data);
|
||||
} else if (node.type == "UnaryExpression") {
|
||||
return evaluateUnaryExprNode(node, data);
|
||||
} else if (node.type == "Literal") {
|
||||
return node.value;
|
||||
} else if (node.type == "Identifier") {
|
||||
return data[node.name];
|
||||
} else {
|
||||
throw `Unknown type: ${node.type}`;
|
||||
}
|
||||
};
|
||||
|
||||
const evaluateBinaryExprNode = (node, data) => {
|
||||
const leftVal = evaluateNode(node.left, data);
|
||||
const rightVal = evaluateNode(node.right, data);
|
||||
if (node.operator == "+") {
|
||||
return leftVal + rightVal;
|
||||
} else if (node.operator == "*") {
|
||||
return leftVal * rightVal;
|
||||
} else if (node.operator == "/") {
|
||||
return leftVal / rightVal;
|
||||
} else if (node.operator == "-") {
|
||||
return leftVal - rightVal;
|
||||
} else if (node.operator == "^") {
|
||||
return Math.pow(leftVal, rightVal);
|
||||
} else {
|
||||
throw `Unknown operator: ${node.operator}`;
|
||||
}
|
||||
};
|
||||
|
||||
const evaluateUnaryExprNode = (node, data) => {
|
||||
const arg = evaluateNode(node.argument, data);
|
||||
if (node.operator == "+") {
|
||||
return arg;
|
||||
} else if (node.operator == "-") {
|
||||
return -arg;
|
||||
} else {
|
||||
throw `Unknown operator: ${node.operator}`;
|
||||
}
|
||||
};
|
@ -0,0 +1,19 @@
|
||||
import { evaluateExpr } from "./expr";
|
||||
|
||||
test("parse expression", () => {
|
||||
// Basic expressions
|
||||
expect(evaluateExpr("1 + 1")).toEqual(2);
|
||||
expect(evaluateExpr("2 * 5")).toEqual(10);
|
||||
expect(evaluateExpr("2 * (3 + 5)")).toEqual(16);
|
||||
expect(evaluateExpr("14 / 2")).toEqual(7);
|
||||
expect(evaluateExpr("10 - 3")).toEqual(7);
|
||||
expect(evaluateExpr("-10")).toEqual(-10);
|
||||
expect(evaluateExpr("+10")).toEqual(10);
|
||||
expect(evaluateExpr("2^3")).toEqual(8);
|
||||
expect(evaluateExpr("2^(3 + 1)")).toEqual(16);
|
||||
|
||||
// With data
|
||||
expect(evaluateExpr("x + 1", { x: 10 })).toEqual(11);
|
||||
expect(evaluateExpr("2 ^ (3 + x)", { x: 1 })).toEqual(16);
|
||||
expect(evaluateExpr("x + y", { x: 1, y: 2 })).toEqual(3);
|
||||
});
|
Loading…
Reference in new issue