我允许用户在Web表单字段中指定MySQL计算字段,该字段可能显示如下内容:
(bldgFuelCostElectricity * assetMotorSize) * if(bldgField1>bldgField2,bldgField1-bldgField2,0) * 24
在运行时,我将用其他表列替换camelcase参数,但是在让用户将该表达式保存为报告模板的一部分之前,我想使用Math.js测试该函数的有效性,但不喜欢IF()构造。 Math.js确实允许覆盖函数名称,但是我不能使其与IF的特殊情况一起使用,因为这是保留字。
当MySQL具有某些已经具有JavaScript等效功能的函数时,如何使用Math.js测试MySQL函数是否有效?
最佳答案
您需要谨慎地使用math.js解析器测试MySQL语法,因为它们的语法不同。您将必须仔细定义所支持的语法并进行明确测试。
您可以使用math.js将表达式解析为表达式树并将其分析。通过遍历树,可以验证语法。例如:
var node = math.parse('3 * x + 2');
node.traverse(function (node, path, parent) {
switch (node.type) {
case 'OperatorNode': console.log(node.type, node.op); break;
case 'ConstantNode': console.log(node.type, node.value); break;
case 'SymbolNode': console.log(node.type, node.name); break;
default: console.log(node.type);
}
});
// outputs:
// OperatorNode +
// OperatorNode *
// ConstantNode 3
// SymbolNode x
// ConstantNode 2
因此,在您的情况下,您可以解析表达式,然后分析返回的树:
var node = math.parse('(bldgFuelCostElectricity * assetMotorSize) * if(bldgField1>bldgField2,bldgField1-bldgField2,0) * 24');
// node.traverse(...)
请参阅文档以获取更多信息:http://mathjs.org/docs/expressions/expression_trees.html