Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.48 KB | None | 0 0
  1. package program;
  2.  
  3. public class Interp {
  4.  
  5. static class Table {
  6. String id; int value; Table tail;
  7. Table(String i, int v, Table t) { id=i; value=v; tail=t; }
  8.  
  9. Table update(String i, Table t, int v)
  10. {
  11. return new Table(i, v, t);
  12. }
  13.  
  14. int lookup(String key)
  15. {
  16. if(id == key) {
  17. return value;
  18. } else {
  19. return tail.lookup(key);
  20. }
  21. }
  22. }
  23.  
  24. static class IntAndTable
  25. {
  26. int i; Table t;
  27. IntAndTable(int i, Table t) { this.i = i; this.t = t; }
  28. static IntAndTable interpExp(Exp e, Table t)
  29. {
  30. if(e instanceof IdExp) {
  31. return new IntAndTable(t.lookup(((IdExp) e).id), t);
  32. } else if(e instanceof NumExp) {
  33. return new IntAndTable(((NumExp) e).num, t);
  34. } else if(e instanceof OpExp) {
  35. IntAndTable iat1 = interpExp(((OpExp) e).left, t);
  36. IntAndTable iat2 = interpExp(((OpExp) e).right, iat1.t);
  37. switch(((OpExp) e).oper) {
  38. case OpExp.Plus : new IntAndTable(iat1.i + iat2.i, iat2.t);
  39. case OpExp.Minus : new IntAndTable(iat2.i - iat2.i, iat2.t);
  40. case OpExp.Times : new IntAndTable(iat2.i * iat2.i, iat2.t);
  41. case OpExp.Div : new IntAndTable(iat2.i / iat2.i, iat2.t);
  42. }
  43. } else if(e instanceof EseqExp) {
  44. Table t1 = interpStm(((EseqExp) e).stm,t);
  45. return interpExp(((EseqExp) e).exp,t1);
  46. }
  47. return null;
  48. }
  49. }
  50.  
  51. static Table interpStm(Stm s, Table t)
  52. {
  53. if(s instanceof CompoundStm) {
  54. Table t1 = interpStm(((CompoundStm) s).stm1, t);
  55. return interpStm(((CompoundStm) s).stm2, t1);
  56. } else if(s instanceof AssignStm) {
  57. IntAndTable iat = IntAndTable.interpExp(((AssignStm) s).exp, t);
  58. return new Table(((AssignStm) s).id, iat.i, iat.t);
  59. } else if(s instanceof PrintStm) {
  60. return interpExpList(((PrintStm) s).exps,t);
  61. }
  62. return null;
  63. }
  64.  
  65. static Table interpExpList(ExpList l, Table t)
  66. {
  67. if(l instanceof PairExpList) {
  68. IntAndTable iat = IntAndTable.interpExp(((PairExpList) l).head, t);
  69. System.out.println(iat.i + " ");
  70. return interpExpList(((PairExpList) l).tail, iat.t);
  71. } else if(l instanceof LastExpList) {
  72. IntAndTable iat = IntAndTable.interpExp(((LastExpList) l).head, t);
  73. System.out.println(iat.i);
  74. return iat.t;
  75. }
  76. return null;
  77. }
  78.  
  79. static void interp(Stm s)
  80. {
  81. interpStm(s,null);
  82. }
  83.  
  84. static int maxargs(Stm s)
  85. {
  86. if(s instanceof CompoundStm) {
  87. int s1 = maxargs(((CompoundStm) s).stm1);
  88. int s2 = maxargs(((CompoundStm) s).stm2);
  89. return s1 > s2 ? s1 : s2;
  90. } else if(s instanceof AssignStm) {
  91. return maxargs(((AssignStm) s).exp);
  92. } else if(s instanceof PrintStm) {
  93. return maxargs(((PrintStm) s).exps, 0);
  94. }
  95. return 0;
  96. }
  97.  
  98. static int maxargs(Exp e)
  99. {
  100. if(e instanceof IdExp){
  101. return 0;
  102. } else if(e instanceof NumExp){
  103. return 0;
  104. } else if(e instanceof OpExp) {
  105. int e1 = maxargs(((OpExp) e).left);
  106. int e2 = maxargs(((OpExp) e).right);
  107. return e1 > e2 ? e1 : e2;
  108. } else if(e instanceof EseqExp) {
  109. int s = maxargs(((EseqExp) e).stm);
  110. int exp = maxargs(((EseqExp) e).exp);
  111. return s > exp ? s : exp;
  112. }
  113. return 0;
  114. }
  115.  
  116. static int maxargs(ExpList l, int count)
  117. {
  118. if(l instanceof PairExpList) {
  119. int exp = maxargs(((PairExpList) l).head);
  120. int expList = maxargs(((PairExpList) l).tail, count+1);
  121. return exp > expList ? exp : expList;
  122. } else if(l instanceof LastExpList) {
  123. return count + 1;
  124. }
  125. return 0;
  126. }
  127.  
  128. public static void main(String args[]) {
  129. System.out.println(maxargs(Prog.prog));
  130. interp(Prog.prog);
  131. }
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement