CSharpParserAdapter.java 2.9 KB

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