【发布时间】:2014-07-17 07:55:23
【问题描述】:
我正在探索一个 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 语法,它确实有效!我很困惑。几行返回后如何抛出异常?
【问题讨论】:
-
确保识别出无法理解的确切代码/语法:即它是“标签”吗? “空话”? “无用的投掷”?
-
我无法真正提供答案,因为我从未遇到过这样的事情,但这似乎在this Oracle 教程中有所概述。
-
是的,我指的是块标签、围绕返回的额外大括号、无用的 if 语句和无法访问的 throw。
-
它看起来像一个生成的代码。也许来自 ANTRL?
-
打破标签是 goto 的邪恶表弟
标签: java algorithm syntax syntax-error