Parser.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package jplag.csharp;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileReader;
  6. import java.io.IOException;
  7. import jplag.StrippedProgram;
  8. import jplag.Structure;
  9. import jplag.UnicodeReader;
  10. import jplag.csharp.grammar.CSharpLexer;
  11. import jplag.csharp.grammar.CSharpParser;
  12. public class Parser extends jplag.Parser implements CSharpTokenConstants {
  13. private Structure struct;
  14. private String currentFile;
  15. public static void main(String args[]) {
  16. if (args.length != 1) {
  17. System.out.println("Only one parameter allowed.");
  18. System.exit(-1);
  19. }
  20. Parser parser = new Parser();
  21. parser.setProgram(new StrippedProgram());
  22. jplag.Structure struct = parser.parse(new File(args[0]).getParentFile(), new String[] { new File(args[0]).getName() });
  23. try {
  24. BufferedReader reader = new BufferedReader(new FileReader(new File(args[0])));
  25. int lineNr = 1;
  26. int token = 0;
  27. String line;
  28. while ((line = reader.readLine()) != null) {
  29. if (token < struct.size()) {
  30. boolean first = true;
  31. while (struct.tokens[token] != null && struct.tokens[token].getLine() == lineNr) {
  32. if (!first)
  33. System.out.println();
  34. jplag.Token tok = struct.tokens[token];
  35. System.out.print(CSharpToken.type2string(tok.type) + " (" + tok.getLine() + "," + tok.getColumn() + ","
  36. + tok.getLength() + ")\t");
  37. first = false;
  38. token++;
  39. }
  40. if (first)
  41. System.out.print(" \t");
  42. } else
  43. System.out.print(" \t");
  44. System.out.println(line);
  45. lineNr++;
  46. }
  47. reader.close();
  48. } catch (IOException e) {
  49. System.out.println(e);
  50. }
  51. }
  52. public jplag.Structure parse(File dir, String files[]) {
  53. struct = new Structure();
  54. errors = 0;
  55. for (int i = 0; i < files.length; i++) {
  56. // getProgram().print(null, "Parsing file " + files[i] + "\n");
  57. if (!parseFile(dir, files[i]))
  58. errors++;
  59. struct.addToken(new CSharpToken(FILE_END, files[i], -1, -1, -1));
  60. }
  61. this.parseEnd();
  62. return struct;
  63. }
  64. private boolean parseFile(File dir, String file) {
  65. try {
  66. FileInputStream fis = new FileInputStream(new File(dir, file));
  67. currentFile = file;
  68. // Create a scanner that reads from the input stream passed to us
  69. CSharpLexer lexer = new CSharpLexer(new UnicodeReader(fis, "ISO-8859-1"));
  70. lexer.setFilename(file);
  71. lexer.setTabSize(1);
  72. // Create a parser that reads from the scanner
  73. CSharpParser parser = new CSharpParser(lexer);
  74. parser.setFilename(file);
  75. parser.parser = this;//Added by emeric 22.01.05
  76. // start parsing at the compilationUnit rule
  77. parser.compilation_unit();
  78. // close file
  79. fis.close();
  80. } catch (Exception e) {
  81. getProgram().addError(" Parsing Error in '" + file + "':\n " + e.toString() + "\n");
  82. return false;
  83. }
  84. return true;
  85. }
  86. public void add(int type, antlr.Token tok) {
  87. if (tok == null) {
  88. System.out.println("tok == null ERROR!");
  89. return;
  90. }
  91. struct.addToken(new CSharpToken(type, currentFile, tok.getLine(), tok.getColumn(), tok.getText().length()));
  92. // System.out.println("type: " + CSharpToken.type2string(type) +
  93. // " text: '"+tok.getText()+"'");
  94. }
  95. public void add(int type, CSharpParser p) {
  96. add(type, p.getLastConsumedToken());
  97. }
  98. }