Parser.java 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. protected 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. public TokenList parse(File directory, String[] files) {
  16. tokens = new TokenList();
  17. errors = 0;
  18. for (String file : files) {
  19. getErrorConsumer().print("", "Parsing file " + file);
  20. if (!parseFile(directory, file))
  21. errors++;
  22. tokens.addToken(new TextToken(TokenConstants.FILE_END, file, this));
  23. }
  24. TokenList tmp = tokens;
  25. tokens = null;
  26. this.parseEnd();
  27. return tmp;
  28. }
  29. public void add(Token token) {
  30. ParserToken parserToken = (ParserToken) token;
  31. tokens.addToken(new TextToken(token.getText(), currentFile, parserToken.getLine(), parserToken.getColumn(), parserToken.getLength(), this));
  32. }
  33. public void outOfSerials() {
  34. if (runOut)
  35. return;
  36. runOut = true;
  37. errors++;
  38. errorConsumer.print("ERROR: Out of serials!", null);
  39. System.out.println("de.jplag.text.Parser: ERROR: Out of serials!");
  40. }
  41. private boolean parseFile(File directory, String file) {
  42. InputState inputState = null;
  43. try {
  44. FileInputStream inputStream = new FileInputStream(new File(directory, file));
  45. currentFile = file;
  46. // Create a scanner that reads from the input stream passed to us
  47. inputState = new InputState(inputStream);
  48. TextLexer lexer = new TextLexer(inputState);
  49. lexer.setFilename(file);
  50. lexer.setTokenObjectClass("de.jplag.text.ParserToken");
  51. // Create a parser that reads from the scanner
  52. TextParser parser = new TextParser(lexer);
  53. parser.setFilename(file);
  54. parser.parser = this;// Added by Emeric 26.01.05 BAD
  55. // start parsing at the compilationUnit rule
  56. parser.file();
  57. // close file
  58. inputStream.close();
  59. } catch (Exception e) {
  60. getErrorConsumer().addError(
  61. " Parsing Error in '" + file + "' (line " + (inputState != null ? "" + inputState.getLine() : "") + "):\n " + e.getMessage());
  62. return false;
  63. }
  64. return true;
  65. }
  66. }