Ned*_*alm 9 java algorithm syntax syntax-error
我正在探索一个Java语法分析器,我遇到了这段奇怪的代码,我通常不会在普通代码中使用它.摘自 https://code.google.com/p/javaparser/source/browse/branches/mavenized/JavaParser/src/main/java/japa/parser/ASTParser.java#1998
它有许多包含代码的函数
final public NameExpr Name() throws ParseException {
NameExpr ret;
jj_consume_token(IDENTIFIER);
ret = new NameExpr(token.beginLine, token.beginColumn, token.endLine, token.endColumn, token.image);
label_23: while (true) {
if (jj_2_17(2)) {
;
} else {
break label_23;
}
jj_consume_token(DOT);
jj_consume_token(IDENTIFIER);
ret = new QualifiedNameExpr(ret.getBeginLine(), ret.getBeginColumn(), token.endLine, token.endColumn, ret, token.image);
}
{
if (true) {
return ret;
}
}
throw new Error("Missing return statement in function");
}
Run Code Online (Sandbox Code Playgroud)
一眼看上去很奇怪,但毫无疑问它是有效的,因为我可以编译它.但有人可以解释它是如何工作的吗?我试图输入无效的Java语法,它确实是它的工作!我很困惑.返回后,几行如何抛出异常?
这确实是有效的代码,在没有看到所有内容的情况下,我可以看到一些奇怪的地方:
token
IDENTIFIER
然后:
label_23: while (true) {
if (jj_2_17(2)) {
;
} else {
break label_23;
}
jj_consume_token(DOT);
jj_consume_token(IDENTIFIER);
ret = new QualifiedNameExpr(ret.getBeginLine(), ret.getBeginColumn(), token.endLine, token.endColumn, ret, token.image);
}
Run Code Online (Sandbox Code Playgroud)
这是一个无限循环,只要jj_2_17(2)
returns就会一直运行true
,但似乎对该结果不执行任何操作。它打破了 label_23
当表达式为 时false
。为了让未来的读者更加困惑,只有当表达式是(因为它在)时,即最后三行,它才真正执行操作。true
false
有关更多信息,label_23
仅仅是一个只能在while
和for
循环上使用的标签。然后,您可以在使用时跳出该循环break labelName;
。
从内循环中跳出外循环的示例:
outerLoop: for (int i = 0; i < max; i++) {
innerLoop: for (int j = 0; j < max2 - i; j++) {
if (something) {
break outerLoop;
}
//...
}
}
Run Code Online (Sandbox Code Playgroud)
您实际上也可以continue
与标签结合使用。
然后我们看到一个没有保护的作用域块总是返回ret
:
{
if (true) {
return ret;
}
}
Run Code Online (Sandbox Code Playgroud)
所以这一切都是有效的。我认为我们也很有可能得出这样的结论:这段代码是机器生成的。
归档时间: |
|
查看次数: |
215 次 |
最近记录: |