首页 > 解决方案 > ClaiR/Rascal:列出公共功能的最佳方式?

问题描述

我正在使用 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>");
                    }
                }
            }
        }
    }
}

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

标签: classheaderrascalpublic-methodclair

解决方案


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

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


推荐阅读