Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package visitor;
- import java.io.PrintWriter;
- import absyn.*;
- import table.*;
- import types.ArrayType;
- import types.PrimitiveType;
- import types.Type;
- import codegen.*;
- public class CodegenVisitor extends DoNothingVisitor {
- int nextReg;
- Table symTab;
- int label;
- static PrintWriter outWriter;
- public CodegenVisitor(int reg, Table t, PrintWriter ow) {
- nextReg = reg;
- symTab = t;
- outWriter = ow;
- }
- CodegenVisitor(int reg, Table t, int Label) {
- this(reg, t, outWriter);
- this.label = Label;
- }
- public CodegenVisitor() {
- // TODO Auto-generated constructor stub
- }
- @Override
- public void visit(ArrayTy arrayTy) {
- outWriter.format("; ArrayTy \n");
- }
- @Override
- public void visit(ArrayVar arrayVar) {
- arrayVar.var.accept(this);
- SimpleVar sVar = (SimpleVar) varNameFinden(arrayVar.var);
- VarEntry vEnt = (VarEntry) symTab.lookup(sVar.name);
- arrayVar.index
- .accept(new CodegenVisitor(nextReg + 1, symTab, outWriter));
- ArrayType aType = (ArrayType) vEnt.type;
- emitrrs("add", nextReg + 2, 0, aType.size,
- " ArrayVar: Arraygroeße in Reg. " + (nextReg + 2)
- + " schreiben.");
- emitrrb("bgeu", nextReg + 1, nextReg + 2, "_indexError",
- " ArrayVar: Indexcheck. ");
- emitrrs("mul", nextReg + 1, nextReg + 1, 4,
- " ArrayVar: Index mit 4 multiplizieren und in " + (nextReg + 1)
- + " schreiben.");
- emitrrr("add", nextReg, nextReg, nextReg + 1,
- " ArrayVar: Schreibt korrekte Adresse des Elements in Reg."
- + nextReg);
- }
- @Override
- public void visit(AssignStm assignStm) {
- assignStm.var.accept(this);
- assignStm.exp
- .accept(new CodegenVisitor(nextReg + 1, symTab, outWriter));
- emitrrs("stw", nextReg + 1, nextReg, 0,
- "AssignStm: Schreiben des Wertes aus " + (nextReg + 1)
- + " in Register " + nextReg);
- nextReg--;
- }
- @Override
- public void visit(CallStm callStm) {
- callStm.args.accept(this);
- }
- @Override
- public void visit(CompStm compStm) {
- compStm.stms.accept(this);
- }
- @Override
- public void visit(DecList decList) {
- decList.head.accept(this);
- if (decList.tail.isEmpty == false) {
- decList.tail.accept(new CodegenVisitor(nextReg + 1, symTab,
- outWriter));
- // TODO: Wirklich neuen Codegenvis aufrufen?
- }
- outWriter.format("; DecList \n");
- }
- @Override
- public void visit(EmptyStm emptyStm) {
- outWriter.format("; EmptyStm \n");
- }
- @Override
- public void visit(ExpList expList) {
- expList.head.accept(this);
- if (expList.tail.isEmpty == false) {
- expList.tail.accept(new CodegenVisitor(nextReg + 1, symTab,
- outWriter));
- }
- outWriter.format("; ExpList \n");
- }
- @Override
- public void visit(IfStm ifStm) {
- ifStm.test.accept(this);
- OpExp opExp = (OpExp) ifStm.test;
- switch (opExp.op) {
- case OpExp.EQU:
- emitrrb("bne", nextReg, nextReg + 1, " Baustelle : Label0 ",
- "OpExp: gleich");
- break;
- case OpExp.LST:
- emitrrb("bge", nextReg, nextReg + 1, " Baustelle : Label0 ",
- "OpExp: kleiner");
- break;
- case OpExp.LSE:
- emitrrb("bgt", nextReg, nextReg + 1, " Baustelle : Label0 ",
- "OpExp: kleiner-gleich");
- break;
- case OpExp.GRT:
- emitrrb("ble", nextReg, nextReg + 1, " Baustelle : Label0 ",
- "OpExp: größer");
- break;
- case OpExp.GRE:
- emitrrb("blt", nextReg, nextReg + 1, " Baustelle : Label0 ",
- "OpExp: größer-gleich");
- break;
- case OpExp.NEQ:
- emitrrb("beq", nextReg, nextReg + 1, " Baustelle : Label0 ",
- "OpExp: größer-gleich");
- break;
- }
- ifStm.thenPart.accept(this);
- // TODO Baustelle : Hier noch Label einfügen: L1
- ifStm.elsePart.accept(this);
- }
- @Override
- public void visit(IntExp intExp) {
- emitrrs("add", nextReg, 0, intExp.val, " IntExp : " + intExp.val);
- }
- @Override
- public void visit(NameTy nameTy) {
- outWriter.format("; NameTy \n");
- }
- @Override
- public void visit(OpExp opExp) {
- opExp.left.accept(this);
- opExp.right.accept(new CodegenVisitor(nextReg + 1, symTab, outWriter));
- switch (opExp.op) {
- case OpExp.ADD:
- emitrrr("add", nextReg, nextReg, nextReg + 1, "OpExp: add");
- break;
- case OpExp.SUB:
- emitrrr("sub", nextReg, nextReg, nextReg + 1, "OpExp: sub");
- break;
- case OpExp.MUL:
- emitrrr("mul", nextReg, nextReg, nextReg + 1, "OpExp: mul");
- break;
- case OpExp.DIV:
- emitrrr("div", nextReg, nextReg, nextReg + 1, "OpExp: div");
- break;
- case OpExp.EQU:
- // emitrrr("equ", nextReg, nextReg, nextReg + 1, "OpExp: gleich");
- break;
- case OpExp.LST:
- // emitrrr("equ", nextReg, nextReg, nextReg + 1, "OpExp: kleiner");
- break;
- case OpExp.LSE:
- // emitrrr("equ", nextReg, nextReg, nextReg + 1,
- // "OpExp: kleiner-gleich");
- break;
- case OpExp.GRT:
- // emitrrr("equ", nextReg, nextReg, nextReg + 1, "OpExp: größer");
- break;
- case OpExp.GRE:
- // emitrrr("equ", nextReg, nextReg, nextReg + 1,
- // "OpExp: größer-gleich");
- break;
- case OpExp.NEQ:
- // emitrrr("equ", nextReg, nextReg, nextReg + 1, "OpExp: ungleich");
- break;
- }
- }
- @Override
- public void visit(ParDec parDec) {
- outWriter.format("; ParDec \n");
- }
- @Override
- public void visit(ProcDec procDec) {
- ProcEntry pE = (ProcEntry) symTab.lookup(procDec.name);
- Table lokTab = pE.localTable;
- outWriter.format(procDec.name.toString() + ":\n");
- // Prolog:
- emitrrs("sub", 29, 29, pE.groeßeLokVars + 4, " Prolog: Frame aufbauen");
- // TODO pE.groeßeLokVars+4 korrekt?
- emitrrs("stw", 25, 29, 0, " Prolog: Framepointer sichern");
- emitrrs("add", 25, 29, pE.groeßeLokVars + 4,
- " Prolog: Framepointer neu setzen");
- // Prolog Ende
- if (procDec.body.isEmpty != true) {
- procDec.body.accept(new CodegenVisitor(nextReg, lokTab, outWriter));
- }
- // Epilog:
- emitrrs("ldw", 25, 29, 0,
- " Epilog: Alten Framepointer wieder herstellen");
- emitrrs("add", 29, 29, pE.groeßeLokVars + 4, " Epilog: Frame abbauen");
- outWriter.format("jr $31 ; return zur Rücksprungadresse \n");
- outWriter.format("; ProcDec \n");
- }
- @Override
- public void visit(SimpleVar simpleVar) {
- VarEntry vEnt = (VarEntry) symTab.lookup(simpleVar.name);
- int offset = -vEnt.offsetSize;
- emitrrs("add", nextReg, 25, offset, " SimpleVar");
- }
- @Override
- public void visit(StmList stmList) {
- stmList.head.accept(this);
- if (stmList.tail.isEmpty == false) {
- stmList.tail.accept(new CodegenVisitor(nextReg + 1, symTab,
- outWriter));
- }
- outWriter.format("; StmList \n");
- }
- @Override
- public void visit(TypeDec typeDec) {
- outWriter.format("; TypeDec \n");
- }
- @Override
- public void visit(VarDec varDec) {
- outWriter.format("; VarDec \n");
- }
- @Override
- public void visit(VarExp varExp) {
- varExp.var.accept(this);
- emitrrs("ldw", nextReg, nextReg, 0,
- "VarExp: Ablegen des Wertes an Adresse " + (nextReg + 1));
- }
- @Override
- public void visit(WhileStm whileStm) {
- whileStm.test.accept(this);
- OpExp opExp = (OpExp) whileStm.test;
- switch (opExp.op) {
- case OpExp.EQU:
- emitrrb("bne", nextReg, nextReg + 1, " Baustelle : Label1 ",
- "OpExp: gleich");
- break;
- case OpExp.LST:
- emitrrb("bge", nextReg, nextReg + 1, " Baustelle : Label1 ",
- "OpExp: kleiner");
- break;
- case OpExp.LSE:
- emitrrb("bgt", nextReg, nextReg + 1, " Baustelle : Label1 ",
- "OpExp: kleiner-gleich");
- break;
- case OpExp.GRT:
- emitrrb("ble", nextReg, nextReg + 1, " Baustelle : Label1 ",
- "OpExp: größer");
- break;
- case OpExp.GRE:
- emitrrb("blt", nextReg, nextReg + 1, " Baustelle : Label1 ",
- "OpExp: größer-gleich");
- break;
- case OpExp.NEQ:
- emitrrb("beq", nextReg, nextReg + 1, " Baustelle : Label1 ",
- "OpExp: größer-gleich");
- break;
- }
- whileStm.body.accept(this);
- // TODO Jump to Label 0
- }
- private void emitrrs(String string, int nextReg2, int nextReg3, int i,
- String string2) {
- outWriter.format(string + " $" + nextReg2 + ",$" + nextReg3 + "," + i
- + " ; " + string2 + " \n");
- }
- private void emitrrr(String string, int nextReg2, int nextReg3,
- int nextReg4, String string2) {
- outWriter.format(string + " $" + nextReg2 + ",$" + nextReg3 + ",$"
- + nextReg4 + " ; " + string2 + " \n");
- }
- private void emitrrb(String string, int nextReg2, int nextReg3,
- String string2, String string3) {
- outWriter.format(string + " $" + nextReg2 + ",$" + nextReg3 + ","
- + string2 + " ; " + string3 + " \n");
- }
- private Var varNameFinden(Var var) {
- SimpleVar sVar;
- ArrayVar aVar;
- if (var instanceof ArrayVar) {
- aVar = (ArrayVar) var;
- return varNameFinden(aVar.var);
- }
- if (var instanceof SimpleVar) {
- sVar = (SimpleVar) var;
- return sVar;
- }
- return null;
- }
- }
Add Comment
Please, Sign In to add comment