我允许用户在 Web 表单字段中指定 MySQL 计算字段,其内容可能类似于:
(bldgFuelCostElectricity * assetMotorSize) * if(bldgField1>bldgField2,bldgField1-bldgField2,0) * 24
在运行时,我将用其他表列替换驼峰式参数,但在让用户将此表达式保存为报告模板的一部分之前,我想使用 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
关于javascript - 如何使用 Math.js 解析器测试 MySQL 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27241995/