计算 Java 文件中的方法数
Count the number of methods in a Java file
我正在尝试解析 Java 文件并计算其中的方法声明。现在我正在使用以下代码:
import ParseTree;
import lang::java::\syntax::Java15;
import IO;
public int countMethods(loc file) {
int n = 0;
try {
comp = parse(#CompilationUnit, file);
for (/MethodDec md <- comp) {
n = n + 1;
}
} catch ParseError(loc l): {
println("Error at line <l.begin.line>, col <l.begin.column>.");
}
return n;
}
我被 CompilationUnit 类型不可枚举的错误消息卡住了。现在我想知道如何 get/iterate 通过所有方法?
int x <- l
表示迭代 l
并在其上应用模式匹配 int x
,如果成功,将 x
绑定到该值。这意味着对于 <-
,右侧必须是可枚举的(列表、集合、映射等)。当您想要使用后代匹配来匹配所有情况时,您通常需要使用 :=
匹配运算符。即使右侧是可枚举的。请参见下面的示例:
import IO;
list[list[int]] ll = [[1,2],[1,3,4],[3],[1,1,1,3,4]];
println("Pattern match on the children of ll");
for (/list[value] v <- ll) {
println(v);
}
println("Pattern match on the children of ll and ll itself");
for (/list[value] v := ll) {
println(v);
}
这输出:
Pattern match on the children of ll
[1,2]
[1,3,4]
[3]
[1,1,1,3,4]
Pattern match on the children of ll and ll itself
[1,2]
[1,3,4]
[3]
[1,1,1,3,4]
[[1,2],[1,3,4],[3],[1,1,1,3,4]]
区别在于模式匹配器尝试的候选项。
对于您的具体示例,您也可以使用 reducer 编写它:
public int countMethods(loc file) {
try {
return (0 | it + 1 | /MethodDec md := parse(#CompilationUnit, file));
} catch ParseError(loc l): {
println("Error at line <l.begin.line>, col <l.begin.column>.");
return 0;
}
}
为什么不是这个?
public int countMethods(loc file)
{
try
{
return size([1 | /MethodDec md <- parse(#CompilationUnit, file)]);
}
catch ParseError(loc l):
{
println("Error at line <l.begin.line>, col <l.begin.column>.");
return 0;
}
}
我正在尝试解析 Java 文件并计算其中的方法声明。现在我正在使用以下代码:
import ParseTree;
import lang::java::\syntax::Java15;
import IO;
public int countMethods(loc file) {
int n = 0;
try {
comp = parse(#CompilationUnit, file);
for (/MethodDec md <- comp) {
n = n + 1;
}
} catch ParseError(loc l): {
println("Error at line <l.begin.line>, col <l.begin.column>.");
}
return n;
}
我被 CompilationUnit 类型不可枚举的错误消息卡住了。现在我想知道如何 get/iterate 通过所有方法?
int x <- l
表示迭代 l
并在其上应用模式匹配 int x
,如果成功,将 x
绑定到该值。这意味着对于 <-
,右侧必须是可枚举的(列表、集合、映射等)。当您想要使用后代匹配来匹配所有情况时,您通常需要使用 :=
匹配运算符。即使右侧是可枚举的。请参见下面的示例:
import IO;
list[list[int]] ll = [[1,2],[1,3,4],[3],[1,1,1,3,4]];
println("Pattern match on the children of ll");
for (/list[value] v <- ll) {
println(v);
}
println("Pattern match on the children of ll and ll itself");
for (/list[value] v := ll) {
println(v);
}
这输出:
Pattern match on the children of ll
[1,2]
[1,3,4]
[3]
[1,1,1,3,4]
Pattern match on the children of ll and ll itself
[1,2]
[1,3,4]
[3]
[1,1,1,3,4]
[[1,2],[1,3,4],[3],[1,1,1,3,4]]
区别在于模式匹配器尝试的候选项。
对于您的具体示例,您也可以使用 reducer 编写它:
public int countMethods(loc file) {
try {
return (0 | it + 1 | /MethodDec md := parse(#CompilationUnit, file));
} catch ParseError(loc l): {
println("Error at line <l.begin.line>, col <l.begin.column>.");
return 0;
}
}
为什么不是这个?
public int countMethods(loc file)
{
try
{
return size([1 | /MethodDec md <- parse(#CompilationUnit, file)]);
}
catch ParseError(loc l):
{
println("Error at line <l.begin.line>, col <l.begin.column>.");
return 0;
}
}