Parser.java 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package de.jplag.text;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.util.Hashtable;
  5. import antlr.Token;
  6. import de.jplag.AbstractParser;
  7. import de.jplag.TokenConstants;
  8. import de.jplag.TokenList;
  9. public class Parser extends AbstractParser {
  10. private final Hashtable<String, Integer> table = new Hashtable<>();
  11. protected int serial = 1; // 0 is FILE_END token
  12. private TokenList tokens;
  13. private String currentFile;
  14. private boolean runOut = false;
  15. /**
  16. * Creates the parser.
  17. */
  18. public Parser() {
  19. super();
  20. }
  21. public TokenList parse(File directory, String[] files) {
  22. tokens = new TokenList();
  23. errors = 0;
  24. for (String file : files) {
  25. logger.trace("Parsing file {}", file);
  26. if (!parseFile(directory, file))
  27. errors++;
  28. tokens.addToken(new TextToken(TokenConstants.FILE_END, file, this));
  29. }
  30. TokenList tmp = tokens;
  31. tokens = null;
  32. return tmp;
  33. }
  34. public void add(Token token) {
  35. ParserToken parserToken = (ParserToken) token;
  36. tokens.addToken(new TextToken(token.getText(), currentFile, parserToken.getLine(), parserToken.getColumn(), parserToken.getLength(), this));
  37. }
  38. public void outOfSerials() {
  39. if (runOut)
  40. return;
  41. runOut = true;
  42. errors++;
  43. logger.error("Out of serials!");
  44. }
  45. private boolean parseFile(File directory, String file) {
  46. InputState inputState = null;
  47. try {
  48. FileInputStream inputStream = new FileInputStream(new File(directory, file));
  49. currentFile = file;
  50. // Create a scanner that reads from the input stream passed to us
  51. inputState = new InputState(inputStream);
  52. TextLexer lexer = new TextLexer(inputState);
  53. lexer.setFilename(file);
  54. lexer.setTokenObjectClass("de.jplag.text.ParserToken");
  55. // Create a parser that reads from the scanner
  56. TextParser parser = new TextParser(lexer);
  57. parser.setFilename(file);
  58. parser.parser = this;// Added by Emeric 26.01.05 BAD
  59. // start parsing at the compilationUnit rule
  60. parser.file();
  61. // close file
  62. inputStream.close();
  63. } catch (Exception e) {
  64. logger.error("Parsing Error in '" + file + "' (line " + (inputState != null ? "" + inputState.getLine() : "") + "):\n " + e.getMessage(),
  65. e);
  66. return false;
  67. }
  68. return true;
  69. }
  70. protected Hashtable<String, Integer> getTable() {
  71. return table;
  72. }
  73. }