解析C ++文件以进行编辑

时间:2016-07-08 09:25:55

标签: c++ parsing

我的信息模型有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)可以帮助我?

2 个答案:

答案 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来实现面向方面的编程。它不仅限于此。