2
* @param {string} expression5
var evaluate = function (expression) {6
return helper(expression);9
const helper = (expr, map = {}) => {10
if (expr[0] !== "(") return /[0-9]|-/.test(expr[0]) ? +expr : map[expr];12
map = Object.assign({}, map);13
const start = expr[1] === "m" ? 6 : 5;14
const tokens = parse(expr.slice(start, expr.length - 1));16
if (expr.startsWith("(m"))17
return helper(tokens[0], map) * helper(tokens[1], map);18
if (expr.startsWith("(a"))19
return helper(tokens[0], map) + helper(tokens[1], map);21
for (let i = 0; i < tokens.length - 2; i += 2)22
map[tokens[i]] = helper(tokens[i + 1], map);24
return helper(tokens.at(-1), map);27
const parse = (expr) => {29
let [builder, par] = ["", 0];31
for (let ch of expr) {32
if (ch === "(") par++;33
if (ch === ")") par--;34
if (!par && ch === " ") {40
return builder ? [...tokens, builder] : tokens;