1

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

基本上我有常见的情况:

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

现在,我可能会想到(我想自己做,因为我想用我的大脑)一个算法,逐步分析字符串以实际找出,首先要计算什么以及在什么方式。例如,首先扫描括号,在一组括号中查找表达式并根据更一般的函数等计算。

但最后我想“创建”这种分析的方法,以便轻松用作普通委托,并带有几个参数,这些参数将返回正确的函数值。C# 中是否已经包含任何方法,或者我必须自己去编程所有东西?

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

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

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

4

4 回答 4

2

您可能想查看表达式树

于 2012-10-25T13:25:49.430 回答
2

查看NCalc了解如何执行此操作的一些示例。你不需要使用图书馆,但阅读源代码是很有教育意义的。

于 2012-10-25T13:31:02.547 回答
2

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

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

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

递归下降解析器的维基百科页面将特别有用。我建议通读它,并可能根据您的特定用例调整其中的示例代码。以此为起点,我自己已经为不同的语法做了很多次,所以可以证明它的有用性。

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

于 2012-10-25T13:34:08.873 回答
0

我找到了一个非常有用的 pdf,解释了 C# 2.0 中的解析。这个链接提供了一个关于 C# 中使用的解析器的非常好的教程,并且稍后也将其应用于算术表达式。

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

于 2012-10-25T15:39:34.607 回答