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

编译器/解释器

开发平台:

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/Rule.java#1 $
  7.  */
  8. import antlr.collections.impl.IndexedVector;
  9. import java.util.Hashtable;
  10. import java.util.Enumeration;
  11. class Rule {
  12. protected String name;
  13. protected String block;
  14. protected String args;
  15. protected String returnValue;
  16. protected String initAction;
  17.    protected IndexedVector options;
  18. protected String visibility;
  19. protected Grammar enclosingGrammar;
  20. protected boolean bang = false;
  21. public Rule(String n, String b, IndexedVector options, Grammar gr) {
  22. name = n;
  23. block = b;
  24. this.options = options;
  25. setEnclosingGrammar(gr);
  26. }
  27. public String getArgs() { return args; }
  28. public boolean getBang() { return bang; }
  29. public String getName() { return name; }
  30. public String getReturnValue() { return returnValue; }
  31. public String getVisibility() { return visibility; }
  32. /** If 'rule' narrows the visible of 'this', return true;
  33.  *  For example, 'this' is public and 'rule' is private,
  34.  *  true is returned.  You cannot narrow the vis. of
  35.  *  a rule.
  36.  */
  37. public boolean narrowerVisibility(Rule rule) {
  38. if ( visibility.equals("public") ) {
  39. if ( !rule.equals("public") ) {
  40. return true; // everything narrower than public
  41. }
  42. return false;
  43. }
  44. else if ( visibility.equals("protected") ) {
  45. if ( rule.equals("private") ) {
  46. return true; // private narrower than protected
  47. }
  48. return false;
  49. }
  50. else if ( visibility.equals("private") ) {
  51. return false; // nothing is narrower than private
  52. }
  53. return false;
  54. }
  55. /** Two rules have the same signature if they have:
  56.  *   same name
  57.  * same return value
  58.  * same args
  59.  * I do a simple string compare now, but later
  60.  * the type could be pulled out so it is insensitive
  61.  * to names of args etc...
  62.  */
  63. public boolean sameSignature(Rule rule) {
  64. boolean nSame=true;
  65. boolean aSame=true;
  66. boolean rSame=true;
  67. nSame = name.equals(rule.getName());
  68. if ( args!=null ) {
  69. aSame = args.equals(rule.getArgs());
  70. }
  71. if ( returnValue!=null ) {
  72. rSame = returnValue.equals(rule.getReturnValue());
  73. }
  74. return nSame && aSame && rSame;
  75. }
  76. public void setArgs(String a) { args=a; }
  77. public void setBang() {bang=true;}
  78. public void setEnclosingGrammar(Grammar g) { enclosingGrammar=g; }
  79. public void setInitAction(String a) {initAction = a;}
  80. public void setOptions(IndexedVector options) {
  81. this.options = options;
  82. }
  83. public void setReturnValue(String ret) { returnValue=ret; }
  84. public void setVisibility(String v) { visibility=v; }
  85. public String toString() {
  86. String s="";
  87. String retString = returnValue==null ? "" : "returns "+returnValue;
  88. String argString = args==null ? "" : args;
  89. String bang = getBang() ? "!" : "";
  90. s += visibility==null ? "" : visibility+" ";
  91. s += name+bang+argString+" "+retString;
  92. if ( options!=null ) {
  93. s += System.getProperty("line.separator")+
  94.  "options {"+
  95.  System.getProperty("line.separator");
  96. for (Enumeration e = options.elements() ; e.hasMoreElements() ;) {
  97. s += (Option)e.nextElement()+System.getProperty("line.separator");
  98. }
  99. s += "}"+System.getProperty("line.separator");
  100. }
  101. if ( initAction!=null ) {
  102. s+=initAction+System.getProperty("line.separator");
  103. }
  104. s += block;
  105. return s;
  106. }
  107. }