gpt4 book ai didi

java - 不常用的 Java 语法 (JavaParser)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:28 24 4
gpt4 key购买 nike

我正在探索一个 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 只是一个标签,只能在 whilefor 循环中使用。然后,您可以在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com