Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串在运行时创建数学函数_C#_Wpf_Math_Methods_Delegates - Fatal编程技术网

C# 从字符串在运行时创建数学函数

C# 从字符串在运行时创建数学函数,c#,wpf,math,methods,delegates,C#,Wpf,Math,Methods,Delegates,我问这个问题,因为我还没有找到任何与C相关的帖子,可能有一些我找不到的内置方法。如果有,请告诉我,我可以结束这个问题 基本上我有一个共同的情况: 用户在某个文本块中键入一个函数w.r.t.一个或两个变量 我拿这根绳子来分析它 作为返回,我希望有一个委托给一个方法,该方法将接受一个或两个变量的输入,并根据用户键入的内容返回函数值。 现在,我可能会思考,我想自己做这件事,因为我想用我的大脑一步一步地分析字符串的算法来找出,首先要计算什么,以什么方式计算。例如,首先扫描括号,在一组偏执词中查找表达式,

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

基本上我有一个共同的情况:

用户在某个文本块中键入一个函数w.r.t.一个或两个变量 我拿这根绳子来分析它 作为返回,我希望有一个委托给一个方法,该方法将接受一个或两个变量的输入,并根据用户键入的内容返回函数值。 现在,我可能会思考,我想自己做这件事,因为我想用我的大脑一步一步地分析字符串的算法来找出,首先要计算什么,以什么方式计算。例如,首先扫描括号,在一组偏执词中查找表达式,并根据更一般的函数等进行计算

但在最后,我想创建一个分析方法,作为一个普通的委托使用,它带有几个参数,这些参数将返回正确的函数值。 C语言中是否已经包含了用于此目的的任何方法,或者我必须自己编写所有程序

作为一句话:我不想使用任何其他人的库,只有.NET库是我可以接受的

编辑:在Matt指出表达式树之后,我找到了thread,这是解决我问题的一个很好的例子


Edit2:指出的示例只包含简单函数,如果我想包含更复杂的函数,如三角函数或指数函数,则该示例将不会有用。

您可能需要查看。

您可能需要查看。

查看一些如何执行此操作的示例。您不需要使用该库,但阅读源代码非常有教育意义。

查看一些示例,了解如何做到这一点。您不需要使用该库,但阅读源代码非常有教育意义。

您所描述的是解析器。虽然一般来说,对于复杂语法,通常使用解析器生成器,但实现它们的方法有很多种

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

由于您表示希望避免使用第三方库,因此我将假定解析器生成器的使用也被排除在外,这就让您可以实现自己的解析器,幸运的是,这是一个非常有趣的练习

上的维基百科页面将特别有用。我建议通读一遍,也许可以根据您的特定用例修改其中的示例代码。我已经为不同的语法做了很多次了,以此为出发点,所以我可以证明它的有用性


这种解析器的输出将是一个解析树。然后,您就有了多种可能,可以将其转换为可执行委托。一个选项是在解析树节点上实现一个Evaluate方法,该方法将获取一组变量并返回对用户表达式求值的结果。正如其他人所提到的,您的解析树可以利用.NET的表达式树,或者您可以直接发送IL,从而允许您从用户的表达式生成已编译的.NET程序集,以便以后根据需要使用。

您所描述的是一个解析器。虽然一般来说,对于复杂语法,通常使用解析器生成器,但实现它们的方法有很多种

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

由于您表示希望避免使用第三方库,因此我将假定解析器生成器的使用也被排除在外,这就让您可以实现自己的解析器,幸运的是,这是一个非常有趣的练习

上的维基百科页面将特别有用。我建议通读一遍,也许可以根据您的特定用例修改其中的示例代码。我已经为不同的语法做了很多次了,以此为出发点,所以我可以证明它的有用性

这种解析器的输出将是一个解析树。然后,您就有了多种可能,可以将其转换为可执行委托。一个选项是在解析树节点上实现一个Evaluate方法,该方法将获取一组变量并返回对用户表达式求值的结果。正如其他人所提到的,您的解析树可以利用.NET的表达式树,或者您可以直接发送IL,从而允许您从用户的表达式生成已编译的.NET程序集
表达式供以后根据需要使用。

我发现了一个非常有用的pdf文件,解释了C2.0中的解析。介绍了一个关于C语言中使用的解析器的非常好的教程,并在后面将其应用于算术表达式


由于这直接帮助和回答了我的问题,我将其作为一个答案发布,而不是作为评论或编辑。

我发现了一个非常有用的pdf,解释了C2.0中的解析。介绍了一个关于C语言中使用的解析器的非常好的教程,并在后面将其应用于算术表达式



因为这直接帮助和回答了我的问题,所以我将其作为答案发布,而不是作为注释或编辑。

这并不能真正解决在运行时解析表达式的问题。@Iridium听起来像是OP希望自己实际处理解析部分,但最终将结果转化为可执行代码。“这就是表达树的作用所在。”马特·伯兰谢谢你指出这一点。你们知道有什么好的教程吗?我知道我可以用谷歌搜索,但如果你有一些建议,我会接受它。@Matt Burland我查了一些东西,但看起来我无法通过使用表达式添加更复杂的函数,如sin或e^。这并不能真正解决在运行时解析表达式的问题。@Iridium听起来像是OP想要亲自处理解析部分,但最终将结果转换为可执行代码。“这就是表达树的作用所在。”马特·伯兰谢谢你指出这一点。你们知道有什么好的教程吗?我知道我可以用谷歌搜索它,但是如果你有一些建议,我会接受它。@Matt Burland我查了一些东西,看起来我无法通过使用表达式添加更复杂的函数,如sin或e^。这篇文章相当复杂,但我会尽力理解它,希望它能帮助我。感谢您的链接。@phil13131您可能可以忽略其中的许多复杂性,因为您说您只解析数学公式,因为表达式、术语和因子实际上是唯一需要实现的语言元素。感谢您的编辑/更新。我会把它通读一遍,试着理解它。我接受了另一个答案,因为我找到了另一个SO线程的链接,这个线程在我的问题中提到,它很好地解决了我使用表达式树时遇到的问题。如果wiki文章和解析器最终更有用,我将更新我接受的答案。@phil13131您添加的链接对您仍然没有多大用处,正如答案本身所说:……您必须解析字符串。。。这就是你想要做的,但没有给出如何做的信息。这是真的。是的,我注意到只有简单的函数可以使用表达式,因为像sin这样的东西在那个上下文中并不存在……这篇文章相当复杂,但我会尽力理解它,希望它能帮助我。感谢您的链接。@phil13131您可能可以忽略其中的许多复杂性,因为您说您只解析数学公式,因为表达式、术语和因子实际上是唯一需要实现的语言元素。感谢您的编辑/更新。我会把它通读一遍,试着理解它。我接受了另一个答案,因为我找到了另一个SO线程的链接,这个线程在我的问题中提到,它很好地解决了我使用表达式树时遇到的问题。如果wiki文章和解析器最终更有用,我将更新我接受的答案。@phil13131您添加的链接对您仍然没有多大用处,正如答案本身所说:……您必须解析字符串。。。这就是你想要做的,但没有给出如何做的信息。这是真的。是的,我注意到只有简单的函数可以使用表达式,因为类似sin的东西在那个上下文中不存在。。。