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

编译器/解释器

开发平台:

Others

  1. package antlr;
  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/AlternativeBlock.java#1 $
  7.  */
  8. import antlr.collections.impl.Vector;
  9. /**A list of alternatives */
  10. class AlternativeBlock extends AlternativeElement {
  11.     protected String initAction = null; // string for init action {...}
  12.     protected Vector alternatives; // Contains Alternatives
  13.     protected String label; // can label a looping block to break out of it.
  14.     protected int alti, altj; // which alts are being compared at the moment with
  15. // deterministic()?
  16.     protected int analysisAlt; // which alt are we computing look on?  Must be alti or altj
  17.     protected boolean hasAnAction = false; // does any alt have an action?
  18.     protected boolean hasASynPred = false; // does any alt have a syntactic predicate?
  19.     protected int ID=0; // used to generate unique variables
  20.     protected static int nblks; // how many blocks have we allocated?
  21.     boolean not = false; // true if block is inverted.
  22.     boolean greedy = true; // Blocks are greedy by default
  23.     boolean greedySet=false; // but, if not explicitly greedy, warning might be generated
  24.     protected boolean doAutoGen=true; // false if no AST (or text) to be generated for block
  25.     protected boolean warnWhenFollowAmbig = true; // warn when an empty path or exit path
  26.     protected boolean generateAmbigWarnings = true;  // the general warning "shut-up" mechanism
  27. // conflicts with alt of subrule.
  28. // Turning this off will suppress stuff
  29. // like the if-then-else ambig.
  30.     public AlternativeBlock(Grammar g) {
  31. this(g,0,false);
  32.     }
  33.     public AlternativeBlock(Grammar g, int line, boolean not) {
  34. super(g);
  35. alternatives = new Vector(5);
  36. this.line = line;
  37. this.not = not;
  38. nblks++;
  39. ID = nblks;
  40.     }
  41.     public void addAlternative(Alternative alt) {
  42. alternatives.appendElement(alt);
  43.     }
  44.     public void generate() {
  45. grammar.generator.gen(this);
  46.     }
  47.     public Alternative getAlternativeAt(int i)
  48.     {
  49. return (Alternative)alternatives.elementAt(i);
  50.     }
  51.     public Vector getAlternatives() {
  52. return alternatives;
  53.     }
  54.     public boolean getAutoGen() { 
  55. return doAutoGen; 
  56.     }
  57.     public String getInitAction() { 
  58. return initAction;
  59.     }
  60.     public String getLabel() {
  61. return label;
  62.     }
  63.     public Lookahead look(int k) {
  64. return grammar.theLLkAnalyzer.look(k, this);
  65.     }
  66.     public void prepareForAnalysis() {
  67. for (int i=0; i<alternatives.size(); i++) {
  68.     // deterministic() uses an alternative cache and sets lookahead depth
  69.     Alternative a = (Alternative)alternatives.elementAt(i);
  70.     a.cache = new Lookahead[grammar.maxk+1];
  71.     a.lookaheadDepth = GrammarAnalyzer.LOOKAHEAD_DEPTH_INIT;
  72. }
  73.     }
  74.     /**Walk the syntactic predicate and, for a rule ref R, remove
  75.  * the ref from the list of FOLLOW references for R (stored
  76.  * in the symbol table.
  77.  */
  78.     public void removeTrackingOfRuleRefs(Grammar g) {
  79. for (int i=0; i<alternatives.size(); i++) {
  80.     Alternative alt = getAlternativeAt(i);
  81.     AlternativeElement elem = alt.head;
  82.     while ( elem!=null ) {
  83. if ( elem instanceof RuleRefElement ) {
  84.     RuleRefElement rr = (RuleRefElement)elem;
  85.     RuleSymbol rs = (RuleSymbol)g.getSymbol(rr.targetRule);
  86.     if ( rs==null ) {
  87. grammar.tool.error("rule "+rr.targetRule+" referenced in (...)=>, but not defined");
  88.     }
  89.     else {
  90. rs.references.removeElement(rr);
  91.     }
  92. }
  93. else if ( elem instanceof AlternativeBlock ) {// recurse into subrules
  94.     ((AlternativeBlock)elem).removeTrackingOfRuleRefs(g);
  95. }
  96. elem = elem.next;
  97.     }
  98. }
  99.     }
  100.     public void setAlternatives(Vector v) {
  101. alternatives = v;
  102.     }
  103.     public void setAutoGen(boolean doAutoGen_) {
  104. doAutoGen = doAutoGen_;
  105.     }
  106.     public void setInitAction(String initAction_) {
  107. initAction = initAction_;
  108.     }
  109.     public void setLabel(String label_) { 
  110. label = label_; 
  111.     }
  112.     public void setOption(Token key, Token value) {
  113. if (key.getText().equals("warnWhenFollowAmbig")) {
  114.     if (value.getText().equals("true")) {
  115. warnWhenFollowAmbig = true;
  116.     } else if (value.getText().equals("false")) {
  117. warnWhenFollowAmbig = false;
  118.     } else {
  119. grammar.tool.error("Value for warnWhenFollowAmbig must be true or false", grammar.getFilename(), key.getLine());
  120.     }
  121. }
  122. else if (key.getText().equals("generateAmbigWarnings")) {
  123.     if (value.getText().equals("true")) {
  124. generateAmbigWarnings = true;
  125.     } else if (value.getText().equals("false")) {
  126. generateAmbigWarnings = false;
  127.     } else {
  128. grammar.tool.error("Value for generateAmbigWarnings must be true or false", grammar.getFilename(), key.getLine());
  129.     }
  130. else if (key.getText().equals("greedy")) {
  131.     if (value.getText().equals("true")) {
  132. greedy = true;
  133. greedySet = true;
  134.     } else if (value.getText().equals("false")) {
  135. greedy = false;
  136. greedySet = true;
  137.     } else {
  138. grammar.tool.error("Value for greedy must be true or false", grammar.getFilename(), key.getLine());
  139.     }
  140. else {
  141.     grammar.tool.error("Invalid subrule option: " + key.getText(), grammar.getFilename(), key.getLine());
  142. }
  143.     }
  144.     public String toString() {
  145. String s=" (";
  146. if ( initAction!=null ) {
  147.     s += initAction;
  148. }
  149. for (int i=0; i<alternatives.size(); i++) {
  150.     Alternative alt = getAlternativeAt(i);
  151.     AlternativeElement p = alt.head;
  152.     String pred = alt.semPred;
  153.     if ( pred!=null ) {
  154. s += pred;
  155.     }
  156.     while (p!=null ) {
  157. s += p;
  158. p = p.next;
  159.     }
  160.     if ( i<(alternatives.size()-1) ) {
  161. s += " |";
  162.     }
  163. }
  164. s += " )";
  165. return s;
  166.     }
  167. }