RuleBlock.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/RuleBlock.java#1 $
  7.  */
  8. import antlr.collections.impl.Vector;
  9. import java.util.Hashtable;
  10. /**A list of alternatives and info contained in
  11.  * the rule definition.
  12.  */
  13. public class RuleBlock extends AlternativeBlock {
  14.     protected String ruleName;
  15.     protected String argAction = null; // string for rule arguments [...]
  16.     protected String returnAction = null;// string for rule return type(s) <...>
  17.     protected RuleEndElement endNode; // which node ends this rule?
  18.     // Generate literal-testing code for lexer rule?
  19.     protected boolean testLiterals=false;
  20.     Vector labeledElements; // List of labeled elements found in this rule
  21.     // This is a list of AlternativeElement (or subclass)
  22.     protected boolean[] lock; // for analysis; used to avoid infinite loops
  23.     // 1..k
  24.     protected Lookahead cache[];// Each rule can cache it's lookahead computation.
  25.     // This cache contains an epsilon
  26.     // imaginary token if the FOLLOW is required.  No
  27.     // FOLLOW information is cached here.
  28.     // The FIRST(rule) is stored in this cache; 1..k
  29.     // This set includes FIRST of all alts.
  30.     Hashtable exceptionSpecs; // table of String-to-ExceptionSpec.
  31.     // grammar-settable options
  32.     protected boolean defaultErrorHandler = true;
  33.     protected String  ignoreRule = null;
  34.     /** Construct a named rule. */
  35.     public RuleBlock(Grammar g, String r) {
  36. super(g);
  37. ruleName = r;
  38. labeledElements = new Vector();
  39. cache = new Lookahead[g.maxk+1];
  40. exceptionSpecs = new Hashtable();
  41. setAutoGen(g instanceof ParserGrammar);
  42.     }
  43.     /** Construct a named rule with line number information */
  44.     public RuleBlock(Grammar g, String r, int line, boolean doAutoGen_) {
  45. this(g,r);
  46. this.line = line;
  47. setAutoGen(doAutoGen_);
  48.     }
  49.     public void addExceptionSpec(ExceptionSpec ex) {
  50. if (findExceptionSpec(ex.label) != null) {
  51.     if (ex.label != null) {
  52. grammar.tool.error("Rule '" + ruleName + "' already has an exception handler for label: " + ex.label);
  53.     }
  54.     else {
  55. grammar.tool.error("Rule '" + ruleName + "' already has an exception handler");
  56.     }
  57. else {
  58.     exceptionSpecs.put( (ex.label==null ? "" : ex.label.getText()), ex);
  59. }
  60.     }
  61.     public ExceptionSpec findExceptionSpec(Token label) {
  62. return (ExceptionSpec)exceptionSpecs.get(label==null ? "" : label.getText());
  63.     }
  64.     public ExceptionSpec findExceptionSpec(String label) {
  65. return (ExceptionSpec)exceptionSpecs.get(label==null ? "" : label);
  66.     }
  67.     public void generate() {
  68. grammar.generator.gen(this);
  69.     }
  70.     public boolean getDefaultErrorHandler() { 
  71. return defaultErrorHandler;
  72.     }
  73.     public RuleEndElement getEndElement() {
  74. return endNode;
  75.     }
  76.     public String getIgnoreRule() {
  77. return ignoreRule;
  78.     }
  79.     public String getRuleName() {
  80. return ruleName;
  81.     }
  82.     public boolean getTestLiterals() {
  83. return testLiterals;
  84.     }
  85.     public boolean isLexerAutoGenRule() {
  86. return ruleName.equals("nextToken");
  87.     }
  88.     public Lookahead look(int k) {
  89. return grammar.theLLkAnalyzer.look(k, this);
  90.     }
  91.     public void prepareForAnalysis() {
  92. super.prepareForAnalysis();
  93. lock = new boolean[grammar.maxk+1];
  94.     }
  95.     // rule option values
  96.     public void setDefaultErrorHandler(boolean value) { 
  97. defaultErrorHandler = value;
  98.     }
  99.     public void setEndElement(RuleEndElement re) {
  100. endNode = re;
  101.     }
  102.     public void setOption(Token key, Token value) {
  103. if (key.getText().equals("defaultErrorHandler")) {
  104.     if (value.getText().equals("true")) {
  105. defaultErrorHandler = true;
  106.     } else if (value.getText().equals("false")) {
  107. defaultErrorHandler = false;
  108.     } else {
  109. grammar.tool.error("Value for defaultErrorHandler must be true or false", grammar.getFilename(), key.getLine());
  110.     }
  111. else if (key.getText().equals("testLiterals")) {
  112.     if (!(grammar instanceof LexerGrammar)) {
  113. grammar.tool.error("testLiterals option only valid for lexer rules", grammar.getFilename(), key.getLine());
  114.     }
  115.     else {
  116. if (value.getText().equals("true")) {
  117.     testLiterals = true;
  118. } else if (value.getText().equals("false")) {
  119.     testLiterals = false;
  120. } else {
  121.     grammar.tool.error("Value for testLiterals must be true or false", grammar.getFilename(), key.getLine());
  122. }
  123.     }
  124. }
  125. else if (key.getText().equals("ignore")) {
  126.     if (!(grammar instanceof LexerGrammar)) {
  127. grammar.tool.error("ignore option only valid for lexer rules", grammar.getFilename(), key.getLine());
  128.     }
  129.     else {
  130. ignoreRule = value.getText();
  131.     }
  132. else if (key.getText().equals("paraphrase")) {
  133.     if (!(grammar instanceof LexerGrammar)) {
  134. grammar.tool.error("paraphrase option only valid for lexer rules", grammar.getFilename(), key.getLine());
  135.     }
  136.     else {
  137. // find token def associated with this rule
  138. TokenSymbol ts = grammar.tokenManager.getTokenSymbol(ruleName);
  139. if ( ts==null ) {
  140.     antlr.Tool.panic("cannot find token associated with rule "+ruleName);
  141. }
  142. ts.setParaphrase(value.getText());
  143.     }
  144. else if (key.equals("generateAmbigWarnings")) {
  145.     if (value.getText().equals("true")) {
  146. generateAmbigWarnings = true;
  147.     } else if (value.getText().equals("false")) {
  148. generateAmbigWarnings = false;
  149.     } else {
  150. grammar.tool.error("Value for generateAmbigWarnings must be true or false", grammar.getFilename(), key.getLine());
  151.     }
  152. }
  153. else {
  154.     grammar.tool.error("Invalid rule option: " + key.getText(), grammar.getFilename(), key.getLine());
  155. }
  156.     }
  157.     public String toString() {
  158. return ruleName + ": " + super.toString() + " ;";
  159.     }
  160. }