对于给定的java文件,我想检查它是否在语法上正确。即。如果它在正确的地方有分号,匹配的括号等。重要的是,我需要检查文件与其所有依赖关系的隔离。对java文件的语法检查
This other answer是有希望的,但它确实做了语义检查,而不是语法检查。它执行编译器会执行的操作 - 检查所有的import语句以及验证代码中引用的外部类。
有没有办法做一个真正的语法检查? (一检查,只有检查对Java的形式文法的原始文本)
对于给定的java文件,我想检查它是否在语法上正确。即。如果它在正确的地方有分号,匹配的括号等。重要的是,我需要检查文件与其所有依赖关系的隔离。对java文件的语法检查
This other answer是有希望的,但它确实做了语义检查,而不是语法检查。它执行编译器会执行的操作 - 检查所有的import语句以及验证代码中引用的外部类。
有没有办法做一个真正的语法检查? (一检查,只有检查对Java的形式文法的原始文本)
创建或使用Java源代码分析器。对于某些解析器生成器,可以使用公共Java语法 - 您可以使用它来生成解析器。
E.g. Java 8 grammarANTLR(虽然不知道该语法的质量,但你必须做你的评估 - 但语法是由ANTLR的作者写的,所以应该没问题)。
由于吉日建议,使用ANTLR库放在一起语法检查。
下载,然后从here
提取ANTLR语法从here
下载ANTLR4罐子运行以下命令从Java 8语法生成类:
java -jar antlr-4.5.3-complete.jar 〜/ Downloads/grammars-v4-master/java8/Java8.g4
副本创建到项目
.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");
}
}
是我们使用IDE。还有的说我需要分析旧文件的大名单,许多人没有他们依靠 – Fidel
库尝试使用javac – Jens
您链接到建议使用Eclipse的JDT分析模块,返回一个抽象语法树答案进行编译。我猜应该这样做。 – Thilo