【发布时间】:2015-10-27 03:39:09
【问题描述】:
我目前正在编写一个位于 C++ 解释器之上的程序。用户在运行时输入 C++ 命令,然后将其传递给解释器。对于某些模式,我想将给出的命令替换为修改后的形式,以便提供额外的功能。
我想替换任何形式的东西
A->Draw(B1, B2)
与
MyFunc(A, B1, B2).
我的第一个想法是正则表达式,但这很容易出错,因为 A、B1 或 B2 中的任何一个都可能是任意 C++ 表达式。由于这些表达式本身可能包含带引号的字符串或括号,因此很难用正则表达式匹配所有情况。此外,这个表达式可能有多种嵌套形式
我的下一个想法是将 clang 作为子进程调用,使用“-dump-ast”获取抽象语法树,对其进行修改,然后将其重建为要传递给 C++ 解释器的命令。但是,这需要跟踪任何环境更改,例如包含文件和前向声明,以便为 clang 提供足够的信息来解析表达式。由于解释器不公开这些信息,这似乎也不可行。
第三个想法是使用 C++ 解释器自己的内部解析来转换为抽象语法树,然后从那里构建。然而,这个解释器并没有以我能找到的任何方式暴露 ast。
是否有任何关于如何继续前进的建议,无论是沿着规定的路线之一,还是完全沿着不同的路线?
【问题讨论】:
-
只是为了确保您没有在这里做 x-y 问题,您能告诉我们您通过替换想要完成什么吗?
-
C++ 解释器也有一些可供用户使用的功能。我想为这些函数添加额外的行为,但它们没有任何机制可以在其中添加钩子。一旦我将一个字符串传递给解释器,我就无法直接重新获得控制权。因此,我想在传入之前修改字符串,以便在适当的时候将控制权交还给我。
-
两个问题:这些命令会单独一行吗?是否可以在同一行中看到对
Draw的重复调用? (A->Draw(...)->...->Draw(...))? -
一行中可能有多个命令,例如
A->Draw(B); C->Draw(D)或func(A->Draw(B), C->Draw(D))。不会重复调用您显示的模式,因为Draw返回一个整数值。 -
A->Draw(B1, B2)的求值过程中会发生宏扩展吗?
标签: c++ clang root-framework