Main.java
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:3k
源码类别:

编译器/解释器

开发平台:

Others

  1. import JavaRecognizer;
  2. import JavaLexer;
  3. import java.io.*;
  4. import antlr.collections.AST;
  5. import antlr.collections.impl.*;
  6. import antlr.debug.misc.*;
  7. import antlr.*;
  8. import java.awt.event.*;
  9. class Main {
  10. static boolean showTree = false;
  11.     public static void main(String[] args) {
  12. // Use a try/catch block for parser exceptions
  13. try {
  14. // if we have at least one command-line argument
  15. if (args.length > 0 ) {
  16. System.err.println("Parsing...");
  17. // for each directory/file specified on the command line
  18. for(int i=0; i< args.length;i++) {
  19. if ( args[i].equals("-showtree") ) {
  20. showTree = true;
  21. }
  22. else {
  23. doFile(new File(args[i])); // parse it
  24. }
  25. } }
  26. else
  27. System.err.println("Usage: java Main [-showtree] "+
  28.                                    "<directory or file name>");
  29. }
  30. catch(Exception e) {
  31. System.err.println("exception: "+e);
  32. e.printStackTrace(System.err);   // so we can get stack trace
  33. }
  34. }
  35. // This method decides what action to take based on the type of
  36. //   file we are looking at
  37. public static void doFile(File f)
  38.   throws Exception {
  39. // If this is a directory, walk each file/dir in that directory
  40. if (f.isDirectory()) {
  41. String files[] = f.list();
  42. for(int i=0; i < files.length; i++)
  43. doFile(new File(f, files[i]));
  44. }
  45. // otherwise, if this is a java file, parse it!
  46. else if ((f.getName().length()>5) &&
  47. f.getName().substring(f.getName().length()-5).equals(".java")) {
  48. System.err.println("   "+f.getAbsolutePath());
  49. parseFile(f.getName(), new FileInputStream(f));
  50. }
  51. }
  52. // Here's where we do the real work...
  53. public static void parseFile(String f, InputStream s)
  54.  throws Exception {
  55. try {
  56. // Create a scanner that reads from the input stream passed to us
  57. JavaLexer lexer = new JavaLexer(s);
  58. lexer.setFilename(f);
  59. // Create a parser that reads from the scanner
  60. JavaRecognizer parser = new JavaRecognizer(lexer);
  61. parser.setFilename(f);
  62. // start parsing at the compilationUnit rule
  63. parser.compilationUnit();
  64. // do something with the tree
  65. doTreeAction(f, parser.getAST(), parser.getTokenNames());
  66. }
  67. catch (Exception e) {
  68. System.err.println("parser exception: "+e);
  69. e.printStackTrace();   // so we can get stack trace
  70. }
  71. }
  72. public static void doTreeAction(String f, AST t, String[] tokenNames) {
  73. if ( t==null ) return;
  74. if ( showTree ) {
  75. ((CommonAST)t).setVerboseStringConversion(true, tokenNames);
  76. ASTFactory factory = new ASTFactory();
  77. AST r = factory.create(0,"AST ROOT");
  78. r.setFirstChild(t);
  79. final ASTFrame frame = new ASTFrame("Java AST", r);
  80. frame.setVisible(true);
  81. frame.addWindowListener(
  82. new WindowAdapter() {
  83.                    public void windowClosing (WindowEvent e) {
  84.                        frame.setVisible(false); // hide the Frame
  85.                        frame.dispose();
  86.                        System.exit(0);
  87.                    }
  88.         }
  89. );
  90. // System.out.println(t.toStringList());
  91. }
  92. JavaTreeParser tparse = new JavaTreeParser();
  93. try {
  94. tparse.compilationUnit(t);
  95. // System.out.println("successful walk of result AST for "+f);
  96. }
  97. catch (RecognitionException e) {
  98. System.err.println(e.getMessage());
  99. e.printStackTrace();
  100. }
  101. }
  102. }