2016-07-29 72 views
2

对于给定的java文件,我想检查它是否在语法上正确。即。如果它在正确的地方有分号,匹配的括号等。重要的是,我需要检查文件与其所有依赖关系的隔离。对java文件的语法检查

This other answer是有希望的,但它确实做了语义检查,而不是语法检查。它执行编译器会执行的操作 - 检查所有的import语句以及验证代码中引用的外部类。

有没有办法做一个真正的语法检查? (一检查,只有检查对Java的形式文法的原始文本)

+0

是我们使用IDE。还有的说我需要分析旧文件的大名单,许多人没有他们依靠 – Fidel

+0

库尝试使用javac – Jens

+0

您链接到建议使用Eclipse的JDT分析模块,返回一个抽象语法树答案进行编译。我猜应该这样做。 – Thilo

回答

2

创建或使用Java源代码分析器。对于某些解析器生成器,可以使用公共Java语法 - 您可以使用它来生成解析器。

E.g. Java 8 grammarANTLR(虽然不知道该语法的质量,但你必须做你的评估 - 但语法是由ANTLR的作者写的,所以应该没问题)。

0

由于吉日建议,使用ANTLR库放在一起语法检查。

  1. 下载,然后从here

  2. 提取ANTLR语法从here

  3. 下载ANTLR4罐子运行以下命令从Java 8语法生成类:

    java -jar antlr-4.5.3-complete.jar 〜/ Downloads/grammars-v4-master/java8/Java8.g4

  4. 副本创建到项目

.java文件然后,你可以写你的语法检查器:

public static void main(String[] args) throws SAXException, IOException { 

    ANTLRInputStream input = new ANTLRFileStream(args[0]); 
    Java8Lexer lexer = new Java8Lexer(input); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    Java8Parser parser = new Java8Parser(tokens); 

    final StringBuilder errorMessages = new StringBuilder(); 
    parser.addErrorListener(new BaseErrorListener() { 
     @Override 
     public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { 
      String err = String.format("Failed to parse at line %d:%d due to %s", line, charPositionInLine + 1, msg); 
      errorMessages.append(err); 
      errorMessages.append(System.lineSeparator()); 
     } 
    }); 

    parser.compilationUnit(); 
    int syntaxErrors = parser.getNumberOfSyntaxErrors(); 

    if (syntaxErrors == 0) { 
     System.out.println(args[0] + ": PASS"); 
    } else { 
     System.out.println(args[0] + ": FAILED (" + syntaxErrors + " syntax errors"); 
    } 
}