繁体   English   中英

ClaiR / Rascal:列出公共职能的最佳方法?

[英]ClaiR/Rascal: Best way to list public functions?

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

上面的代码有效。 但是,是否有更好(较小)的获取公共职能的方式?

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

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

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

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

我有一些看起来像这样的代码: MyClass { public: void myFunc1(); private: void myFunc2(); public: void myFunc3(); void myFunc4(); 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()>,是否用于键入它无法解析的内容(包括未提供给解析器的内容)?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM