我目前正在编写一个位于 C++ 解释器之上的程序。用户在运行时输入 C++ 命令,然后将其传递给解释器。对于某些模式,我想用修改后的形式替换给出的命令,以便我可以提供额外的功能。
我想替换任何形式的东西
A->Draw(B1, B2)
和
MyFunc(A, B1, B2).
我的第一个想法是正则表达式,但这很容易出错,因为任何A
, B1
, 或B2
可能是任意 C++ 表达式。由于这些表达式本身可能包含带引号的字符串或括号,因此很难用正则表达式匹配所有情况。此外,此表达式可能有多种嵌套形式
我的下一个想法是将 clang 作为子进程调用,使用“-dump-ast”来获取抽象语法树,对其进行修改,然后将其重建为要传递给 C++ 解释器的命令。但是,这需要跟踪任何环境更改,例如包含文件和前向声明,以便为 clang 提供足够的信息来解析表达式。由于解释器不公开此信息,因此这似乎也不可行。
第三个想法是使用 C++ 解释器自己的内部解析来转换为抽象语法树,然后从那里构建。然而,这个解释器并没有以我能找到的任何方式暴露 ast。
是否有任何关于如何进行的建议,无论是沿着规定的路线之一,还是完全沿着不同的路线?