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

标签 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");
}

乍一看很奇怪,但毫无疑问它是有效的,因为我可以编译它。但是有人可以解释它是如何工作的吗?我试图输入无效的 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/

相关文章:

sql-server - SQL Server 2005 中 LOCK_ESCALATION = TABLE 的等效项是什么?

java - 基于注解的Spring Activiti ProcessEngine

java - Mongodb java驱动程序查询转换

c# - 双向冒泡排序 C#

algorithm - 根据属性将输入数据分类到集合中

C++ 构造函数调用——需要帮助来确定某些调用是如何进行的

java - 在 Android textSwitcher 中使用上标

java - JPA Query.getResultList() - 以通用方式使用

arrays - 查找数组的顶部和底部 5 个元素

javascript - 使用 .on() 和 namespace 语法附加多个事件处理程序