如何检查给定的代码行是否用java编写?

时间:2015-04-23 07:20:42

标签: java abstract-syntax-tree

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

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

预期输出:false。

输入:扫描仪输入=新扫描仪(System.in);

预期输出:true。

我尝试了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;
}

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

2 个答案:

答案 0 :(得分:4)

尝试Beanshell

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

Java评估功能:

动态评估完整的Java源类以及隔离的Java方法,语句和表达式。

功能摘要

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

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

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

解释器是小~150K jar文件。

Pure Java。

免费!!

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

Syntax Checking in Java

答案 1 :(得分:1)

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

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

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

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

是一个有效的Java片段,您需要解析专门用于处理此问题的机制。

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