0

我正在使用 ClaiR 解析 C++ 头文件,并想要获取公共函数的列表。

visit(ast) {
    case \class(_, name(n), _, decs): {
        println("class name: <n>");
        isPublic = true;
        for (dec <- decs) {
            switch(dec) {
                case \visibilityLabel(\public()): {
                    println("Public functions");
                    isPublic = true;
                }
                case \visibilityLabel(\protected()): {
                    println("Protected functions");
                    isPublic = false;
                }
                case \visibilityLabel(\private()): {
                    println("Private functions");
                    isPublic = false;
                }
                case \simpleDeclaration(_, [\functionDeclarator([*_], [*_], name(na), [*_], [*_])]): {
                    if (isPublic) {
                        println("public function: <na>");
                    }
                }
            }
        }
    }
}

上面的代码有效。但是有没有更好(更小)的方式来获取公共功能?

4

3 回答 3

3

在 C++ 中,public/protected/private 访问修饰符不是声明的正确“修饰符”;相反,访问修饰符之后的所有成员声明(直到可能的下一个访问修饰符)都具有声明的可见性(在您的示例中,第二个public:myFunc4公开)。不过,实现 AST 遍历以获取成员的可见性信息并将其添加到新的 M3 表中是很简单的。您的建议public void myFunc5();是无效的语法。

ProblemTypedecl 中的 表示该方法的第一个参数未myFunc解析(可能是由于缺少导入)。但是,类型信息toString中的 thisProblemType不应该存在,这是一个错误。

于 2019-09-03T08:57:40.753 回答
1

有一个 M3modifiers关系可能包含您正在寻找的信息:

但是,当然必须提取这种关系。也许这仍然需要添加到 ClaiR 中?

于 2019-08-26T10:48:57.500 回答
0

我有一些看起来像这样的代码: MyClass { public: void myFunc1(); private: void myFunc2(); public: void myFunc3(); void myFunc4();

m3.modifiers 不提供公共/私人信息。我想(没有尝试过),它适用于public void myFunc5();

我还看到一些奇怪的错误。<|cpp+method:///MyClass/myFunc(org.eclipse.cdt.internal.core.dom.parser.ProblemType@38270bb,unsigned.int,unsigned.int)|,virtual()>, 这是为了一个类型它无法解析(包括未提供给解析器)?

于 2019-08-27T08:12:02.313 回答