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

编译器/解释器

开发平台:

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/Grammar.java#1 $
  7.  */
  8. import antlr.collections.impl.IndexedVector;
  9. import java.util.Hashtable;
  10. import java.util.Enumeration;
  11. import java.io.IOException;
  12. class Grammar {
  13.     protected String name;
  14.     protected String fileName; // where does it come from?
  15.     protected String superGrammar; // null if no super class
  16.     protected String type; // lexer? parser? tree parser?
  17.     protected IndexedVector rules; // text of rules as they were read in
  18.     protected IndexedVector options;// rule options
  19.     protected String tokenSection; // the tokens{} stuff
  20.     protected String preambleAction;// action right before grammar
  21.     protected String memberAction; // action inside grammar
  22.     protected Hierarchy hier; // hierarchy of grammars
  23.     protected boolean predefined=false; // one of the predefined grammars?
  24.     protected boolean alreadyExpanded = false;
  25.     protected boolean specifiedVocabulary=false; // found importVocab option?
  26.     protected String importVocab = null;
  27.     protected String exportVocab = null;
  28.     public Grammar(String name, String superGrammar, IndexedVector rules) {
  29. this.name = name;
  30. this.superGrammar = superGrammar;
  31. this.rules = rules;
  32.     }
  33.     public void addOption(Option o) {
  34. if ( options==null ) { // if not already there, create it
  35.     options = new IndexedVector();
  36. }
  37. options.appendElement(o.getName(), o);
  38.     }
  39.     public void addRule(Rule r) {
  40. rules.appendElement(r.getName(), r);
  41.     }
  42.     /** Copy all nonoverridden rules, vocabulary, and options into this grammar from
  43.      *  supergrammar chain.  The change is made in place; e.g., this grammar's vector
  44.      *  of rules gets bigger.  This has side-effects: all grammars on path to
  45.      *  root of hierarchy are expanded also.
  46.      */
  47.     public void expandInPlace() {
  48. // if this grammar already expanded, just return
  49. if (alreadyExpanded) {
  50.     return;
  51. }
  52. // Expand super grammar first (unless it's a predefined or subgrammar of predefined)
  53. Grammar superG = getSuperGrammar();
  54. if (superG == null)
  55.     return; // error (didn't provide superclass)
  56. if (exportVocab == null) {
  57.     // if no exportVocab for this grammar, make it same as grammar name
  58.     exportVocab = getName();
  59. }
  60. if (superG.isPredefined())
  61.     return; // can't expand Lexer, Parser, ...
  62. superG.expandInPlace();
  63. // expand current grammar now.
  64. alreadyExpanded = true;
  65. // track whether a grammar file needed to have a grammar expanded
  66. GrammarFile gf = hier.getFile(getFileName());
  67. gf.setExpanded(true);
  68. // Copy rules from supergrammar into this grammar
  69. IndexedVector inhRules = superG.getRules();
  70. for (Enumeration e = inhRules.elements(); e.hasMoreElements();) {
  71.     Rule r = (Rule) e.nextElement();
  72.     inherit(r, superG);
  73. }
  74. // Copy options from supergrammar into this grammar
  75. // Modify tokdef options so that they point to dir of enclosing grammar
  76. IndexedVector inhOptions = superG.getOptions();
  77. if (inhOptions != null) {
  78.     for (Enumeration e = inhOptions.elements(); e.hasMoreElements();) {
  79. Option o = (Option) e.nextElement();
  80. inherit(o, superG);
  81.     }
  82. }
  83. // add an option to load the superGrammar's output vocab
  84. if ((options != null && options.getElement("importVocab") == null) || options == null) {
  85.     // no importVocab found, add one that grabs superG's output vocab
  86.     Option inputV = new Option("importVocab", superG.exportVocab+";", this);
  87.     addOption(inputV);
  88.     // copy output vocab file to current dir
  89.     String originatingGrFileName = superG.getFileName();
  90.     String path = antlr.Tool.pathToFile(originatingGrFileName);
  91.     String superExportVocabFileName = path + superG.exportVocab +
  92. antlr.CodeGenerator.TokenTypesFileSuffix +
  93. antlr.CodeGenerator.TokenTypesFileExt;
  94.     String newImportVocabFileName = antlr.Tool.fileMinusPath(superExportVocabFileName);
  95.     if (path.equals("." + System.getProperty("file.separator"))) {
  96. // don't copy tokdef file onto itself (must be current directory)
  97. // System.out.println("importVocab file same dir; leaving as " + superExportVocabFileName);
  98.     }
  99.     else {
  100. try {
  101.     antlr.Tool.copyFile(superExportVocabFileName, newImportVocabFileName);
  102. } catch (IOException io) {
  103.     antlr.Tool.toolError("cannot find/copy importVocab file " + superExportVocabFileName);
  104.     return;
  105. }
  106.     }
  107. }
  108. // copy member action from supergrammar into this grammar
  109. inherit(superG.memberAction, superG);
  110.     }
  111.     public String getFileName() { return fileName; }
  112.     public String getName() {
  113. return name;
  114.     }
  115.     public IndexedVector getOptions() { return options; }
  116.     public IndexedVector getRules() { return rules; }
  117.     public Grammar getSuperGrammar() {
  118. if ( superGrammar==null ) return null;
  119. Grammar g = (Grammar)hier.getGrammar(superGrammar);
  120. return g;
  121.     }
  122.     public String getSuperGrammarName() {
  123. return superGrammar;
  124.     }
  125.     public String getType() {
  126. return type;
  127.     }
  128.     public void inherit(Option o, Grammar superG) {
  129. // do NOT inherit importVocab/exportVocab options under any circumstances
  130. if ( o.getName().equals("importVocab") ||
  131.      o.getName().equals("exportVocab") ) {
  132.     return;
  133. }
  134. Option overriddenOption = null;
  135. if ( options!=null ) { // do we even have options?
  136.     overriddenOption = (Option)options.getElement(o.getName());
  137. }
  138. // if overridden, do not add to this grammar
  139. if ( overriddenOption==null ) { // not overridden
  140.     addOption(o); // copy option into this grammar--not overridden
  141. }
  142.     }
  143.     public void inherit(Rule r, Grammar superG) {
  144. // if overridden, do not add to this grammar
  145. Rule overriddenRule = (Rule)rules.getElement(r.getName());
  146. if ( overriddenRule!=null ) {
  147.     // rule is overridden in this grammar.
  148.     if ( !overriddenRule.sameSignature(r) ) {
  149. // warn if different sig
  150. antlr.Tool.warning("rule "+getName()+"."+overriddenRule.getName()+
  151.    " has different signature than "+
  152.    superG.getName()+"."+overriddenRule.getName());
  153.     }
  154. }
  155. else {  // not overridden, copy rule into this
  156.     addRule(r);
  157. }
  158.     }
  159.     public void inherit(String memberAction, Grammar superG) {
  160. if ( this.memberAction!=null ) return; // do nothing if already have member action
  161. if ( memberAction != null ) { // don't have one here, use supergrammar's action
  162.     this.memberAction = memberAction;
  163. }
  164.     }
  165.     public boolean isPredefined() { return predefined; }
  166.     public void setFileName(String f) { fileName=f; }
  167.     public void setHierarchy(Hierarchy hier) { this.hier = hier; }
  168.     public void setMemberAction(String a) {memberAction=a;}
  169.     public void setOptions(IndexedVector options) {
  170. this.options = options;
  171.     }
  172.     public void setPreambleAction(String a) {preambleAction=a;}
  173.     public void setPredefined(boolean b) { predefined=b; }
  174.     public void setTokenSection(String tk) {
  175. tokenSection=tk;
  176.     }
  177.     public void setType(String t) {
  178. type = t;
  179.     }
  180.     public String toString() {
  181. String s="";
  182. if ( preambleAction!=null ) {
  183.     s += preambleAction;
  184. }
  185. if ( superGrammar==null ) {
  186.     return "class "+name+";";
  187. }
  188. String sup = "";
  189. s+="class "+name+" extends "+type+sup+";"+
  190.     System.getProperty("line.separator")+
  191.     System.getProperty("line.separator");
  192. if ( options!=null ) {
  193.     s += Hierarchy.optionsToString(options);
  194. }
  195. if ( tokenSection!=null ) {
  196.     s += tokenSection + "n";
  197. }
  198. if ( memberAction!=null ) {
  199.     s += memberAction+System.getProperty("line.separator");
  200. }
  201. for (int i=0; i<rules.size(); i++) {
  202.     Rule r = (Rule)rules.elementAt(i);
  203.     if ( !getName().equals(r.enclosingGrammar.getName()) ) {
  204. s += "// inherited from grammar "+r.enclosingGrammar.getName()+System.getProperty("line.separator");
  205.     }
  206.     s += r+
  207. System.getProperty("line.separator")+
  208. System.getProperty("line.separator");
  209. }
  210. return s;
  211.     }
  212. }