[英]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
,类型信息中此ProblemType
的toString
不应该存在,那是一个错误。
M3 modifiers
关系可能包含您要查找的信息:
o
运算符来构成该关系,以查看在哪个方法上声明了哪些修饰符 但是,当然必须提取该关系。 也许仍然需要将其添加到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.