2014-12-02 29 views
0

測試MySQL的語法我允許指定在Web表單域的MySQL計算字段可能會讀像一個用戶:如何使用Math.js解析器

(bldgFuelCostElectricity * assetMotorSize) * if(bldgField1>bldgField2,bldgField1-bldgField2,0) * 24 

在運行的時候,我會替代其他表在我讓用戶保存這個表達式作爲報告模板的一部分之前,我想用Math.js測試函數的有效性,但它不喜歡IF()結構。 Math.js確實允許覆蓋函數名稱,但是我無法使它適用於IF的特定情況,因爲這是一個保留字。

當MySQL具有某些已具有JavaScript等效功能的函數時,如何使用Math.js測試MySQL函數是否有效?

回答

1

您需要小心使用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

+0

我期待着嘗試你對數學的建議。解釋表達,我沒有想到這一點。我很好奇看看它會爲表達式的「if」部分返回什麼。 – cpopolo 2014-12-03 00:16:14

+1

如果您不能等待,只需在網站http://mathjs.org上打開JavaScript控制檯,然後粘貼'node = math.parse('(bldgFuelCostElectricity * assetMotorSize)* if(bldgField1> bldgField2,bldgField1-bldgField2,0 )* 24');' – 2014-12-03 08:41:56

+0

這顯然是我可以使用的東西......謝謝。 – cpopolo 2014-12-05 22:39:56