我正在尝试提取C ++文件中定义的命名空间 基本上,如果我的C ++文件包含:
namespace n1 { ... namespace n2 { ... } // end namespace n2 ... namespace n3 { ...} //end namespace n3 ... } //end namespace n1
我希望能够检索:n1,n1 :: n2,n1 :: n3。
是否有人建议我如何使用python-regex做到这一点?
感谢。
答案 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)
这就是我今天早些时候做的事情:
添加的各种健全性检查表明我成功处理了99.925%的文件(6678个文件中有5个失败)。这些问题是由于{和}数量不匹配导致字符串中的'{'或'}'变少,以及预处理器指令的不当使用。
但是,我只处理头文件,而且我拥有代码。这限制了可能导致一些问题的场景数量,我可以手动修改我没有覆盖的场景。
当然我知道有很多情况会失败,但这可能足以让我想要实现的目标。
感谢您的回答。