【发布时间】:2017-10-04 15:44:53
【问题描述】:
我正在寻找一种算法或方法来评估以字符串形式表示的数学表达式。该表达式包含数学组件,但也包含自定义函数。我希望在 C#/.Net 中实现上述算法。
我知道 Roslyn 允许我评估这种表达式
"var value = 3+5*11-Math.Sqrt(9);"
我也熟悉如何使用“节点重写”来避免变量声明或完全限定的函数名称或省略尾随分号以评估
"value = 3+5*11-Sqrt(9)"
但是,我想在此基础上实现的是提供自定义脚本功能,例如
"value = Ratio(A,B)",其中 Ratio 是一个自定义函数,它将向量 A 中的每个元素除以向量 B 中的每个元素,并返回相同长度的向量。
或
"value = Sma(A, 10)",其中 Sma 是一个自定义函数,用于计算向量/时间序列 A 的简单移动平均值,回溯窗口为 10。
理想情况下,我希望能够提供更多复杂性,例如
"value = Ratio(A,B) * Pi + 0.5 * Spread(C,D) + Sma(E, lookback)",解析引擎将尊重运算符优先级并构建解析树以获取值,以评估表达式。
我不知道如何用 Roslyn 解决这种问题。
还有哪些其他方法可以帮助我入门,或者我是否缺少 Roslyn 提供的可能有助于解决此问题的功能?
【问题讨论】:
-
看看github.com/mariuszgromada/MathParser.org-mXparser。它满足您的所有要求,除了基本的方程求解外,它还包括添加用户定义函数/常量/参数等的能力,并支持许多内置函数。就像
Function ratio = new Function("ratio(x,y) = x/y"); f.calculate(1,2); Expression e = new Expression("Ratio(A,B) * Pi + 0.5 * Spread(C,D) + Sma(E, lookback)", f);一样简单。Pi已经定义好了! -
谢谢,去看看
-
除了关于 mXparser 的提示 - 阅读 mXparser 教程:mathparser.org/mxparser-tutorial
-
谢谢,我最终选择了 Roslyn,因为它提供了我需要的一切。
标签: c# .net roslyn string-parsing mathematical-expressions