如何从用户输入修改C++代码

Eld*_*ese 19 c++ clang root-framework

我目前正在编写一个位于C++解释器之上的程序.用户在运行时输入C++命令,然后将其传递给解释器.对于某些模式,我想用修改后的表单替换给出的命令,以便我可以提供其他功能.

我想替换任何形式的东西

A->Draw(B1, B2)
Run Code Online (Sandbox Code Playgroud)

MyFunc(A, B1, B2).
Run Code Online (Sandbox Code Playgroud)

我首先想到的是正则表达式,但是这将是相当容易出错,因为任何的A,B1或者B2可以是任意的C++表达式.由于这些表达式本身可能包含带引号的字符串或括号,因此将所有情况与正则表达式匹配将非常困难.此外,此表达式可能有多种嵌套形式

我的下一个想法是将clang称为子进程,使用"-dump-ast"获取抽象语法树,修改它,然后将其重建为一个命令以传递给C++解释器.但是,这需要跟踪任何环境更改,例如包含文件和转发声明,以便为clang提供足够的信息来解析表达式.由于口译员没有公开这些信息,这似乎也是不可行的.

第三个想法是使用C++解释器自己的内部解析转换为抽象语法树,然后从那里构建.但是,这个解释器不会以任何我能够找到的方式揭示ast.

是否有任何关于如何继续进行的建议,无论是沿着其中一条规定的路线,还是完全沿着不同的路线?

小智 0

尝试修改头文件以抑制该方法,然后编译你会发现错误并且能够替换所有核心。

只要你有一个 C++ 解释器(作为 CERN 的根),我想你必须使用编译器来拦截所有 Draw,一种简单而干净的方法是在标头中将 Draw 方法声明为私有,使用一些定义

 class ItemWithDrawMehtod
 {
 ....
 public:
 #ifdef CATCHTHEMETHOD
     private:
 #endif
 void Draw(A,B);
 #ifdef CATCHTHEMETHOD
     public:
 #endif
 ....
 };
Run Code Online (Sandbox Code Playgroud)

然后编译为:

 gcc -DCATCHTHEMETHOD=1 yourfilein.cpp
Run Code Online (Sandbox Code Playgroud)