我问这个问题,因为我还没有找到任何与C#相关的帖子,并且可能有一些内置方法无法找到。如果有,请告诉我,我可以结束这个问题。

基本上我有一个常见的情况:


用户键入一个带有w.r.t.一两个变量放入TextBlock
我把这个字符串分析一下
作为回报,我希望有一个方法委托,该方法将接受一个或两个输入(变量),并根据用户键入的内容返回函数值。


现在,我可能会想到(而且我想自己动手做,我想自己做),是一种逐步分析字符串的算法,以找出实际情况,首先要计算什么,以及要计算什么道路。例如。首先扫描括号,在一组括号内查找表达式,然后根据更通用的函数等进行计算。

但是最后,我想“创建”此分析方法,以使其容易地用作具有两个参数的正常委托,这些参数将返回正确的函数值。
C#中已经包含用于此目的的任何方法,还是我必须自己去编写所有程序?

备注:我不想使用任何其他人的库,我只接受.NET库。

编辑:马特指出表达式树后,我发现了this线程,这是解决我的问题的一个很好的例子。

Edit2:指出的示例仅包含简单函数,如果要包含更复杂的函数(例如三角函数或指数函数),则将无用。

最佳答案

您所描述的是一个解析器。尽管通常来说,对于复杂的语法,有许多不同的实现方式,通常使用“解析器生成器”。

解析器生成器将对语法进行描述,并将其转换为将符合语法的文本解析为某种形式的内部表示形式的代码,该形式的内部表示形式可以由程序进行操作,例如解析树。

由于您指示要避免使用第三方库,因此我假设将解析器生成器的使用类似地排除在外,这使您可以实现自己的解析器(幸运的是,这是一个非常有趣的练习)。

Recursive descent parsers上的Wikipedia页面将特别有用。我建议您通读它,并可能使其中的示例代码适合您的特定用例。我已经以此为起点针对不同的语法做了很多次,因此可以证明它的用处。

这样的解析器的输出将是“解析树”。然后,您将如何将其转换为可执行委托有很多可能性。一种选择是在解析树节点上实现Evaluate()方法,该方法将使用一组变量并返回评估用户表达式的结果。正如其他人提到的那样,您的解析树可以利用.NET的Expression树,或者您可以直接采用发出IL的路线(允许您根据用户的表达式生成编译的.NET程序集,以供以后按需使用)。

关于c# - 在运行时从字符串创建数学函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13069594/

10-11 23:19
查看更多