使用python regex从C ++源中提取命名空间

时间:2009-06-15 09:15:37

标签: c++ python regex namespaces

我正在尝试提取C ++文件中定义的命名空间 基本上,如果我的C ++文件包含:

namespace n1 {
  ...
  namespace n2 { ... } // end namespace n2 
  ...
  namespace n3 { ...} //end namespace n3 
  ...
} //end namespace n1

我希望能够检索:n1,n1 :: n2,n1 :: n3。

是否有人建议我如何使用python-regex做到这一点?

感谢。

6 个答案:

答案 0 :(得分:6)

使用正则表达式搜索命名空间名称非常简单。但是,要确定嵌套级别,您必须跟踪源文件中的花括号嵌套级别。这是一个解析问题,使用正则表达式无法解决(理智)。此外,您可能必须处理文件中的任何C预处理程序指令,这些指令肯定会影响解析。

C ++是一种非常棘手的语言,可以完全解析,但你可以使用一个tokeniser和一个大括号计数器。

答案 1 :(得分:2)

需求很简单,您可能不需要复杂的解析器。你需要:

  • 提取命名空间名称
  • 计算打开/关闭大括号以跟踪命名空间的定义位置。

如果满足其他条件,这种简单的方法就有效:

  • 你没有像评论里面的字符串或字符串里面那样得到虚假的命名空间
  • 你没有在评论或字符串中获得无与伦比的开/关括号

我认为这不是你的消息来源太多。

答案 2 :(得分:1)

您无法完全忽略预处理程序指令,因为它们可能会引入其他名称空间。我见过很多代码:

#define __NAMESPACE_SYSTEM__ namespace system

__NAMESPACE_SYSTEM__ {
   // actual code here...
}

然而,除了击败正则表达式解析策略之外,我没有看到使用这些指令的任何理由......

答案 3 :(得分:1)

你可以为它写一个基本词法分析器。这并不难。

答案 4 :(得分:0)

大多数时候,当有人询问如何使用正则表达式做某事时,他们做了一些非常错误的事情。我不认为这种情况有所不同。

如果要解析c ++,则需要使用c ++解析器。有很多事情可以用来打败正则表达式,但仍然是有效的c ++。

答案 5 :(得分:0)

这就是我今天早些时候做的事情:

  • 从C ++文件中提取注释
  • 使用正则表达式提取命名空间定义
  • 使用简单的字符串搜索来获得开放式&关闭大括号位置

添加的各种健全性检查表明我成功处理了99.925%的文件(6678个文件中有5个失败)。这些问题是由于{和}数量不匹配导致字符串中的'{'或'}'变少,以及预处理器指令的不当使用。

但是,我只处理头文件,而且我拥有代码。这限制了可能导致一些问题的场景数量,我可以手动修改我没有覆盖的场景。

当然我知道有很多情况会失败,但这可能足以让我想要实现的目标。

感谢您的回答。