我正在使用C++解析一个ClaiR头文件,并希望得到一个公共函数的列表。
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>");
}
}
}
}
}
}以上代码起作用。但是,是否有更好(更小)的方式获得公共职能?
发布于 2019-08-26 10:48:57
有一个M3 modifiers关系,它可能包含您要查找的信息:
o运算符组成,以查看在哪个方法上声明了哪些修饰符。然而,这种关系当然必须被提取出来。也许还需要添加到ClaiR中吗?
发布于 2019-09-03 08:57:40
在C++中,公共/受保护/私有访问修饰符不是声明上的正确“修饰符”;相反,在访问修饰符之后的所有成员声明(直到下一个访问修饰符为止)都具有声明的可见性(在您的示例中,第二个public:也使myFunc4公开)。但是,实现AST遍历以获取成员的可视信息并将其添加到新的M3表将非常简单。您对public void myFunc5();的建议是无效的语法。
decl中的ProblemType表示myFunc方法的第一个参数是未解析的(可能是由于缺少导入)。但是,类型信息中此toString的ProblemType不应该存在,这是一个bug。
发布于 2019-08-27 08:12:02
我有一些代码,如下所示:MyClass { public: void myFunc1(); private: void myFunc2(); public: void myFunc3(); void myFunc4();
M3.修饰符不提供公共/私有信息。我想(还没试过),它会对public void myFunc5();有效的
我也看到一些奇怪的错误。|cpp+method:///MyClass/myFunc(org.eclipse.cdt.internal.core.dom.parser.ProblemType@38270bb,unsigned.int,unsigned.int)|,virtual(),这是否是它无法解析的类型(包括未提供给解析器)?
https://stackoverflow.com/questions/57637112
复制相似问题