javascript - 如何使用 Math.js 解析器测试 MySQL 语法

标签 javascript php mysql

我允许用户在 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/

相关文章:

mysql - 尝试通过 spring mvc 应用程序将 varchar 主键插入 mysql 时出错

java - 如何修复 "org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.dialect.MySQL8Dialect]"?

javascript - 需要使用 Browserify 和 browserify-rails 的 sprockets 预处理文件

javascript - Node.js 和前端 js 返回不同的日期格式

javascript - 测试变量是否是基元而不是对象?

Go 语言中的 PHP file_get_contents

php - 在页面上显示 html 内容时出错

php - 如何让 Aptana 在 .php 文件中显示 Laravel 语句颜色(支持 Laravel)?

php - 在一个关键项上使用多个表内连接。不知道出了什么问题

javascript - 仅使用 Moment JS 将 Microsoft JSON 日期转换为本地日期时间