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)