ClaiR/Rascal:列出 public 函数的最佳方式?
ClaiR/Rascal: Best way to list public functions?
我正在使用 ClaiR 解析 C++ 头文件并希望获得 public 函数的列表。
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>");
}
}
}
}
}
}
以上代码有效。但是有没有更好(更小)的方法来获取 public 函数?
有一个 M3 modifiers
关系可能包含您要查找的信息:
- https://github.com/usethesource/rascal/blob/1514b30341525fe66cf99a64ed995052293f09d5/src/org/rascalmpl/library/analysis/m3/Core.rsc#L61
- 该关系可以用
o
运算符与您的方法的限定名称组成,以查看在哪个方法上声明了哪些修饰符
但是,当然必须提取该关系。也许这还需要添加到 ClaiR 中?
我有一些代码如下所示:
MyClass {
public:
void myFunc1();
private:
void myFunc2();
public:
void myFunc3();
void myFunc4();
m3.modifiers 不提供 public/private 信息。我猜(没试过),它将适用于 public void myFunc5();
我也看到了一些奇怪的错误。
<|cpp+method:///MyClass/myFunc(org.eclipse.cdt.internal.core.dom.parser.ProblemType@38270bb,unsigned.int,unsigned.int)|,virtual()>,
这是针对它无法解析的类型(包括未提供给解析器)吗?
在 C++ 中,public/protected/private 访问修饰符不适用于声明 "modifiers";相反,访问修饰符之后的所有成员声明(直到可能的下一个访问修饰符)都具有声明的可见性(在您的示例中,第二个 public:
也使 myFunc4
public)。不过,实现 AST 遍历以获取成员的可见性信息并将其添加到新的 M3 table 会很简单。您对 public void myFunc5();
的建议是无效语法。
声明中的 ProblemType
表示 myFunc
方法的第一个参数未解析(可能是由于缺少导入)。类型信息中这个 ProblemType
的 toString
不应该存在,但这是一个错误。
我正在使用 ClaiR 解析 C++ 头文件并希望获得 public 函数的列表。
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>");
}
}
}
}
}
}
以上代码有效。但是有没有更好(更小)的方法来获取 public 函数?
有一个 M3 modifiers
关系可能包含您要查找的信息:
- https://github.com/usethesource/rascal/blob/1514b30341525fe66cf99a64ed995052293f09d5/src/org/rascalmpl/library/analysis/m3/Core.rsc#L61
- 该关系可以用
o
运算符与您的方法的限定名称组成,以查看在哪个方法上声明了哪些修饰符
但是,当然必须提取该关系。也许这还需要添加到 ClaiR 中?
我有一些代码如下所示:
MyClass {
public:
void myFunc1();
private:
void myFunc2();
public:
void myFunc3();
void myFunc4();
m3.modifiers 不提供 public/private 信息。我猜(没试过),它将适用于 public void myFunc5();
我也看到了一些奇怪的错误。 <|cpp+method:///MyClass/myFunc(org.eclipse.cdt.internal.core.dom.parser.ProblemType@38270bb,unsigned.int,unsigned.int)|,virtual()>, 这是针对它无法解析的类型(包括未提供给解析器)吗?
在 C++ 中,public/protected/private 访问修饰符不适用于声明 "modifiers";相反,访问修饰符之后的所有成员声明(直到可能的下一个访问修饰符)都具有声明的可见性(在您的示例中,第二个 public:
也使 myFunc4
public)。不过,实现 AST 遍历以获取成员的可见性信息并将其添加到新的 M3 table 会很简单。您对 public void myFunc5();
的建议是无效语法。
声明中的 ProblemType
表示 myFunc
方法的第一个参数未解析(可能是由于缺少导入)。类型信息中这个 ProblemType
的 toString
不应该存在,但这是一个错误。