Voici un évaluateur d'expression simple :
function evalExpression(text)
{
var tokens = text.split(" ");
var output = [];
var operators = [];
var reNumber = /^\d+(\.\d+)?$/;
var reOperator = /^[\/\+\*\-]$/;
var precedence = { "+": 1, "-": 1, "*": 2, "/": 2 };
for (var i = 0; i < tokens.length; ++i)
{
var t = tokens[i];
if (reNumber.test(t))
output.push(Number(t));
else if (reOperator.test(t))
{
while (operators.length && precedence[t] <= precedence[operators[operators.length - 1]])
{
output.push(operators.pop());
}
operators.push(t);
}
else if (t == "(")
operators.push(t);
else if (t == ")")
{
while (operators.length && operators[operators.length - 1] != "(")
output.push(operators.pop());
if (!operators.length) return false;
operators.pop();
}
else
return false;
}
while (operators.length)
output.push(operators.pop());
var result = [];
for (i = 0; i < output.length; ++i)
{
t = output[i];
if (reNumber.test(t))
result.push(t);
else if (t == "(" || result.length < 2)
return false;
else
{
var lhs = result.pop();
var rhs = result.pop();
if (t == "+") result.push(lhs + rhs);
if (t == "-") result.push(lhs - rhs);
if (t == "*") result.push(lhs * rhs);
if (t == "/") result.push(lhs / rhs);
}
}
return result.pop();
}
Il prend en charge les numéros et + - * / ( )
. Les jetons doivent être séparés par un seul espace, par ex : "1 * ( 2 + 3 )"
Quoi qu'il en soit, c'est le type de code dont vous auriez besoin si vous ne vouliez pas utiliser eval
.