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

编译器/解释器

开发平台:

Others

  1. package antlr.preprocessor;
  2. /* ANTLR Translator Generator
  3.  * Project led by Terence Parr at http://www.jGuru.com
  4.  * Software rights: http://www.antlr.org/RIGHTS.html
  5.  *
  6.  * $Id: //depot/code/org.antlr/release/antlr-2.7.0/antlr/preprocessor/Tool.java#1 $
  7.  */
  8. /*
  9.  * Tester for the preprocessor
  10.  * 
  11.  */
  12. import java.io.*;
  13. import antlr.collections.impl.Vector;
  14. import java.util.Enumeration;
  15. public class Tool {
  16.     protected Hierarchy theHierarchy;
  17.     protected String grammarFileName;
  18.     protected String[] args;
  19.     protected int nargs; // how many args in new args list
  20.     protected Vector grammars;
  21.     protected antlr.Tool antlrTool;
  22.     public Tool(antlr.Tool t, String[] args) {
  23. antlrTool = t;
  24. processArguments(args);
  25.     }
  26.     public static void main(String[] args) {
  27. antlr.Tool aTool = new antlr.Tool();
  28. Tool theTool = new Tool(aTool, args);
  29. theTool.preprocess();
  30. String[] a = theTool.preprocessedArgList();
  31. for (int i=0; i<a.length; i++) {
  32.     System.out.print(" "+a[i]);
  33. }
  34. System.out.println();
  35.     }
  36.     public boolean preprocess() {
  37. if (grammarFileName == null) {
  38.     antlr.Tool.toolError("no grammar file specified");
  39.     return false;
  40. }
  41. if (grammars != null) {
  42.     theHierarchy = new Hierarchy();
  43.     for (Enumeration e = grammars.elements(); e.hasMoreElements();) {
  44. String f = (String) e.nextElement();
  45. try {
  46.     theHierarchy.readGrammarFile(f);
  47. } catch (FileNotFoundException fe) {
  48.     antlr.Tool.toolError("file " + f + " not found");
  49.     return false;
  50. }
  51.     }
  52. }
  53. // do the actual inheritance stuff
  54. boolean complete = theHierarchy.verifyThatHierarchyIsComplete();
  55. if (!complete)
  56.     return false;
  57. theHierarchy.expandGrammarsInFile(grammarFileName);
  58. GrammarFile gf = theHierarchy.getFile(grammarFileName);
  59. String expandedFileName = gf.nameForExpandedGrammarFile(grammarFileName);
  60. // generate the output file if necessary
  61. if (expandedFileName.equals(grammarFileName)) {
  62.     args[nargs++] = grammarFileName; // add to argument list
  63. } else {
  64.     try {
  65. gf.generateExpandedFile();  // generate file to feed ANTLR
  66. args[nargs++] = antlr.Tool.getOutputDirectory() +
  67.     System.getProperty("file.separator") +
  68.     expandedFileName; // add to argument list
  69.     } catch (IOException io) {
  70. antlr.Tool.toolError("cannot write expanded grammar file " + expandedFileName);
  71. return false;
  72.     }
  73. }
  74. return true;
  75.     }
  76.     /** create new arg list with correct length to pass to ANTLR */
  77.     public String[] preprocessedArgList() {
  78. String[] a = new String[nargs];
  79. System.arraycopy(args, 0, a, 0, nargs);
  80. args = a;
  81. return args;
  82.     }
  83.     /** Process -glib options and grammar file.  Create a new args list
  84.  *  that does not contain the -glib option.  The grammar file name
  85.  *  might be modified and, hence, is not added yet to args list.
  86.  */
  87.     private void processArguments(String[] incomingArgs)
  88.     {
  89. this.nargs = 0;
  90. this.args = new String[incomingArgs.length];
  91. for (int i=0; i<incomingArgs.length; i++) {
  92.     if ( incomingArgs[i].equals("-glib") ) {
  93. // if on a pc and they use a '/', warn them
  94. if ( File.separator.equals("\") && 
  95.      incomingArgs[i].indexOf('/') != -1 ) {
  96.     antlrTool.warning("-glib cannot deal with '/' on a PC: use '\'; ignoring...");
  97. }
  98. else {
  99.     grammars = antlr.Tool.parseSeparatedList(incomingArgs[i+1],';');
  100.     i++;
  101. }
  102.     }
  103.     else if ( incomingArgs[i].equals("-o") ) {
  104. args[this.nargs++] = incomingArgs[i];
  105. if (i + 1 >= incomingArgs.length) {
  106.     antlrTool.error("missing output directory with -o option; ignoring");
  107. } else {
  108.     i++;
  109.     args[this.nargs++] = incomingArgs[i];
  110.     antlrTool.setOutputDirectory(incomingArgs[i]);
  111. }
  112.     }
  113.     else if (incomingArgs[i].charAt(0) == '-') {
  114. args[this.nargs++] = incomingArgs[i];
  115.     }
  116.     else {
  117. // Must be the grammar file
  118. grammarFileName = incomingArgs[i];
  119. if ( grammars==null ) {
  120.     grammars = new Vector(10);
  121. }
  122. grammars.appendElement(grammarFileName); // process it too
  123. if ( (i+1)<incomingArgs.length ) {
  124.     antlrTool.warning("grammar file must be last; ignoring other arguments...");
  125.     break;
  126. }
  127.     }
  128. }
  129.     }
  130. }