可能重复:
编译和运行 c++ 代码运行时
我想将用户的表达式作为字符串作为输入,并将其编译为可调用的 c++ 函数。是否有任何工具可以让您轻松做到这一点?
基本上,如何将表达式树编译成可调用的方法,C#?似乎与我想做的类似,只是我需要在 c++ 中而不是 c# 中执行此操作。
我当然可以使用 lex 和 yacc 制作一种通用评估器,但我不想每次都解析字符串。基本上这个表达式将在一个关键的内部循环中运行,所以我正在寻找一种在运行时“编译”它的方法。
可能重复:
编译和运行 c++ 代码运行时
我想将用户的表达式作为字符串作为输入,并将其编译为可调用的 c++ 函数。是否有任何工具可以让您轻松做到这一点?
基本上,如何将表达式树编译成可调用的方法,C#?似乎与我想做的类似,只是我需要在 c++ 中而不是 c# 中执行此操作。
我当然可以使用 lex 和 yacc 制作一种通用评估器,但我不想每次都解析字符串。基本上这个表达式将在一个关键的内部循环中运行,所以我正在寻找一种在运行时“编译”它的方法。
你可以写你的迷你解释器。使用与 c++ 相同的命令(不是全部)。当然你的编译器会优化它,但不确定多少。我在 qbasic (mov, add, sub...) 中进行了组装,但由于是解释器的解释器,所以速度很慢:D
您是否考虑过进化计算和适应度函数?值得一看。
您必须将表达式解析为抽象语法树并就地遍历或评估它。这样的东西应该可以满足您对简单数学表达式的需求。
这并不容易......如果你想要我的两分钱,我将按照以下步骤操作:
但是,正如其他人所说,这不是一项微不足道的任务。
编辑:另一个解决方案是检查像 boost::spirit::qi 这样的解析器,使用得当可以给出非常有用的结果。
您可以创建一个数据结构来表示您解析的表达式树,并且与每次解析字符串相比,在运行时评估它的开销会很小。
实际上,在 C++ 中获得一个可调用的方法将非常困难,因为您必须生成目标代码并将其动态加载到您的程序中。这将复制整个编译器工具链所做的很多事情。