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

编译器/解释器

开发平台:

Others

  1. package tinybasic;
  2. import java.util.*;
  3. public class Context {
  4.  protected Scope theGlobalScope=null;
  5.  protected Scope theProgramScope=null;
  6.  protected Stack theScopeStack;
  7.      Hashtable subroutineTable;
  8.      Hashtable functionTable;
  9.  
  10.   public Context(){
  11.   theGlobalScope=new GlobalScope(null);
  12.   theScopeStack=new Stack();
  13. theScopeStack.push(theGlobalScope);
  14. subroutineTable = new Hashtable();
  15. functionTable = new Hashtable();
  16.   }
  17.     
  18. void insertSubroutine(String v,DTCodeType t){
  19.     subroutineTable.put(v.toLowerCase(),t);
  20. }
  21. public DTCodeType  getSubroutine(String v){
  22. DTCodeType t=(DTCodeType)subroutineTable.get(v.toLowerCase());
  23. return t;
  24. }
  25. void insertFunction(String v,DTCodeType t){
  26.     functionTable.put(v.toLowerCase(),t);
  27. }
  28. public DTCodeType  getFunction(String v){
  29. DTCodeType t=(DTCodeType)functionTable.get(v.toLowerCase());
  30. return t;
  31. }
  32.   void insertGlobalVariable(String v,DTDataType t){
  33.     theGlobalScope.insertVariable(v,t);
  34. }
  35.  
  36.   void insertVariable(String v,DTDataType t){
  37.    getCurrentScope().insertVariable(v,t);
  38. }
  39. public DTDataType  getVariable(String var){
  40. DTDataType t=getCurrentScope().getVariable(var);
  41. if(t==null){
  42. t=theGlobalScope.getVariable(var);
  43. }
  44. return t;
  45. }
  46. public int getVariableDimension(String var){
  47. int dim=0;
  48. dim=getCurrentScope().getVariableDimension(var);
  49. if(dim==0){
  50. dim=theGlobalScope.getVariableDimension(var);
  51. }
  52. return dim;
  53. }
  54. public int getVariableType(String var){
  55. DTDataType t=null;
  56. t=getCurrentScope().getVariable(var);
  57. if(t==null){
  58. t=theGlobalScope.getVariable(var);
  59. }
  60.     
  61. if(t!=null){
  62. return t.getType();
  63.      } else {
  64. return 0;
  65.     }
  66. }
  67. public boolean isArrayVariable(String s){
  68.     return (getVariableDimension(s) > 0);
  69. }
  70. public Scope getPrev(){
  71. return getCurrentScope().getPrev();
  72. }
  73. public void pushScope(Scope scope){
  74. theScopeStack.push(scope);
  75. }
  76. public Scope popScope(){
  77. if( getCurrentScope() == theGlobalScope ){
  78. return theGlobalScope;
  79. } else {
  80. return (Scope)theScopeStack.pop();
  81. }
  82. }
  83. public Scope getCurrentScope(){
  84. return ((Scope)theScopeStack.peek());
  85. }
  86. public Scope getGlobalScope(){
  87. return theGlobalScope;
  88. }
  89. public void setProgramScope(Scope scope){
  90.     theProgramScope=scope;
  91.     while((Scope)theScopeStack.peek()!=theGlobalScope){
  92. theScopeStack.pop();
  93.     }
  94.     theScopeStack.push(theProgramScope);
  95. }
  96. protected Scope getProgramScope(){
  97.     return theProgramScope;
  98. }
  99. public void setDimension(String s,DTDataType i1){
  100.     DTDataType v=getVariable(s);
  101.     v.setDimension(i1.getInteger());
  102. }
  103. public void initialize(){
  104.     setProgramScope(getProgramScope());
  105. }
  106. public void setDimension(String s,DTDataType i1,DTDataType i2){
  107.     DTDataType v=getVariable(s);
  108.     v.setDimension(i1.getInteger(),i2.getInteger());
  109. }
  110. public void setDimension(String s,DTDataType i1,DTDataType i2,DTDataType i3){
  111.     DTDataType v=getVariable(s);
  112.     v.setDimension(i1.getInteger(),i2.getInteger(),i3.getInteger());
  113. }
  114. public DTDataType getDTDataType(String s,DTDataType i1){
  115.     DTDataType t=getVariable(s);
  116.     return t.getDTDataType(i1);
  117. }
  118. public DTDataType getDTDataType(String s,DTDataType i1,DTDataType i2){
  119.     DTDataType t=getVariable(s);
  120.     return t.getDTDataType(i1,i2);
  121. }
  122. public DTDataType getDTDataType(String s,DTDataType i1,DTDataType i2,DTDataType i3){
  123.     DTDataType t=getVariable(s);
  124.     return t.getDTDataType(i1,i2,i3);
  125. }
  126. public DTDataType ensureVariable(String s,int t){
  127.     DTDataType v = getVariable(s);
  128.     if(v==null){
  129. v=DTDataType.getOne(t,getCurrentScope());
  130. insertVariable(s,v);
  131.     }
  132.     return v;
  133. }
  134.     
  135. //public boolean isArrayVariable(String s){
  136. //    if(getCurrentScope().isArrayVariable(s){
  137. // return true;
  138. //    } else {
  139. // return theGlobalScope.isArrayVariable(s);
  140. //}
  141. //}
  142. }