我目前正在编写一个位于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.
是否有任何关于如何继续进行的建议,无论是沿着其中一条规定的路线,还是完全沿着不同的路线?
我很好奇是否可以创建两个类,每个类都包含std::vector另一个类.我的第一个猜测是,这是不可能的,因为std::vector需要一个完整的类型,而不仅仅是一个前向声明.
#include <vector>
class B;
class A { std::vector<B> b; };
class B { std::vector<A> a; };
Run Code Online (Sandbox Code Playgroud)
我认为声明std::vector<B>会立即导致失败,因为B此时类型不完整.但是,这在gcc和clang下成功编译,没有任何警告.为什么这不会导致错误?
我试图编写一个使用boost :: serialize的函数,如果一个对象可以被序列化,如果该对象不能用boost :: serialize编写,则使用回退.是否有一些基于模板的方法来测试给定的类是否可以序列化?
// ideally, something of this form
is_boost_serializeable<T>::value
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用SFINAE来检查单个方法的存在,但是如何提供序列化的许多不同选项,我担心我会错过一些边缘情况.事实上,我还没有在boost文档中找到任何描述已经存在的这样一个函数的东西.
我将经常使用它IPython.embed()来检查运行代码的状态。在早期版本的IPython中,它可以正确确定终端(xterm)的颜色功能,并使用彩色文本。在最新版本的IPython(7.2.0)中,使用时仅显示黑白文本IPython.embed()。
根据文档,我应该可以通过设置在默认配置文件中覆盖此默认值c.InteractiveShell.colors = 'Linux'。但是,此设置仅适用于IPython的独立实例,不适用于嵌入式会话。
我可以使用%colors Linuxmagic方法对每个实例进行更正。但是,这应该自动进行,而无需在每次嵌入后进行其他配置。
如果我通过ipython3直接运行来启动IPython的独立实例,那么将正确设置终端颜色。但是,这不是我最常用的工作流程的选项。
这是使用运行在Linux Mint 19(基于Ubuntu 18.04)上的python 3.5.2测试的。在PyPI上发生的第一个ipython版本是7.0.0版本。可用的先前版本6.5.0正确使用带有终端颜色IPython.embed()。目前,我已经恢复到6.5.0的最新工作版本,但是我想保持最新版本。