gpt4 book ai didi

c# - 使用自定义脚本函数评估数学表达式

转载 作者:行者123 更新时间:2023-11-30 14:47:41 24 4
gpt4 key购买 nike

我正在寻找一种算法或方法来评估表示为字符串的数学表达式。该表达式包含数学组件,但也包含自定义函数。我希望在 C#/.Net 中实现上述算法。

我知道 Roslyn 允许我评估这种表达式

“变量值 = 3+5*11-Math.Sqrt(9);”

我也很熟悉如何使用“节点重写”来避免变量声明或完全限定的函数名称或省略尾随分号以进行评估

“值 = 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 提供的可能有助于解决此问题的功能?

最佳答案

假设您的所有表达式都是有效的 C# 表达式,您可以通过多种方式使用 Roslyn。

  1. 您只能将 Roslyn 用于解析。 SyntaxFactory.ParseExpression会给你表达式的语法树。请注意,您的第一个 (var v = expr;) 示例不是表达式,而是变量声明。但是 v = expr 是一个表达式,即 AssignmentExpressionSyntax。然后你可以遍历这个 AST,对每个节点做你想做的事,基本上你会写一个解释器。这种方法的好处是你不必编写自己的解析器,遍历 AST 非常简单,而且这种方法很灵活,因为定义你用“未知”方法做什么将完全取决于你。

  2. 也使用 Roslyn 进行评估。这可以通过多种方式完成:将有效的 C# 文件放在一起,并将其编译成程序集,或者您可以通过 Scripting API .这种方法基本上需要一个类库,其中包含所有额外方法的实现,例如 SmaSpread...第一种方法,所以这并不是真正的额外努力。

如果唯一的目标是评估表达式,那么我会选择第二种方法。如果有额外的要求(您没有提到),比如能够生成表达式的简化形式,那么我会考虑第一个解决方案。

  1. 如果您找到一个完全满足您需求的库(并且性能良好,并且您不介意依赖第三方工具,...),我会选择它。评论中建议的 MathParser.org-mXparser 似乎正是您要找的东西。

关于c# - 使用自定义脚本函数评估数学表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43817154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com