CSharpParserAdapter.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package de.jplag.csharp;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import org.antlr.v4.runtime.CharStreams;
  8. import org.antlr.v4.runtime.CommonTokenStream;
  9. import org.antlr.v4.runtime.ParserRuleContext;
  10. import org.antlr.v4.runtime.tree.ParseTree;
  11. import org.antlr.v4.runtime.tree.ParseTreeWalker;
  12. import de.jplag.AbstractParser;
  13. import de.jplag.Token;
  14. import de.jplag.TokenConstants;
  15. import de.jplag.csharp.grammar.CSharpLexer;
  16. import de.jplag.csharp.grammar.CSharpParser;
  17. /**
  18. * Parser adapter for the ANTLR 4 CSharp Parser and Lexer. It receives file to parse and passes them to the ANTLR
  19. * pipeline. Then it walks the produced parse tree and creates JPlag token with the {@link CSharpListener}.
  20. * @author Timur Saglam
  21. */
  22. public class CSharpParserAdapter extends AbstractParser {
  23. private List<Token> tokens;
  24. private String currentFile;
  25. /**
  26. * Creates the parser adapter.
  27. */
  28. public CSharpParserAdapter() {
  29. super();
  30. }
  31. /**
  32. * Parses all tokens form a list of files.
  33. * @param directory is the base directory.
  34. * @param fileNames is the list of file names.
  35. * @return the list of parsed tokens.
  36. */
  37. public List<Token> parse(File directory, List<String> fileNames) {
  38. tokens = new ArrayList<>();
  39. errors = 0;
  40. for (String fileName : fileNames) {
  41. if (!parseFile(directory, fileName)) {
  42. errors++;
  43. }
  44. tokens.add(new CSharpToken(TokenConstants.FILE_END, fileName, -1, -1, -1));
  45. }
  46. return tokens;
  47. }
  48. private boolean parseFile(File directory, String fileName) {
  49. File file = new File(directory, fileName);
  50. try (FileInputStream inputStream = new FileInputStream(file)) {
  51. currentFile = fileName;
  52. // create a lexer, a parser and a buffer between them.
  53. CSharpLexer lexer = new CSharpLexer(CharStreams.fromStream(inputStream));
  54. CommonTokenStream tokens = new CommonTokenStream(lexer);
  55. CSharpParser parser = new CSharpParser(tokens);
  56. // Create a tree walker and the entry context defined by the parser grammar
  57. ParserRuleContext entryContext = parser.compilation_unit();
  58. ParseTreeWalker treeWalker = new ParseTreeWalker();
  59. // Walk over the parse tree:
  60. for (int i = 0; i < entryContext.getChildCount(); i++) {
  61. ParseTree parseTree = entryContext.getChild(i);
  62. treeWalker.walk(new CSharpListener(this), parseTree);
  63. }
  64. } catch (IOException exception) {
  65. logger.error("Parsing Error in '" + fileName + "':" + File.separator + exception, exception);
  66. return false;
  67. }
  68. return true;
  69. }
  70. /* package-private */ void addToken(int type, int line, int column, int length) {
  71. tokens.add(new CSharpToken(type, currentFile, line, column, length));
  72. }
  73. }