C++ “我该怎么做?”;编撰;c++;在运行时?

C++ “我该怎么做?”;编撰;c++;在运行时?,c++,compilation,runtime,expression,C++,Compilation,Runtime,Expression,可能重复: 我想把用户的表达式作为字符串输入,并将其编译成可调用的C++函数。有没有什么工具可以让你轻松做到这一点 基本上,似乎与我想做的类似,除了我需要用C++来做这件事,而不是用C。p> 我当然可以使用lex和yacc生成一种通用的求值器,但我不想每次都解析字符串。基本上,这个表达式将在一个关键的内部循环中运行,所以我正在寻找一种在运行时“编译”它的方法 您可以编写迷你解释器。命令与C++相同(不是全部)。当然,编译器会对其进行优化,但不确定优化程度。我用qbasic(mov,add,su

可能重复:

<>我想把用户的表达式作为字符串输入,并将其编译成可调用的C++函数。有没有什么工具可以让你轻松做到这一点

基本上,似乎与我想做的类似,除了我需要用C++来做这件事,而不是用C。p>


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

您可以编写迷你解释器。命令与C++相同(不是全部)。当然,编译器会对其进行优化,但不确定优化程度。我用qbasic(mov,add,sub…)为汇编做了这件事,但速度相当慢,因为我是解释器的解释器:D


你有没有想过进化计算和适应度函数?值得一看。

您可以创建一个表示已解析表达式树的数据结构,与每次解析字符串相比,在运行时计算该结构的开销较小


实际上,在C++中调用一个可调用的方法会非常困难,因为你必须生成目标代码并动态加载到程序中。这将重复整个编译器工具链的许多功能。

您必须将表达式解析为抽象语法树,并对其进行遍历或原地求值。应该能满足你对简单数学表达式的需求。

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

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


    编辑:另一个解决方案是检查一个解析器,如boost::spirit::qi,它使用得很好,可以提供非常有用的结果。

    这似乎是Hmmm的副本,是的,它是副本。但这个问题也没有一个好的答案……我会调查libclang和llvm。你应该意识到C++使这个任务变得非常容易,而C++中的劳动密集型。您可以使用重量级的解决方案,比如使用实际的编译器,无论是外部的还是嵌入式的(例如,LLVM可以在嵌入式JIT编译器中使用),或者您可以实现自己的字节码编译器和计算器(或者使用其他人的;Lua是作为嵌入式字节码编译器/计算器实现的。当然,它只处理Lua语言).也许这就是你要找的-尼克这似乎是一个连贯但困难的解决方案。让我看看结果如何。