我的信息模型有200多个Cpp-Provider-Files,我想在其中添加一些代码行。
namespace project {
//Here i want to add a member
// other members
ANDBase::ANDBase(
{
//Constructor Impl
//In the last line of the Constructor i want to add some code
}
}
provider-Files都以相同的方式构建并具有相同的语义,因此我寻找一个只需要管理相同的行为cpp文件的解析器。 是否有软件(pref.Visual studio project include)可以帮助我?
答案 0 :(得分:1)
听起来像是Clang LibTooling的工作。
在那里,您可以解析代码,然后在AST(抽象语法树)中搜索您关心的构造,进行更改并将修改写回源文件。
答案 1 :(得分:1)
这有点像使用** after *规范进行面向方面编程。 AspectC ++作为一个研究项目存在,但我不认为它是活跃的或将与现代C ++一起使用(14)。
我们的DMS Software Reengineering Toolkit及其C++14 Front End可能会这样做。
(有些人认为解析C ++很容易。It is not.)
DMS parses C++ to ASTs,允许您应用source-to-source transformations来修改这些AST,然后可以从修改后的树中重新生成有效的C ++文本,包括保留注释。
源到源的转换是用C ++源代码级语法编写的,如下所示:
if you see *this*, replace it by *that* when *somecondition*
其中此和 是带有占位符变量的源模式,而 somecondition 会检查是否应该应用转换。
DMS可以/确实为源代码构建符号表。 somecondition 通常会检查感兴趣的符号是否具有触发规则的正确属性。
在OP的情况下,他想要一个类似的规则:
rule insert_into_constructor(q:qualified_path, ss: statement_sequence):
statement_sequence -> statement_sequence
= " \q () { \ss } " -- left hand side pattern *this*
-> " \q () { \ss \mycode\(\) } " -- right hand side pattern *that*
if is_in_namespace("foo", q); -- *when* condition
\ mycode可以是内联的C ++语法,也可以写成如下:
pattern my_code(): statement_sequence =
" <arbitrayC++code> " ;
metaquotes “用于从++代码的语法中分离规则语言的语法。您在metaquotes中看到的 \ n 是占位符变量,表示为 n 声明的语法结构。规则左侧模式中的占位符与程序中的代码匹配;右侧模式中的相同占位符(在 - &gt;之后) )替换为左侧匹配的内容.is_in_namespace元函数检查找到的构造函数是否在您要修改的命名空间中。您可能需要在此处进行不同的检查;这仅用于提示注意匹配的元变量q被传递给when条件;它不需要“\”,因为它不在metaquotes中。
因此,您可以使用DMS来实现面向方面的编程。它不仅限于此。