Guest User

Untitled

a guest
Oct 23rd, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.67 KB | None | 0 0
  1. package visitor;
  2.  
  3. import java.io.PrintWriter;
  4. import absyn.*;
  5. import table.*;
  6. import types.ArrayType;
  7. import types.PrimitiveType;
  8. import types.Type;
  9. import codegen.*;
  10.  
  11. public class CodegenVisitor extends DoNothingVisitor {
  12.  
  13. int nextReg;
  14. Table symTab;
  15. int label;
  16. static PrintWriter outWriter;
  17.  
  18. public CodegenVisitor(int reg, Table t, PrintWriter ow) {
  19. nextReg = reg;
  20. symTab = t;
  21. outWriter = ow;
  22. }
  23.  
  24. CodegenVisitor(int reg, Table t, int Label) {
  25. this(reg, t, outWriter);
  26. this.label = Label;
  27. }
  28.  
  29. public CodegenVisitor() {
  30. // TODO Auto-generated constructor stub
  31. }
  32.  
  33. @Override
  34. public void visit(ArrayTy arrayTy) {
  35. outWriter.format("; ArrayTy \n");
  36. }
  37.  
  38. @Override
  39. public void visit(ArrayVar arrayVar) {
  40. arrayVar.var.accept(this);
  41. SimpleVar sVar = (SimpleVar) varNameFinden(arrayVar.var);
  42. VarEntry vEnt = (VarEntry) symTab.lookup(sVar.name);
  43.  
  44. arrayVar.index
  45. .accept(new CodegenVisitor(nextReg + 1, symTab, outWriter));
  46. ArrayType aType = (ArrayType) vEnt.type;
  47. emitrrs("add", nextReg + 2, 0, aType.size,
  48. " ArrayVar: Arraygroeße in Reg. " + (nextReg + 2)
  49. + " schreiben.");
  50. emitrrb("bgeu", nextReg + 1, nextReg + 2, "_indexError",
  51. " ArrayVar: Indexcheck. ");
  52. emitrrs("mul", nextReg + 1, nextReg + 1, 4,
  53. " ArrayVar: Index mit 4 multiplizieren und in " + (nextReg + 1)
  54. + " schreiben.");
  55. emitrrr("add", nextReg, nextReg, nextReg + 1,
  56. " ArrayVar: Schreibt korrekte Adresse des Elements in Reg."
  57. + nextReg);
  58. }
  59.  
  60. @Override
  61. public void visit(AssignStm assignStm) {
  62. assignStm.var.accept(this);
  63. assignStm.exp
  64. .accept(new CodegenVisitor(nextReg + 1, symTab, outWriter));
  65. emitrrs("stw", nextReg + 1, nextReg, 0,
  66. "AssignStm: Schreiben des Wertes aus " + (nextReg + 1)
  67. + " in Register " + nextReg);
  68. nextReg--;
  69. }
  70.  
  71. @Override
  72. public void visit(CallStm callStm) {
  73. callStm.args.accept(this);
  74. }
  75.  
  76. @Override
  77. public void visit(CompStm compStm) {
  78. compStm.stms.accept(this);
  79. }
  80.  
  81. @Override
  82. public void visit(DecList decList) {
  83. decList.head.accept(this);
  84. if (decList.tail.isEmpty == false) {
  85. decList.tail.accept(new CodegenVisitor(nextReg + 1, symTab,
  86. outWriter));
  87. // TODO: Wirklich neuen Codegenvis aufrufen?
  88. }
  89. outWriter.format("; DecList \n");
  90. }
  91.  
  92. @Override
  93. public void visit(EmptyStm emptyStm) {
  94. outWriter.format("; EmptyStm \n");
  95.  
  96. }
  97.  
  98. @Override
  99. public void visit(ExpList expList) {
  100. expList.head.accept(this);
  101. if (expList.tail.isEmpty == false) {
  102. expList.tail.accept(new CodegenVisitor(nextReg + 1, symTab,
  103. outWriter));
  104. }
  105. outWriter.format("; ExpList \n");
  106. }
  107.  
  108. @Override
  109. public void visit(IfStm ifStm) {
  110. ifStm.test.accept(this);
  111. OpExp opExp = (OpExp) ifStm.test;
  112.  
  113. switch (opExp.op) {
  114.  
  115. case OpExp.EQU:
  116. emitrrb("bne", nextReg, nextReg + 1, " Baustelle : Label0 ",
  117. "OpExp: gleich");
  118. break;
  119. case OpExp.LST:
  120. emitrrb("bge", nextReg, nextReg + 1, " Baustelle : Label0 ",
  121. "OpExp: kleiner");
  122. break;
  123. case OpExp.LSE:
  124. emitrrb("bgt", nextReg, nextReg + 1, " Baustelle : Label0 ",
  125. "OpExp: kleiner-gleich");
  126. break;
  127. case OpExp.GRT:
  128. emitrrb("ble", nextReg, nextReg + 1, " Baustelle : Label0 ",
  129. "OpExp: größer");
  130. break;
  131. case OpExp.GRE:
  132. emitrrb("blt", nextReg, nextReg + 1, " Baustelle : Label0 ",
  133. "OpExp: größer-gleich");
  134. break;
  135. case OpExp.NEQ:
  136. emitrrb("beq", nextReg, nextReg + 1, " Baustelle : Label0 ",
  137. "OpExp: größer-gleich");
  138. break;
  139. }
  140. ifStm.thenPart.accept(this);
  141. // TODO Baustelle : Hier noch Label einfügen: L1
  142. ifStm.elsePart.accept(this);
  143. }
  144.  
  145. @Override
  146. public void visit(IntExp intExp) {
  147. emitrrs("add", nextReg, 0, intExp.val, " IntExp : " + intExp.val);
  148. }
  149.  
  150. @Override
  151. public void visit(NameTy nameTy) {
  152. outWriter.format("; NameTy \n");
  153.  
  154. }
  155.  
  156. @Override
  157. public void visit(OpExp opExp) {
  158. opExp.left.accept(this);
  159. opExp.right.accept(new CodegenVisitor(nextReg + 1, symTab, outWriter));
  160.  
  161. switch (opExp.op) {
  162.  
  163. case OpExp.ADD:
  164. emitrrr("add", nextReg, nextReg, nextReg + 1, "OpExp: add");
  165. break;
  166. case OpExp.SUB:
  167. emitrrr("sub", nextReg, nextReg, nextReg + 1, "OpExp: sub");
  168. break;
  169. case OpExp.MUL:
  170. emitrrr("mul", nextReg, nextReg, nextReg + 1, "OpExp: mul");
  171. break;
  172. case OpExp.DIV:
  173. emitrrr("div", nextReg, nextReg, nextReg + 1, "OpExp: div");
  174. break;
  175. case OpExp.EQU:
  176. // emitrrr("equ", nextReg, nextReg, nextReg + 1, "OpExp: gleich");
  177. break;
  178. case OpExp.LST:
  179. // emitrrr("equ", nextReg, nextReg, nextReg + 1, "OpExp: kleiner");
  180. break;
  181. case OpExp.LSE:
  182. // emitrrr("equ", nextReg, nextReg, nextReg + 1,
  183. // "OpExp: kleiner-gleich");
  184. break;
  185. case OpExp.GRT:
  186. // emitrrr("equ", nextReg, nextReg, nextReg + 1, "OpExp: größer");
  187. break;
  188. case OpExp.GRE:
  189. // emitrrr("equ", nextReg, nextReg, nextReg + 1,
  190. // "OpExp: größer-gleich");
  191. break;
  192. case OpExp.NEQ:
  193. // emitrrr("equ", nextReg, nextReg, nextReg + 1, "OpExp: ungleich");
  194. break;
  195. }
  196. }
  197.  
  198. @Override
  199. public void visit(ParDec parDec) {
  200. outWriter.format("; ParDec \n");
  201.  
  202. }
  203.  
  204. @Override
  205. public void visit(ProcDec procDec) {
  206. ProcEntry pE = (ProcEntry) symTab.lookup(procDec.name);
  207. Table lokTab = pE.localTable;
  208.  
  209. outWriter.format(procDec.name.toString() + ":\n");
  210. // Prolog:
  211. emitrrs("sub", 29, 29, pE.groeßeLokVars + 4, " Prolog: Frame aufbauen");
  212. // TODO pE.groeßeLokVars+4 korrekt?
  213. emitrrs("stw", 25, 29, 0, " Prolog: Framepointer sichern");
  214. emitrrs("add", 25, 29, pE.groeßeLokVars + 4,
  215. " Prolog: Framepointer neu setzen");
  216. // Prolog Ende
  217. if (procDec.body.isEmpty != true) {
  218. procDec.body.accept(new CodegenVisitor(nextReg, lokTab, outWriter));
  219. }
  220.  
  221. // Epilog:
  222. emitrrs("ldw", 25, 29, 0,
  223. " Epilog: Alten Framepointer wieder herstellen");
  224. emitrrs("add", 29, 29, pE.groeßeLokVars + 4, " Epilog: Frame abbauen");
  225. outWriter.format("jr $31 ; return zur Rücksprungadresse \n");
  226. outWriter.format("; ProcDec \n");
  227. }
  228.  
  229. @Override
  230. public void visit(SimpleVar simpleVar) {
  231. VarEntry vEnt = (VarEntry) symTab.lookup(simpleVar.name);
  232. int offset = -vEnt.offsetSize;
  233. emitrrs("add", nextReg, 25, offset, " SimpleVar");
  234. }
  235.  
  236. @Override
  237. public void visit(StmList stmList) {
  238. stmList.head.accept(this);
  239. if (stmList.tail.isEmpty == false) {
  240. stmList.tail.accept(new CodegenVisitor(nextReg + 1, symTab,
  241. outWriter));
  242. }
  243.  
  244. outWriter.format("; StmList \n");
  245. }
  246.  
  247. @Override
  248. public void visit(TypeDec typeDec) {
  249. outWriter.format("; TypeDec \n");
  250.  
  251. }
  252.  
  253. @Override
  254. public void visit(VarDec varDec) {
  255. outWriter.format("; VarDec \n");
  256. }
  257.  
  258. @Override
  259. public void visit(VarExp varExp) {
  260. varExp.var.accept(this);
  261. emitrrs("ldw", nextReg, nextReg, 0,
  262. "VarExp: Ablegen des Wertes an Adresse " + (nextReg + 1));
  263. }
  264.  
  265. @Override
  266. public void visit(WhileStm whileStm) {
  267. whileStm.test.accept(this);
  268. OpExp opExp = (OpExp) whileStm.test;
  269.  
  270. switch (opExp.op) {
  271.  
  272. case OpExp.EQU:
  273. emitrrb("bne", nextReg, nextReg + 1, " Baustelle : Label1 ",
  274. "OpExp: gleich");
  275. break;
  276. case OpExp.LST:
  277. emitrrb("bge", nextReg, nextReg + 1, " Baustelle : Label1 ",
  278. "OpExp: kleiner");
  279. break;
  280. case OpExp.LSE:
  281. emitrrb("bgt", nextReg, nextReg + 1, " Baustelle : Label1 ",
  282. "OpExp: kleiner-gleich");
  283. break;
  284. case OpExp.GRT:
  285. emitrrb("ble", nextReg, nextReg + 1, " Baustelle : Label1 ",
  286. "OpExp: größer");
  287. break;
  288. case OpExp.GRE:
  289. emitrrb("blt", nextReg, nextReg + 1, " Baustelle : Label1 ",
  290. "OpExp: größer-gleich");
  291. break;
  292. case OpExp.NEQ:
  293. emitrrb("beq", nextReg, nextReg + 1, " Baustelle : Label1 ",
  294. "OpExp: größer-gleich");
  295. break;
  296. }
  297. whileStm.body.accept(this);
  298. // TODO Jump to Label 0
  299. }
  300.  
  301. private void emitrrs(String string, int nextReg2, int nextReg3, int i,
  302. String string2) {
  303. outWriter.format(string + " $" + nextReg2 + ",$" + nextReg3 + "," + i
  304. + " ; " + string2 + " \n");
  305. }
  306.  
  307. private void emitrrr(String string, int nextReg2, int nextReg3,
  308. int nextReg4, String string2) {
  309. outWriter.format(string + " $" + nextReg2 + ",$" + nextReg3 + ",$"
  310. + nextReg4 + " ; " + string2 + " \n");
  311. }
  312.  
  313. private void emitrrb(String string, int nextReg2, int nextReg3,
  314. String string2, String string3) {
  315. outWriter.format(string + " $" + nextReg2 + ",$" + nextReg3 + ","
  316. + string2 + " ; " + string3 + " \n");
  317. }
  318.  
  319. private Var varNameFinden(Var var) {
  320. SimpleVar sVar;
  321. ArrayVar aVar;
  322.  
  323. if (var instanceof ArrayVar) {
  324. aVar = (ArrayVar) var;
  325.  
  326. return varNameFinden(aVar.var);
  327. }
  328.  
  329. if (var instanceof SimpleVar) {
  330. sVar = (SimpleVar) var;
  331. return sVar;
  332. }
  333. return null;
  334. }
  335. }
Add Comment
Please, Sign In to add comment