【问题标题】:How to check if given line of code is written in java?如何检查给定的代码行是否用java编写?
【发布时间】:2023-03-27 22:00:01
【问题描述】:

检查给定行是否为java代码的正确方法是什么?

输入:LogSupport.java:44 com/sun/activation/registries/LogSupport log (Ljava/lang/String;)V

预期输出:假。

输入:Scanner in = new Scanner(System.in);

预期输出:真。

我尝试了 Eclipse JDT ASTParser 来检查我们是否可以创建 AST。代码如下:

public static boolean isJava(String line) {
    boolean isJava = false;
    ASTParser parser = ASTParser.newParser(AST.JLS3);
    parser.setSource(line.toCharArray());
    parser.setResolveBindings(false);
    ASTNode node = null;

    parser.setKind(ASTParser.K_STATEMENTS);
    try {
        node = parser.createAST(null);
        if (node == null) return false;
        isJava = true;
    } catch (Exception e) {
        return false;
    }
    return isJava;
}

但这不起作用。有任何想法吗?谢谢!

【问题讨论】:

  • “这不起作用”是什么意思?你有错误吗?输出是否与您的预期不同?也许解析器需要一个完整的 Java 源文件,而不仅仅是一行(这不是一个有效的、完整的 Java 源文件)。
  • 确实,Java 不是逐行编译和/或解释的语言。以变​​量声明为例,您不能将其构建到 AST 中,因为规则无法确定它是本地方法变量还是类属性。
  • 你在解析哪个语句? line.toCharArray() 里面有什么?
  • 您需要将您的代码与什么区分开来?例如,i++; 对 Java 和 C++ 都有效。您的输入是包含整个文件还是仅包含一行?您的示例仅包含一行。如果它是逐行流式传输的,那么)); 是用Java 编写的吗?如果它在下一行跟随f(g(5?所以你需要整个文件或至少一个块。如果您的输入是注释 Java 代码的一部分怎么办?它应该被视为有效的Java吗?它可以包含任何东西。
  • 错误输入的节点值为块“{}”,即节点类型为 8(块)。因此,如果一行有句法错误,则无法将其与语法结构良好的行区分开来。是的,line.toCharArray() 是我提到的输入行。我的输入将只包含一行。所以,这个问题似乎无法解决,也没有很好的定义。

标签: java abstract-syntax-tree


【解决方案1】:

试试 Beanshell

http://www.beanshell.org/intro.html

Java 评估功能:

动态评估完整的 Java 源类以及独立的 Java 方法、语句和表达式。

功能总结

完整的 Java 语法、Java 代码片段以及松散类型的 Java 和其他脚本编写便利的动态执行。

对所有 Java 对象和 API 的透明访问。

以四种模式运行:命令行、控制台、小程序、远程会话服务器。 可以在安全受限的环境中工作,而无需类加载器或大多数功能的字节码生成。

解释器是一个约 150K 的小 jar 文件。

纯 Java。

它是免费的!

下面的链接有一些您可以尝试的其他选项

Syntax Checking in Java

【讨论】:

    【解决方案2】:

    您显然想要确定您拥有的字符串是否是 Java 语言的有效子字符串。

    显然,要做到这一点,您需要一个完整的 Java 解析器作为基础。 一些解析机器可能会让您尝试将字符串解析为语言中的非终结符;使用递归下降解析器相对容易做到这一点。 (根据 OP 的示例,Eclipse 解析似乎提供了这一点)。

    但是如果你想接受一个子字符串(例如,

            57).x=2; foo[15].bar(abc>=
    

    是一个有效的 Java 片段,您需要专门的解析机器来处理它。

    我们的DMS Software Reengineering Toolkit 及其Java Front End 将执行此操作。解析器 API 为“解析完整的编译单元”、“解析非终结符”和“解析子字符串”提供工具。前两个返回树;后者返回一系列树。它不是一个任意的子字符串。您不能在令牌中间开始或结束(例如,字符串文字)。除此之外,它将解析任意子字符串。

    【讨论】:

      猜你喜欢
      • 2022-12-22
      • 2020-12-08
      • 1970-01-01
      • 2016-08-13
      • 2018-01-04
      • 2012-08-10
      • 2021-12-03
      • 1970-01-01
      • 2011-11-11
      相关资源
      最近更新 更多