C ++从文本文件中执行代码

时间:2016-07-09 01:54:27

标签: c++ compilation interpreter

标题说明了一切。像编译器但不一样。我希望在C ++中从外部源代码执行某些代码。而且我不知道这是否可能,因为它在Javascript,Python等中。

假设我有一个标题为sample.txt的文本文件,如下所示:

int a = 10, c;
cin >> c;
cout << a + c;

我将在main()函数中调用文本文件并编译.exe文件。当我运行它时,它是否有可能表现为动态,好像文件中的代码嵌入那里并写入10 +输入?应更改源文件,并在下次运行时应用不同的结果。顺便说一下,这只是一段代码示例,我可能想要运行一些for / while循环以及条件等。

PS:我知道如何从文件中读取并将其指定为整数或将其写在屏幕上,这不是我想要的。我需要编译通过的函数。感谢。

2 个答案:

答案 0 :(得分:2)

有几种方法。

fork一个命令行编译器和fork来运行结果,通过STDIN / STDOUT传递输入和输出

(虽然我意识到你是从C ++调用程序中提出这个问题的,但为了简单起见,我用bash演示了这个想法。)

档案:run_it.sh

#!/bin/bash
set -e  # Bail on the first error

FN_IN=./sample.txt
FN_WRAPPED=./wrapped.cc
FN_EXE=./wrapped
CC=g++

# Wrap the fragment in a full C++ program and compile it.
function build_wrapper () {
  cat > $FN_WRAPPED <<'EOF'
#include <iostream>

using namespace std;

int main(int argc, char **argv) {
EOF
  cat $FN_IN >> $FN_WRAPPED 
  cat >> $FN_WRAPPED <<'EOF'
return 0;
}
EOF
  $CC -o $FN_EXE $FN_WRAPPED 
}

# Run the wrapper, passing input through STDIN and reading the output from STDOUT.
function run () {
  local IN=$1
  echo $IN | $FN_EXE
}

# Remove the wrapper (both code and compiled).
function clean_up () {
  rm -f $FN_WRAPPED $FN_EXE
}

build_wrapper

IN=24
OUT=$(echo "$IN" | $FN_EXE)
echo "Result = $OUT"

echo "Another result = $(run 16)"

clean_up

$ ./run_it.sh

Result = 34
Another result = 26

使用类似LLVM的东西来编译进程中的函数并将其命名为

这种方法非常强大,但也有所涉及。

简而言之,您想要

  1. sample.txt读入内存。
  2. 将其编译为函数。
  3. 调用该函数。
  4. 一些可能有用的链接:

答案 1 :(得分:1)

已编译的C ++程序仅包含执行已编译源代码所需的机器指令,语言标准未指定用户在运行时生成其他机器指令的任何机制。

为了提供脚本功能 - 能够响应输入文本的解析生成程序流 - 您必须提供解析器和执行引擎。

int main()
{
    std::string cmd;
    int op1, op2;
    while (cin >> cmd >> op1 >> op2) {
       if (cmd == "add")
           std::cout << op1 + op2 << "\n";
       else if (cmd == "sub")
           std::cout << op1 - op2 << "\n";
       else
           std::cerr << "error\n";
    }
}

许多解释型语言首先用C或C ++编写,因此通常可以将它们构建为一个库,然后将其合并到一个应用程序中,以便程序可以调用它们来提供嵌入式脚本语言。此类语言的常见示例包括LuaPythonJavaScript。然后,您的程序可以将要执行的代码传递给解释器。

编写自己的lua解释器可能如下所示:

#include <iostream>
#include <string>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

bool get_input(std::string& in)
{
  bool result;
  do {
    std::cout << "lua> " << std::flush;
    result = std::getline(std::cin, in);
  } while (result && in.empty());
  return result;
}

int main (void) {
  lua_State *L = lua_open();   // open lua
  luaL_openlibs(L);            // open standard libraries

  std::string in;
  while (get_input(in)) {
    if (in.empty())
        continue;

    int error = luaL_loadbuffer(L, in.c_str(), in.size(), "line") ||
                lua_pcall(L, 0, 0, 0); 
    if (error) {
      std::cerr << lua_tostring(L, -1) << '\n';
      lua_pop(L, 1);  // remove the error message from the stack
    }
  }

  lua_close(L);
}

在linux下:

$ g++ -Wall -O3 -o mylua mylua.cpp -I/usr/include/lua5.1 -llua
$ ./mylua
lua> print("hello")
hello
lua> error
[string "line"]:1: '=' expected near '<eof>'
lua>