package husacct.analyse.task.analyse.java; import java.io.IOException; import org.antlr.v4.runtime.ANTLRFileStream; import org.antlr.v4.runtime.BailErrorStrategy; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.atn.PredictionMode; import org.antlr.v4.runtime.misc.ParseCancellationException; import org.apache.log4j.Logger; import husacct.analyse.task.analyse.AbstractAnalyser; import husacct.analyse.task.analyse.ParserExceptionHandler; import husacct.analyse.task.analyse.java.analysing.CompilationUnitAnalyser; import husacct.analyse.task.analyse.java.parsing.JavaLexer; import husacct.analyse.task.analyse.java.parsing.JavaParser; import husacct.analyse.task.analyse.java.parsing.JavaParser.CompilationUnitContext; public class JavaAnalyser extends AbstractAnalyser { private CompilationUnitContext compilationUnit; private CharStream charStream; private Logger logger = Logger.getLogger(JavaAnalyser.class); @Override public void generateModelFromSourceFile(String sourceFilePath) { try { compilationUnit = null; charStream = null; JavaParser javaParser = generateJavaParser(sourceFilePath); new CompilationUnitAnalyser(compilationUnit, sourceFilePath, javaParser); } catch (Exception e) { e.printStackTrace(); } } private JavaParser generateJavaParser(String filePath) throws IOException { charStream = new ANTLRFileStream(filePath, "UTF-8"); Lexer javaLexer = new JavaLexer(charStream); javaLexer.removeErrorListeners(); // Prevents messages in console CommonTokenStream tokens = new CommonTokenStream(javaLexer); JavaParser javaParser = new JavaParser(tokens); // Maximizing parser speed. Read Antlr v4 book, chapter 13.7. javaParser.getInterpreter().setPredictionMode(PredictionMode.SLL); // try with simpler/faster SLL(*) javaParser.removeErrorListeners(); javaParser.setErrorHandler(new BailErrorStrategy()); javaParser.addErrorListener(new ParserExceptionHandler(this)); try { // logger.info(" SLL " + filePath); compilationUnit = javaParser.compilationUnit(); } catch (ParseCancellationException ex) { // Thrown by BailErrorStrategy // Maximizing parser speed. Read Antlr v4 book, chapter 13.7. tokens.reset(); // rewind input stream javaParser.reset(); // Does not reset the error handler and listener javaParser.getInterpreter().setPredictionMode(PredictionMode.LL); // try full LL(*) try { logger.info(" LL " + filePath); compilationUnit = javaParser.compilationUnit(); } catch (RuntimeException e){ logger.warn(e.getMessage() + " - in file: " + filePath); } } catch (RuntimeException ex) { logger.warn(ex.getCause().toString() + " - in file: " + filePath); //ex.printStackTrace(); } return javaParser; } @Override public String getFileExtension() { return ".java"; } }