数学表达式求值程序的简单库或实现

我有一个只包含一行的文本文件,该行只包含一个数学表达式,例如12+(3.0 *(4)-1)/ sqrt(121)

我的程序需要将此express表示为字符串,然后给出结果
13

是否有任何简单的方法或第三方dll / lib来实现这一目标?

评论增加:

评估一串简单的数学表达式

这里是解决方案,但许多解决方案只包含+ – / *,我需要尽可能多的运营商,如天花板方形平方根和功率()

所以这个链接可能是最好的解决方案
http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspx

使用ExprTk库可以轻松获得以下简单解决方案:

#include  #include  #include "exprtk.hpp" int main() { typedef exprtk::expression expression_t; typedef exprtk::parser parser_t; std::string expression_string = "12 + (3.0 * (4) - 1) / sqrt(121)"; expression_t expression; parser_t parser; if (parser.compile(expression_string,expression)) { double result = expression.value(); printf("Result: %19.15\n",result); } else printf("Error in expression\n."); return 0; } 

对于C等人来说,这是一个需要Perl的快速且非常不安全的作弊:

 double eval(const char* expr) { char buf[1024]; snprintf(buf, sizeof(buf), "perl -e 'print (%s)'", expr); FILE* p = popen(buf, "r"); double d; fscanf(p, "%lf", &d); fclose(p); return d; } 

UNIX编程环境中 ,我认为是,开发了一个名为hoc (IIRC)的简单计算器。 可能它的源代码几乎可以在任何地方使用。

干杯&hth。,

我考虑嵌入lua 。 它快速,轻便且安全。它专为嵌入而设计。 被许多游戏用作他们的脚本语言。 (IMO比python或perl更容易嵌入)

这是一个完整的例子,展示它是多么微不足道

 extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" } #include  #include  int main() { std::string expression = "12+(3.0*(4)-1)/math.sqrt(121)"; lua_State * L = lua_open(); luaopen_math(L); if( luaL_dostring(L, ("return "+expression).c_str()) != 0 ) { std::cout<<"ERROR : "< 

如果你想要勇敢的源代码,你可以随时查看bc 。 它可以为您处理Lex / Yacc的所有优点。 如果你想要一个纯粹的C ++解决方案,你可以尝试使用Boost Spirit进行编码。

对于c ++,请尝试使用muParser:

muParser – 一个快速的数学解析器库

.NET解决方案:

这里有几个关于SO的主题:

  • c#评估字符串“3 *(4 + 2)”产生int 18
  • 是否可以在运行时将用户输入的数学方程式转换为C#代码?
  • .NET中是否有字符串数学计算器?
  • 评估数学表达式的最佳和最短的方法
  • C#数学计算器(已关闭)

还有两个我已经使用过的项目:

C#: NCalc – .NET的数学表达式计算器

NCalc是.NET中的数学表达式计算器。 NCalc可以解析任何表达式并评估结果,包括静态或动态参数和自定义函数。


VB.NET: 快速轻量级表达式评估器

Flee是.NET框架的表达式解析器和评估器。 它允许您在运行时计算字符串表达式的值,例如sqrt(a ^ 2 + b ^ 2)。 它使用自定义编译器,强类型表达式语言和轻量级codegen将表达式直接编译为IL。 这意味着表达式评估非常快速和有效。 试试演示 ,它可以让你根据表情生成图像,并亲自看看。

您可以将它与C#一起使用,因为它无论如何都是.NET(通过程序集引用)。