2

可能重复:
编译和运行 c++ 代码运行时

我想将用户的表达式作为字符串作为输入,并将其编译为可调用的 c++ 函数。是否有任何工具可以让您轻松做到这一点?

基本上,如何将表达式树编译成可调用的方法,C#?似乎与我想做的类似,只是我需要在 c++ 中而不是 c# 中执行此操作。

我当然可以使用 lex 和 yacc 制作一种通用评估器,但我不想每次都解析字符串。基本上这个表达式将在一个关键的内部循环中运行,所以我正在寻找一种在运行时“编译”它的方法。

4

4 回答 4

1

你可以写你的迷你解释器。使用与 c++ 相同的命令(不是全部)。当然你的编译器会优化它,但不确定多少。我在 qbasic (mov, add, sub...) 中进行了组装,但由于是解释器的解释器,所以速度很慢:D

您是否考虑过进化计算和适应度函数?值得一看。

于 2012-08-30T19:26:31.133 回答
1

您必须将表达式解析为抽象语法树并就地遍历或评估它。这样的东西应该可以满足您对简单数学表达式的需求。

于 2012-08-30T19:32:21.780 回答
1

这并不容易......如果你想要我的两分钱,我将按照以下步骤操作:

  1. 为必须在运行时创建的代码创建接口。首先,你为你能做的事情创建一个界面。例如,您的类必须从代表您的接口的纯虚拟基类继承。注意你的程序不会使用任意代码,而是以特定方式创建的代码,因为它必须知道如何使用它。
  2. 从程序内部调用编译器。编译器应该从您的源代码创建一个库。您可以使用存储在某处的预定义项目,然后将其源文件替换为您自己的。所以很容易获得一个合适的库。
  3. 将您的库放在可以找到它的指定源中。
  4. 在运行时加载库。如果您搜索,您会发现可以在运行时加载动态库,而不仅仅是在链接时(例如,您可以通过这种方式为程序创建插件)。所以你的程序可以加载你的库并使用它。例如,您可以在此处找到一些信息。

但是,正如其他人所说,这不是一项微不足道的任务。

编辑:另一个解决方案是检查像 boost::spirit::qi 这样的解析器,使用得当可以给出非常有用的结果。

于 2012-08-30T19:53:34.457 回答
0

您可以创建一个数据结构来表示您解析的表达式树,并且与每次解析字符串相比,在运行时评估它的开销会很小。

实际上,在 C++ 中获得一个可调用的方法将非常困难,因为您必须生成目标代码并将其动态加载到您的程序中。这将复制整个编译器工具链所做的很多事情。

于 2012-08-30T19:30:20.050 回答