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

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

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

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

有一个M3modifiers关系,其中可能包含您要查找的信息:

  • https://github.com/usethesource/rascal/blob/1514b30341525fe66cf99a64ed995052293f09d5/src/org/rascalmpl/library/analysis/m3/Core.rsc#L61
  • 该关系可以使用具有方法限定名称的o运算符组成,以查看在哪个方法上声明了哪些修饰符

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

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

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

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

最新更新