我正在探索一个 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");
}
乍一看很奇怪,但毫无疑问它是有效的,因为我可以编译它。但是有人可以解释它是如何工作的吗?我试图输入无效的 Java 语法,但它成功了!我很困惑。返回后那几行怎么抛出异常?
最佳答案
这确实是有效的代码,虽然没有看到所有内容,但我能看到一些奇怪的地方:
- “不正确”的变量和方法命名,有时使用 PascalCase。
- 实例变量
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);
}
这是一个无限循环,只要 jj_2_17(2)
返回 true
,就会一直运行,但是似乎对该结果不执行任何操作.当表达式为 false
时,它会out of label_23
。更让 future 的读者感到困惑的是,它实际上只有在表达式为 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;
}
//...
}
}
实际上,您还可以将 continue
与标签结合使用。
然后我们看到一个没有保护的作用域 block 总是返回ret
:
{
if (true) {
return ret;
}
}
所以这一切都是有效的。我认为我们也很有可能得出结论,该代码是机器生成的。
关于java - 不常用的 Java 语法 (JavaParser)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23905748/