不常用的Java语法(JavaParser)?

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语法,它确实是它的工作!我很困惑.返回后,几行如何抛出异常?

ski*_*iwi 3

这确实是有效的代码,在没有看到所有内容的情况下,我可以看到一些奇怪的地方:

  • “不正确”的变量和方法命名,有时使用 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);
}
Run Code Online (Sandbox Code Playgroud)

这是一个无限循环,只要jj_2_17(2)returns就会一直运行true,但似乎对该结果不执行任何操作。它打破 label_23当表达式为 时false。为了让未来的读者更加困惑,只有当表达式是(因为它在)时,即最后三行,它才真正执行操作。truefalse

有关更多信息,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;
        }
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

您实际上也可以continue与标签结合使用。

然后我们看到一个没有保护的作用域块总是返回ret

{
    if (true) {
        return ret;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以这一切都是有效的。我认为我们也很有可能得出这样的结论:这段代码是机器生成的。

  • @Nederealm 我想说这段代码有很强的迹象表明它是机器生成的。 (4认同)