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

编译器/解释器

开发平台:

Others

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