Guest User

Untitled

a guest
May 24th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.78 KB | None | 0 0
  1. /*------------------------------------------------------------------------*/
  2. Stat (. int type,type1,type2; string name; Obj obj;
  3. string name2; Obj obj2;
  4. int adr, adr2, loopstart;
  5. int loopUpdate; .)
  6. = Ident<out name> (. obj = tab.Find(name); .)
  7. ( '=' (. if (obj.kind != var) SemErr("cannot assign to procedure or constant");
  8. if (obj.size != 1) SemErr("Array index expected");
  9. .)
  10. Expr<out type> ([';']
  11. (. if (type != obj.type) SemErr("incompatible types");
  12. if (obj.level == 0) gen.Emit(Op.STOG, obj.adr);
  13. else gen.Emit(Op.STO, obj.adr); .)
  14. | /*Code for conditional assignment here. The same as the If statement below
  15. except for the store instructions after the jump instructions */
  16. (. if(type != boolean) SemErr("Boolean expression expected");
  17. gen.Emit(Op.FJMP, 0); adr = gen.pc -2;
  18. if (obj.level == 0) gen.Emit(Op.STOG, obj.adr);
  19. else gen.Emit(Op.STO, obj.adr); .)
  20. '?'Expr<out type1> ':'
  21. (. gen.Emit(Op.JMP,0); adr2 = gen.pc -2;
  22. gen.Patch(adr,gen.pc); adr = adr2;
  23. if (obj.level == 0) gen.Emit(Op.STOG, obj.adr);
  24. else gen.Emit(Op.STO, obj.adr);
  25. .)
  26. Expr<out type2>';'
  27. (. gen.Patch(adr, gen.pc); .)
  28.  
  29. )
  30. |
  31. '('
  32. ')'
  33. ';' (. if (obj.kind != proc) SemErr("Expected procedure");
  34. gen.Emit(Op.CALL, obj.adr); .)
  35. | //Array reference
  36. '['
  37. ( Ident<out name> (. obj2 = tab.Find(name); //obj2 is index, obj is array start
  38. if(obj.type != integer) SemErr("Expected integer as index");
  39.  
  40. .)
  41.  
  42.  
  43. ']'
  44. '=' (. if(obj.level == 0) gen.Emit(Op.LOADG, obj2.adr);
  45. else gen.Emit(Op.LOAD, obj2.adr); .)
  46. Expr<out type1>
  47. ';' (. if(type1 != obj.type) SemErr("incompatible types");
  48.  
  49. // gen.Emit(Op.ADD);
  50. gen.Emit(Op.STO, obj.adr);
  51. .)
  52. | number (. adr = Convert.ToInt32(t.val);
  53. if(adr < 0 || adr > obj.size) SemErr("Array index out of bounds");.)
  54. ']'
  55. '='
  56. Expr<out type1>
  57. ';' (. gen.Emit(Op.STO, obj.adr + adr); .)
  58. )
  59. )
  60.  
  61. | "switch" //Sperate code needed fror number
  62. '('
  63. Ident<out name> (. obj = tab.Find(name); adr2 = 0;
  64. ArrayList jumps = new ArrayList();
  65. if(obj.type != integer) SemErr("Integer type expected");
  66. if(obj.level == 0) gen.Emit(Op.LOADG, obj.adr);
  67. else gen.Emit(Op.LOAD, obj.adr);
  68. .)
  69. ')'
  70. '{'
  71. "case"
  72. Expr<out type> (. if(type != obj.type) SemErr("Incompatible types in case");
  73. gen.Emit(Op.EQU);
  74. gen.Emit(Op.FJMP, 0); adr = gen.pc -2;
  75. .)
  76. ':'
  77. Stat
  78. [ "break;" (. gen.Emit(Op.JMP, 0); adr2 = 1; //Record a break has been used
  79. jumps.Add((gen.pc -2));
  80. .)
  81. ]
  82.  
  83. {
  84. "case" (. gen.Patch(adr, gen.pc);
  85. if(obj.level == 0) gen.Emit(Op.LOADG, obj.adr);
  86. else gen.Emit(Op.LOAD, obj.adr);
  87. .)
  88. Expr<out type> (. if(type != obj.type) SemErr("Incompatible types in case");
  89. gen.Emit(Op.EQU);
  90. gen.Emit(Op.FJMP, 0); adr = gen.pc -2;.)
  91. ':'
  92. Stat
  93. [ "break;" (. gen.Emit(Op.JMP, 0); adr2 =1; jumps.Add((gen.pc -2));
  94. .)
  95. ]
  96. }
  97. {
  98. "default:" (. gen.Patch(adr, gen.pc); .)
  99. Stat
  100. ["break;" ]
  101. }
  102. '}' (.
  103. gen.Patch(adr, gen.pc);
  104. if(adr2 != 0){
  105. foreach(int i in jumps){
  106. gen.Patch(i, gen.pc);
  107. }
  108. }
  109. .)
  110. | "if"
  111. '('
  112. Expr<out type>
  113. ')' (. if (type != boolean) SemErr("Expected boolean");
  114. gen.Emit(Op.FJMP, 0); adr = gen.pc - 2; .)
  115. Stat
  116. [ "else" (. gen.Emit(Op.JMP, 0); adr2 = gen.pc - 2;
  117. gen.Patch(adr, gen.pc); // Update the bool-check failure address
  118. adr = adr2; .)
  119. Stat
  120. ] (. gen.Patch(adr, gen.pc); .)
  121.  
  122. | "while" (. loopstart = gen.pc; .)
  123. '('
  124. Expr<out type>
  125. ')' (. if (type != boolean) SemErr("boolean type expected");
  126. gen.Emit(Op.FJMP, 0); adr = gen.pc - 2; .)
  127. Stat (. gen.Emit(Op.JMP, loopstart); gen.Patch(adr, gen.pc); .)
  128.  
  129. | "do" (. loopstart = gen.pc; .)
  130. Stat
  131. "while"
  132. '('
  133. Expr<out type>
  134. ')' (. if(type != boolean) SemErr("Boolean type expected");
  135. gen.Emit(Op.FJMP, 0); adr = gen.pc -2;
  136. gen.Emit(Op.JMP, loopstart);
  137. gen.Patch(adr, gen.pc); .)
  138.  
  139.  
  140. | "read"
  141. Ident<out name>
  142. ';' (. obj = tab.Find(name);
  143. if (obj.type != integer) SemErr("integer type expected");
  144. gen.Emit(Op.READ);
  145. if (obj.level == 0) gen.Emit(Op.STOG, obj.adr);
  146. else gen.Emit(Op.STO, obj.adr); .)
  147.  
  148. | "write"
  149. Expr<out type>
  150. ';' (.if (type == integer) gen.Emit(Op.WRITE);
  151. else if(type == character) gen.Emit(Op.WRITEC);
  152. else SemErr("integer or character type expected");
  153. .)
  154.  
  155. | "for"
  156. '('Stat (. loopstart = gen.pc; .)
  157. Expr<out type>
  158. ';' (. if(type != boolean) SemErr("boolean type expected");
  159. gen.Emit(Op.FJMP, 0); adr = gen.pc -2; //Jump if check fails
  160. gen.Emit(Op.JMP, 0); adr2 = gen.pc -2; //Jump to loop body
  161. loopUpdate = gen.pc; .) //Label loop update
  162. Stat (. gen.Emit(Op.JMP, loopstart); .) //Jump to start after update
  163. ')' (. gen.Patch(adr2, gen.pc); .)
  164. Stat (. gen.Emit(Op.JMP, loopUpdate); gen.Patch(adr, gen.pc); .) //Jump to update after body
  165.  
  166. | '{' { Stat | VarDecl | ConstDecl } '}' .
Add Comment
Please, Sign In to add comment