【发布时间】: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() 是我提到的输入行。我的输入将只包含一行。所以,这个问题似乎无法解决,也没有很好的定义。