CSharpParserAdapter.java 3.1 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.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.ErrorConsumer;
  13. import de.jplag.TokenList;
  14. import de.jplag.csharp.grammar.CSharpLexer;
  15. import de.jplag.csharp.grammar.CSharpParser;
  16. /**
  17. * Parser adapter for the ANTLR 4 CSharp Parser and Lexer. It receives file to parse and passes them to the ANTLR
  18. * pipeline. Then it walks the produced parse tree and creates JPlag token with the {@link CSharpListener}.
  19. * @author Timur Saglam
  20. */
  21. public class CSharpParserAdapter extends AbstractParser {
  22. private TokenList tokens;
  23. private String currentFile;
  24. /**
  25. * Creates the parser adapter.
  26. * @param errorConsumer is the consumer for any occurring errors.
  27. */
  28. public CSharpParserAdapter(ErrorConsumer errorConsumer) {
  29. super(errorConsumer);
  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 TokenList parse(File directory, List<String> fileNames) {
  38. tokens = new TokenList();
  39. errors = 0;
  40. for (String fileName : fileNames) {
  41. if (!parseFile(directory, fileName)) {
  42. errors++;
  43. }
  44. tokens.addToken(new CSharpToken(CSharpTokenConstants.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. getErrorConsumer().addError("Parsing Error in '" + fileName + "':" + File.separator + exception.toString());
  66. return false;
  67. }
  68. return true;
  69. }
  70. /* package-private */ void addToken(int type, int line, int column, int length) {
  71. tokens.addToken(new CSharpToken(type, currentFile, line, column, length));
  72. }
  73. }