我正在寻找一种算法或方法来评估以字符串形式表示的数学表达式。该表达式包含数学组件,但也包含自定义函数。我希望在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是一个自定义函数,它计算具有10个回顾窗口的向量/时间序列A的简单移动平均值。
理想情况下,我希望能够提供更复杂的功能,例如:
"value = Ratio(A,B) * Pi + 0.5 * Spread(C,D) + Sma(E, lookback)",其中解析引擎将尊重运算符优先级,并构建解析树以获取必要的值来评估表达式。
我无法想象如何能够使用Roslyn解决这类问题。
还有哪些方法可以让我开始,或者我是否错过了Roslyn提供的可能有助于解决此问题的功能?
我知道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是一个自定义函数,它计算具有10个回顾窗口的向量/时间序列A的简单移动平均值。
理想情况下,我希望能够提供更复杂的功能,例如:
"value = Ratio(A,B) * Pi + 0.5 * Spread(C,D) + Sma(E, lookback)",其中解析引擎将尊重运算符优先级,并构建解析树以获取必要的值来评估表达式。
我无法想象如何能够使用Roslyn解决这类问题。
还有哪些方法可以让我开始,或者我是否错过了Roslyn提供的可能有助于解决此问题的功能?
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
已经被定义过了! - degant