ClaiR/Rascal:列出 public 函数的最佳方式?

ClaiR/Rascal: Best way to list public functions?

我正在使用 ClaiR 解析 C++ 头文件并希望获得 public 函数的列表。

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>");
                    }
                }
            }
        }
    }
}

以上代码有效。但是有没有更好(更小)的方法来获取 public 函数?

有一个 M3 modifiers 关系可能包含您要查找的信息:

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

我有一些代码如下所示: MyClass { public: void myFunc1(); private: void myFunc2(); public: void myFunc3(); void myFunc4();

m3.modifiers 不提供 public/private 信息。我猜(没试过),它将适用于 public void myFunc5();

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

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

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