diff --git a/Triangle.AbstractMachine.Disassembler/src/main/java/Triangle/AbstractMachine/Disassembler.java b/Triangle.AbstractMachine.Disassembler/src/main/java/Triangle/AbstractMachine/Disassembler.java index aa71b4c..0cf8ff6 100644 --- a/Triangle.AbstractMachine.Disassembler/src/main/java/Triangle/AbstractMachine/Disassembler.java +++ b/Triangle.AbstractMachine.Disassembler/src/main/java/Triangle/AbstractMachine/Disassembler.java @@ -50,62 +50,18 @@ public class Disassembler { * @param r the number of the register. * @param rightbracket the character to print after the register. */ - private static void writeR(char leftbracket, int r, char rightbracket) { + private static void writeR(char leftbracket, Register r, char rightbracket) { System.out.print(leftbracket); - switch (r) { - case Machine.CBr: - System.out.print("CB"); - break; - case Machine.CTr: - System.out.print("CT"); - break; - case Machine.PBr: - System.out.print("PB"); - break; - case Machine.PTr: - System.out.print("PT"); - break; - case Machine.SBr: - System.out.print("SB"); - break; - case Machine.STr: - System.out.print("ST"); - break; - case Machine.HBr: - System.out.print("HB"); - break; - case Machine.HTr: - System.out.print("HT"); - break; - case Machine.LBr: - System.out.print("LB"); - break; - case Machine.L1r: - System.out.print("L1"); - break; - case Machine.L2r: - System.out.print("L2"); - break; - case Machine.L3r: - System.out.print("L3"); - break; - case Machine.L4r: - System.out.print("L4"); - break; - case Machine.L5r: - System.out.print("L5"); - break; - case Machine.L6r: - System.out.print("L6"); - break; - case Machine.CPr: - System.out.print("CP"); - break; - } + System.out.print(r.toString()); System.out.print(rightbracket); } + private static void writeR(char leftBracket, int r, char rightBracket) { + var register = Register.values()[r]; + writeR(leftBracket, register, rightBracket); + } + /** * Writes a void n-field of an instruction. */ @@ -142,89 +98,90 @@ public class Disassembler { * @param d the displacment of the primitive routine. */ private static void writePrimitive(int d) { - switch (d) { - case Machine.idDisplacement: + var primitive = Primitive.values()[d]; + switch (primitive) { + case ID: System.out.print("id "); break; - case Machine.notDisplacement: + case NOT: System.out.print("not "); break; - case Machine.andDisplacement: + case AND: System.out.print("and "); break; - case Machine.orDisplacement: + case OR: System.out.print("or "); break; - case Machine.succDisplacement: + case SUCC: System.out.print("succ "); break; - case Machine.predDisplacement: + case PRED: System.out.print("pred "); break; - case Machine.negDisplacement: + case NEG: System.out.print("neg "); break; - case Machine.addDisplacement: + case ADD: System.out.print("add "); break; - case Machine.subDisplacement: + case SUB: System.out.print("sub "); break; - case Machine.multDisplacement: + case MULT: System.out.print("mult "); break; - case Machine.divDisplacement: + case DIV: System.out.print("div "); break; - case Machine.modDisplacement: + case MOD: System.out.print("mod "); break; - case Machine.ltDisplacement: + case LT: System.out.print("lt "); break; - case Machine.leDisplacement: + case LE: System.out.print("le "); break; - case Machine.geDisplacement: + case GE: System.out.print("ge "); break; - case Machine.gtDisplacement: + case GT: System.out.print("gt "); break; - case Machine.eqDisplacement: + case EQ: System.out.print("eq "); break; - case Machine.neDisplacement: + case NE: System.out.print("ne "); break; - case Machine.eolDisplacement: + case EOL: System.out.print("eol "); break; - case Machine.eofDisplacement: + case EOF: System.out.print("eof "); break; - case Machine.getDisplacement: + case GET: System.out.print("get "); break; - case Machine.putDisplacement: + case PUT: System.out.print("put "); break; - case Machine.geteolDisplacement: + case GETEOL: System.out.print("geteol "); break; - case Machine.puteolDisplacement: + case PUTEOL: System.out.print("puteol "); break; - case Machine.getintDisplacement: + case GETINT: System.out.print("getint "); break; - case Machine.putintDisplacement: + case PUTINT: System.out.print("putint "); break; - case Machine.newDisplacement: + case NEW: System.out.print("new "); break; - case Machine.disposeDisplacement: + case DISPOSE: System.out.print("dispose "); break; } @@ -237,98 +194,98 @@ public class Disassembler { */ private static void writeInstruction(Instruction instr) { - switch (instr.op) { - case Machine.LOADop: + switch (instr.opCode) { + case LOAD: System.out.print("LOAD "); - writeN(instr.n); - writeD(instr.d); - writeR('[', instr.r, ']'); + writeN(instr.length); + writeD(instr.operand); + writeR('[', instr.register, ']'); break; - case Machine.LOADAop: + case LOADA: System.out.print("LOADA "); blankN(); - writeD(instr.d); - writeR('[', instr.r, ']'); + writeD(instr.operand); + writeR('[', instr.register, ']'); break; - case Machine.LOADIop: + case LOADI: System.out.print("LOADI "); - writeN(instr.n); + writeN(instr.length); break; - case Machine.LOADLop: + case LOADL: System.out.print("LOADL "); blankN(); - writeD(instr.d); + writeD(instr.operand); break; - case Machine.STOREop: + case STORE: System.out.print("STORE "); - writeN(instr.n); - writeD(instr.d); - writeR('[', instr.r, ']'); + writeN(instr.length); + writeD(instr.operand); + writeR('[', instr.register, ']'); break; - case Machine.STOREIop: + case STOREI: System.out.print("STOREI"); - writeN(instr.n); + writeN(instr.length); break; - case Machine.CALLop: + case CALL: System.out.print("CALL "); - if (instr.r == Machine.PBr) { + if (instr.register == Register.PB) { blankN(); - writePrimitive(instr.d); + writePrimitive(instr.operand); } else { - writeR('(', instr.n, ')'); + writeR('(', instr.length, ')'); System.out.print(" "); - writeD(instr.d); - writeR('[', instr.r, ']'); + writeD(instr.operand); + writeR('[', instr.register, ']'); } break; - case Machine.CALLIop: + case CALLI: System.out.print("CALLI "); break; - case Machine.RETURNop: + case RETURN: System.out.print("RETURN"); - writeN(instr.n); - writeD(instr.d); + writeN(instr.length); + writeD(instr.operand); break; - case Machine.PUSHop: + case PUSH: System.out.print("PUSH "); blankN(); - writeD(instr.d); + writeD(instr.operand); break; - case Machine.POPop: + case POP: System.out.print("POP "); - writeN(instr.n); - writeD(instr.d); + writeN(instr.length); + writeD(instr.operand); break; - case Machine.JUMPop: + case JUMP: System.out.print("JUMP "); blankN(); - writeD(instr.d); - writeR('[', instr.r, ']'); + writeD(instr.operand); + writeR('[', instr.register, ']'); break; - case Machine.JUMPIop: + case JUMPI: System.out.print("JUMPI "); break; - case Machine.JUMPIFop: + case JUMPIF: System.out.print("JUMPIF"); - writeN(instr.n); - writeD(instr.d); - writeR('[', instr.r, ']'); + writeN(instr.length); + writeD(instr.operand); + writeR('[', instr.register, ']'); break; - case Machine.HALTop: + case HALT: System.out.print("HALT "); } } diff --git a/Triangle.AbstractMachine.Interpreter/src/main/java/Triangle/AbstractMachine/Interpreter.java b/Triangle.AbstractMachine.Interpreter/src/main/java/Triangle/AbstractMachine/Interpreter.java index 3c1b610..3ce9b08 100644 --- a/Triangle.AbstractMachine.Interpreter/src/main/java/Triangle/AbstractMachine/Interpreter.java +++ b/Triangle.AbstractMachine.Interpreter/src/main/java/Triangle/AbstractMachine/Interpreter.java @@ -40,41 +40,46 @@ public class Interpreter { static long accumulator; static int content(int r) { + var register = Register.values()[r]; + return content(register); + } + + static int content(Register r) { // Returns the current content of register r, // even if r is one of the pseudo-registers L1..L6. switch (r) { - case Machine.CBr: + case CB: return CB; - case Machine.CTr: + case CT: return CT; - case Machine.PBr: + case PB: return Machine.PB; - case Machine.PTr: + case PT: return Machine.PT; - case Machine.SBr: + case SB: return SB; - case Machine.STr: + case ST: return ST; - case Machine.HBr: + case HB: return HB; - case Machine.HTr: + case HT: return HT; - case Machine.LBr: + case LB: return LB; - case Machine.L1r: + case L1: return data[LB]; - case Machine.L2r: + case L2: return data[data[LB]]; - case Machine.L3r: + case L3: return data[data[data[LB]]]; - case Machine.L4r: + case L4: return data[data[data[data[LB]]]]; - case Machine.L5r: + case L5: return data[data[data[data[data[LB]]]]]; - case Machine.L6r: + case L6: return data[data[data[data[data[data[LB]]]]]]; - case Machine.CPr: + case CP: return CP; default: return 0; @@ -85,7 +90,6 @@ public class Interpreter { static void dump() { // Writes a summary of the machine state. - int addr, staticLink, dynamicLink, localRegNum; System.out.println(""); System.out.println("State of data store and registers:"); @@ -95,7 +99,7 @@ public class Interpreter { else { System.out.println(" HB-->"); System.out.println(" |--------|"); - for (addr = HB - 1; addr >= HT; addr--) { + for (var addr = HB - 1; addr >= HT; addr--) { System.out.print(addr + ":"); if (addr == HT) System.out.print(" HT-->"); @@ -110,41 +114,43 @@ public class Interpreter { if (ST == SB) System.out.println(" |--------| (stack is empty)"); else { - dynamicLink = LB; - staticLink = LB; - localRegNum = Machine.LBr; + var dynamicLink = LB; + var staticLink = LB; + var localRegNum = Register.LB; System.out.println(" ST--> |////////|"); System.out.println(" |--------|"); - for (addr = ST - 1; addr >= SB; addr--) { + for (var addr = ST - 1; addr >= SB; addr--) { System.out.print(addr + ":"); if (addr == SB) System.out.print(" SB-->"); else if (addr == staticLink) { switch (localRegNum) { - case Machine.LBr: + case LB: System.out.print(" LB-->"); break; - case Machine.L1r: + case L1: System.out.print(" L1-->"); break; - case Machine.L2r: + case L2: System.out.print(" L2-->"); break; - case Machine.L3r: + case L3: System.out.print(" L3-->"); break; - case Machine.L4r: + case L4: System.out.print(" L4-->"); break; - case Machine.L5r: + case L5: System.out.print(" L5-->"); break; - case Machine.L6r: + case L6: System.out.print(" L6-->"); break; + default: + break; } staticLink = data[addr]; - localRegNum = localRegNum + 1; + localRegNum = Register.values()[localRegNum.ordinal() + 1]; } else System.out.print(" "); if ((addr == dynamicLink) && (dynamicLink != SB)) @@ -277,45 +283,46 @@ public class Interpreter { int addr, size; char ch; - switch (primitiveDisplacement) { - case Machine.idDisplacement: + var primitive = Primitive.values()[primitiveDisplacement]; + switch (primitive) { + case ID: break; // nothing to be done - case Machine.notDisplacement: + case NOT: data[ST - 1] = toInt(!isTrue(data[ST - 1])); break; - case Machine.andDisplacement: + case AND: ST = ST - 1; data[ST - 1] = toInt(isTrue(data[ST - 1]) & isTrue(data[ST])); break; - case Machine.orDisplacement: + case OR: ST = ST - 1; data[ST - 1] = toInt(isTrue(data[ST - 1]) | isTrue(data[ST])); break; - case Machine.succDisplacement: + case SUCC: data[ST - 1] = overflowChecked(data[ST - 1] + 1); break; - case Machine.predDisplacement: + case PRED: data[ST - 1] = overflowChecked(data[ST - 1] - 1); break; - case Machine.negDisplacement: + case NEG: data[ST - 1] = -data[ST - 1]; break; - case Machine.addDisplacement: + case ADD: ST = ST - 1; accumulator = data[ST - 1]; data[ST - 1] = overflowChecked(accumulator + data[ST]); break; - case Machine.subDisplacement: + case SUB: ST = ST - 1; accumulator = data[ST - 1]; data[ST - 1] = overflowChecked(accumulator - data[ST]); break; - case Machine.multDisplacement: + case MULT: ST = ST - 1; accumulator = data[ST - 1]; data[ST - 1] = overflowChecked(accumulator * data[ST]); break; - case Machine.divDisplacement: + case DIV: ST = ST - 1; accumulator = data[ST - 1]; if (data[ST] != 0) @@ -323,7 +330,7 @@ public class Interpreter { else status = failedZeroDivide; break; - case Machine.modDisplacement: + case MOD: ST = ST - 1; accumulator = data[ST - 1]; if (data[ST] != 0) @@ -331,41 +338,41 @@ public class Interpreter { else status = failedZeroDivide; break; - case Machine.ltDisplacement: + case LT: ST = ST - 1; data[ST - 1] = toInt(data[ST - 1] < data[ST]); break; - case Machine.leDisplacement: + case LE: ST = ST - 1; data[ST - 1] = toInt(data[ST - 1] <= data[ST]); break; - case Machine.geDisplacement: + case GE: ST = ST - 1; data[ST - 1] = toInt(data[ST - 1] >= data[ST]); break; - case Machine.gtDisplacement: + case GT: ST = ST - 1; data[ST - 1] = toInt(data[ST - 1] > data[ST]); break; - case Machine.eqDisplacement: + case EQ: size = data[ST - 1]; // size of each comparand ST = ST - 2 * size; data[ST - 1] = toInt(equal(size, ST - 1, ST - 1 + size)); break; - case Machine.neDisplacement: + case NE: size = data[ST - 1]; // size of each comparand ST = ST - 2 * size; data[ST - 1] = toInt(!equal(size, ST - 1, ST - 1 + size)); break; - case Machine.eolDisplacement: + case EOL: data[ST] = toInt(currentChar == '\n'); ST = ST + 1; break; - case Machine.eofDisplacement: + case EOF: data[ST] = toInt(currentChar == -1); ST = ST + 1; break; - case Machine.getDisplacement: + case GET: ST = ST - 1; addr = data[ST]; try { @@ -375,12 +382,12 @@ public class Interpreter { } data[addr] = currentChar; break; - case Machine.putDisplacement: + case PUT: ST = ST - 1; ch = (char) data[ST]; System.out.print(ch); break; - case Machine.geteolDisplacement: + case GETEOL: try { while ((currentChar = System.in.read()) != '\n') ; @@ -388,10 +395,10 @@ public class Interpreter { status = failedIOError; } break; - case Machine.puteolDisplacement: + case PUTEOL: System.out.println(""); break; - case Machine.getintDisplacement: + case GETINT: ST = ST - 1; addr = data[ST]; try { @@ -401,18 +408,18 @@ public class Interpreter { } data[addr] = (int) accumulator; break; - case Machine.putintDisplacement: + case PUTINT: ST = ST - 1; accumulator = data[ST]; System.out.print(accumulator); break; - case Machine.newDisplacement: + case NEW: size = data[ST - 1]; checkSpace(size); HT = HT - size; data[ST - 1] = HT; break; - case Machine.disposeDisplacement: + case DISPOSE: ST = ST - 1; // no action taken at present break; } @@ -422,7 +429,6 @@ public class Interpreter { // Runs the program in code store. Instruction currentInstr; - int op, r, n, d, addr, index; // Initialize registers ... ST = SB; @@ -434,65 +440,67 @@ public class Interpreter { // Fetch instruction ... currentInstr = Machine.code[CP]; // Decode instruction ... - op = currentInstr.op; - r = currentInstr.r; - n = currentInstr.n; - d = currentInstr.d; + var op = currentInstr.opCode; + var r = currentInstr.register; + var n = currentInstr.length; + var d = currentInstr.operand; + int addr; + // Execute instruction ... switch (op) { - case Machine.LOADop: + case LOAD: addr = d + content(r); checkSpace(n); - for (index = 0; index < n; index++) + for (var index = 0; index < n; index++) data[ST + index] = data[addr + index]; ST = ST + n; CP = CP + 1; break; - case Machine.LOADAop: + case LOADA: addr = d + content(r); checkSpace(1); data[ST] = addr; ST = ST + 1; CP = CP + 1; break; - case Machine.LOADIop: + case LOADI: ST = ST - 1; addr = data[ST]; checkSpace(n); - for (index = 0; index < n; index++) + for (var index = 0; index < n; index++) data[ST + index] = data[addr + index]; ST = ST + n; CP = CP + 1; break; - case Machine.LOADLop: + case LOADL: checkSpace(1); data[ST] = d; ST = ST + 1; CP = CP + 1; break; - case Machine.STOREop: + case STORE: addr = d + content(r); ST = ST - n; - for (index = 0; index < n; index++) + for (var index = 0; index < n; index++) data[addr + index] = data[ST + index]; CP = CP + 1; break; - case Machine.STOREIop: + case STOREI: ST = ST - 1; addr = data[ST]; ST = ST - n; - for (index = 0; index < n; index++) + for (var index = 0; index < n; index++) data[addr + index] = data[ST + index]; CP = CP + 1; break; - case Machine.CALLop: + case CALL: addr = d + content(r); if (addr >= Machine.PB) { callPrimitive(addr - Machine.PB); CP = CP + 1; } else { checkSpace(3); - if ((0 <= n) && (n <= 15)) + if (0 <= n && n <= 15) data[ST] = content(n); // static link else status = failedInvalidInstruction; @@ -503,7 +511,7 @@ public class Interpreter { CP = addr; } break; - case Machine.CALLIop: + case CALLI: ST = ST - 2; addr = data[ST + 1]; if (addr >= Machine.PB) { @@ -518,43 +526,43 @@ public class Interpreter { CP = addr; } break; - case Machine.RETURNop: + case RETURN: addr = LB - d; CP = data[LB + 2]; LB = data[LB + 1]; ST = ST - n; - for (index = 0; index < n; index++) + for (var index = 0; index < n; index++) data[addr + index] = data[ST + index]; ST = addr + n; break; - case Machine.PUSHop: + case PUSH: checkSpace(d); ST = ST + d; CP = CP + 1; break; - case Machine.POPop: + case POP: addr = ST - n - d; ST = ST - n; - for (index = 0; index < n; index++) + for (var index = 0; index < n; index++) data[addr + index] = data[ST + index]; ST = addr + n; CP = CP + 1; break; - case Machine.JUMPop: + case JUMP: CP = d + content(r); break; - case Machine.JUMPIop: + case JUMPI: ST = ST - 1; CP = data[ST]; break; - case Machine.JUMPIFop: + case JUMPIF: ST = ST - 1; if (data[ST] == n) CP = d + content(r); else CP = CP + 1; break; - case Machine.HALTop: + case HALT: status = halted; break; } diff --git a/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Instruction.java b/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Instruction.java index bdfb7e4..493c479 100644 --- a/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Instruction.java +++ b/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Instruction.java @@ -21,13 +21,6 @@ import java.io.IOException; public class Instruction { - public Instruction() { - op = 0; - r = 0; - n = 0; - d = 0; - } - // Java has no type synonyms, so the following representations are // assumed: // @@ -37,26 +30,36 @@ public class Instruction { // Operand = -32767..+32767; {16 bits signed} // Represents TAM instructions. - public int op; // OpCode - public int r; // RegisterNumber - public int n; // Length - public int d; // Operand + final OpCode opCode; + final Register register; + final int length; + int operand; // Not final to allow for patching jump address + public Instruction(OpCode opcode, Register register, int length, int operand) { + this.opCode = opcode; + this.register = register; + this.length = length; + this.operand = operand; + } + + public void setOperand(int operand) { + this.operand = operand; + } + public void write(DataOutputStream output) throws IOException { - output.writeInt(op); - output.writeInt(r); - output.writeInt(n); - output.writeInt(d); + output.writeInt(opCode.ordinal()); + output.writeInt(register.ordinal()); + output.writeInt(length); + output.writeInt(operand); } public static Instruction read(DataInputStream input) throws IOException { - Instruction inst = new Instruction(); try { - inst.op = input.readInt(); - inst.r = input.readInt(); - inst.n = input.readInt(); - inst.d = input.readInt(); - return inst; + var opCode = OpCode.values()[input.readInt()]; + var register = Register.values()[input.readInt()]; + var length = input.readInt(); + var operand = input.readInt(); + return new Instruction(opCode, register, length, operand); } catch (EOFException s) { return null; } diff --git a/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Machine.java b/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Machine.java index ef61e9e..2550d06 100644 --- a/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Machine.java +++ b/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Machine.java @@ -31,10 +31,6 @@ public final class Machine { // INSTRUCTIONS - // Operation codes - public final static int LOADop = 0, LOADAop = 1, LOADIop = 2, LOADLop = 3, STOREop = 4, STOREIop = 5, CALLop = 6, - CALLIop = 7, RETURNop = 8, PUSHop = 10, POPop = 11, JUMPop = 12, JUMPIop = 13, JUMPIFop = 14, HALTop = 15; - // CODE STORE public static Instruction[] code = new Instruction[1024]; @@ -46,9 +42,6 @@ public final class Machine { // REGISTER NUMBERS - public final static int CBr = 0, CTr = 1, PBr = 2, PTr = 3, SBr = 4, STr = 5, HBr = 6, HTr = 7, LBr = 8, - L1r = LBr + 1, L2r = LBr + 2, L3r = LBr + 3, L4r = LBr + 4, L5r = LBr + 5, L6r = LBr + 6, CPr = 15; - // DATA REPRESENTATION public final static int booleanSize = 1, characterSize = 1, integerSize = 1, addressSize = 1, @@ -58,14 +51,4 @@ public final class Machine { falseRep = 0, trueRep = 1, maxintRep = 32767; - // ADDRESSES OF PRIMITIVE ROUTINES - - public final static int idDisplacement = 1, notDisplacement = 2, andDisplacement = 3, orDisplacement = 4, - succDisplacement = 5, predDisplacement = 6, negDisplacement = 7, addDisplacement = 8, subDisplacement = 9, - multDisplacement = 10, divDisplacement = 11, modDisplacement = 12, ltDisplacement = 13, leDisplacement = 14, - geDisplacement = 15, gtDisplacement = 16, eqDisplacement = 17, neDisplacement = 18, eolDisplacement = 19, - eofDisplacement = 20, getDisplacement = 21, putDisplacement = 22, geteolDisplacement = 23, - puteolDisplacement = 24, getintDisplacement = 25, putintDisplacement = 26, newDisplacement = 27, - disposeDisplacement = 28; - } diff --git a/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/OpCode.java b/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/OpCode.java new file mode 100644 index 0000000..9781279 --- /dev/null +++ b/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/OpCode.java @@ -0,0 +1,5 @@ +package Triangle.AbstractMachine; + +public enum OpCode { + LOAD, LOADA, LOADI, LOADL, STORE, STOREI, CALL, CALLI, RETURN, PUSH, POP, JUMP, JUMPI, JUMPIF, HALT +} diff --git a/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Primitive.java b/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Primitive.java new file mode 100644 index 0000000..1ab3aa2 --- /dev/null +++ b/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Primitive.java @@ -0,0 +1,6 @@ +package Triangle.AbstractMachine; + +public enum Primitive { + ID, NOT, AND, OR, SUCC, PRED, NEG, ADD, SUB, MULT, DIV, MOD, LT, LE, GE, GT, EQ, NE, EOL, EOF, GET, PUT, GETEOL, + PUTEOL, GETINT, PUTINT, NEW, DISPOSE +} diff --git a/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Register.java b/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Register.java new file mode 100644 index 0000000..1c91515 --- /dev/null +++ b/Triangle.AbstractMachine/src/main/java/Triangle/AbstractMachine/Register.java @@ -0,0 +1,5 @@ +package Triangle.AbstractMachine; + +public enum Register { + CB, CT, PB, PT, SB, ST, HB, HT, LB, L1, L2, L3, L4, L5, L6, CP +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AST.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AbstractSyntaxTree.java similarity index 73% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AST.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AbstractSyntaxTree.java index 7e52e5f..c5dd157 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AST.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AbstractSyntaxTree.java @@ -14,12 +14,14 @@ package Triangle.AbstractSyntaxTrees; -import Triangle.CodeGenerator.RuntimeEntity; +import Triangle.CodeGenerator.Entities.RuntimeEntity; import Triangle.SyntacticAnalyzer.SourcePosition; -public abstract class AST { +public abstract class AbstractSyntaxTree { - public AST(SourcePosition position) { + private final SourcePosition position; + + public AbstractSyntaxTree(SourcePosition position) { this.position = position; entity = null; } @@ -28,13 +30,5 @@ public abstract class AST { return position; } - public abstract Object visit(Visitor v, Object o); - - public final Object visit(Visitor v) { - return visit(v, null); - } - - public final SourcePosition position; - public RuntimeEntity entity; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ActualParameter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ActualParameter.java similarity index 58% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ActualParameter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ActualParameter.java index 7924aac..0dc659b 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ActualParameter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ActualParameter.java @@ -12,13 +12,21 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Actuals; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; -public abstract class ActualParameter extends AST { +public abstract class ActualParameter extends AbstractSyntaxTree { public ActualParameter(SourcePosition position) { super(position); } + + public abstract TResult visit(ActualParameterVisitor visitor, TArg arg); + + public TResult visit(ActualParameterVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ActualParameterSequence.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ActualParameterSequence.java similarity index 58% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ActualParameterSequence.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ActualParameterSequence.java index dc4509f..ff2c1a3 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ActualParameterSequence.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ActualParameterSequence.java @@ -12,13 +12,21 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Actuals; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; -public abstract class ActualParameterSequence extends AST { +public abstract class ActualParameterSequence extends AbstractSyntaxTree { public ActualParameterSequence(SourcePosition position) { super(position); } + + public abstract TResult visit(ActualParameterSequenceVisitor v, TArg arg); + + public TResult visit(ActualParameterSequenceVisitor v) { + return visit(v, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ConstActualParameter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ConstActualParameter.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ConstActualParameter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ConstActualParameter.java index a5a1fbe..7ff36d1 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ConstActualParameter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ConstActualParameter.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Actuals; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class ConstActualParameter extends ActualParameter { @@ -23,10 +25,9 @@ public class ConstActualParameter extends ActualParameter { E = eAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitConstActualParameter(this, o); + public TResult visit(ActualParameterVisitor v, TArg arg) { + return v.visitConstActualParameter(this, arg); } - public Expression E; + public final Expression E; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyActualParameterSequence.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/EmptyActualParameterSequence.java similarity index 72% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyActualParameterSequence.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/EmptyActualParameterSequence.java index dd6ef21..f5a5b41 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyActualParameterSequence.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/EmptyActualParameterSequence.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Actuals; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class EmptyActualParameterSequence extends ActualParameterSequence { @@ -22,8 +23,7 @@ public class EmptyActualParameterSequence extends ActualParameterSequence { super(position); } - @Override - public Object visit(Visitor v, Object o) { - return v.visitEmptyActualParameterSequence(this, o); + public TResult visit(ActualParameterSequenceVisitor v, TArg arg) { + return v.visitEmptyActualParameterSequence(this, arg); } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FuncActualParameter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/FuncActualParameter.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FuncActualParameter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/FuncActualParameter.java index 51378f3..d7dae8c 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FuncActualParameter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/FuncActualParameter.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Actuals; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class FuncActualParameter extends ActualParameter { @@ -23,10 +25,9 @@ public class FuncActualParameter extends ActualParameter { I = iAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitFuncActualParameter(this, o); + public TResult visit(ActualParameterVisitor v, TArg arg) { + return v.visitFuncActualParameter(this, arg); } - public Identifier I; + public final Identifier I; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleActualParameterSequence.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/MultipleActualParameterSequence.java similarity index 70% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleActualParameterSequence.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/MultipleActualParameterSequence.java index 9279fda..4144b05 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleActualParameterSequence.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/MultipleActualParameterSequence.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Actuals; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class MultipleActualParameterSequence extends ActualParameterSequence { @@ -25,11 +26,10 @@ public class MultipleActualParameterSequence extends ActualParameterSequence { APS = apsAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitMultipleActualParameterSequence(this, o); + public TResult visit(ActualParameterSequenceVisitor v, TArg arg) { + return v.visitMultipleActualParameterSequence(this, arg); } - public ActualParameter AP; - public ActualParameterSequence APS; + public final ActualParameter AP; + public final ActualParameterSequence APS; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ProcActualParameter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ProcActualParameter.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ProcActualParameter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ProcActualParameter.java index c17c04c..3724cb4 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ProcActualParameter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/ProcActualParameter.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Actuals; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class ProcActualParameter extends ActualParameter { @@ -23,10 +25,9 @@ public class ProcActualParameter extends ActualParameter { I = iAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitProcActualParameter(this, o); + public TResult visit(ActualParameterVisitor v, TArg arg) { + return v.visitProcActualParameter(this, arg); } - public Identifier I; + public final Identifier I; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleActualParameterSequence.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/SingleActualParameterSequence.java similarity index 71% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleActualParameterSequence.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/SingleActualParameterSequence.java index 9ffbfb7..6a712ea 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleActualParameterSequence.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/SingleActualParameterSequence.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Actuals; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class SingleActualParameterSequence extends ActualParameterSequence { @@ -23,10 +24,9 @@ public class SingleActualParameterSequence extends ActualParameterSequence { AP = apAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitSingleActualParameterSequence(this, o); + public TResult visit(ActualParameterSequenceVisitor v, TArg arg) { + return v.visitSingleActualParameterSequence(this, arg); } - public ActualParameter AP; + public final ActualParameter AP; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VarActualParameter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/VarActualParameter.java similarity index 69% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VarActualParameter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/VarActualParameter.java index a2e6f47..d6dc72f 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VarActualParameter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Actuals/VarActualParameter.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Actuals; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor; +import Triangle.AbstractSyntaxTrees.Vnames.Vname; import Triangle.SyntacticAnalyzer.SourcePosition; public class VarActualParameter extends ActualParameter { @@ -23,10 +25,9 @@ public class VarActualParameter extends ActualParameter { V = vAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitVarActualParameter(this, o); + public TResult visit(ActualParameterVisitor v, TArg arg) { + return v.visitVarActualParameter(this, arg); } - public Vname V; + public final Vname V; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ArrayAggregate.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/ArrayAggregate.java similarity index 59% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ArrayAggregate.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/ArrayAggregate.java index 2d0bc96..8cb0cc3 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ArrayAggregate.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/ArrayAggregate.java @@ -12,11 +12,13 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Aggregates; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; +import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; -public abstract class ArrayAggregate extends AST { +public abstract class ArrayAggregate extends AbstractSyntaxTree { public ArrayAggregate(SourcePosition position) { super(position); @@ -24,4 +26,10 @@ public abstract class ArrayAggregate extends AST { } public int elemCount; + + public abstract TResult visit(ArrayAggregateVisitor visitor, TArg arg); + + public TResult visit(ArrayAggregateVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleArrayAggregate.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/MultipleArrayAggregate.java similarity index 67% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleArrayAggregate.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/MultipleArrayAggregate.java index a699ebc..d5de6cc 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleArrayAggregate.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/MultipleArrayAggregate.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Aggregates; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class MultipleArrayAggregate extends ArrayAggregate { @@ -24,11 +26,10 @@ public class MultipleArrayAggregate extends ArrayAggregate { AA = aaAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitMultipleArrayAggregate(this, o); + public TResult visit(ArrayAggregateVisitor v, TArg arg) { + return v.visitMultipleArrayAggregate(this, arg); } - public Expression E; - public ArrayAggregate AA; + public final Expression E; + public final ArrayAggregate AA; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleRecordAggregate.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/MultipleRecordAggregate.java similarity index 59% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleRecordAggregate.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/MultipleRecordAggregate.java index 95a1ad5..cbc572a 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleRecordAggregate.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/MultipleRecordAggregate.java @@ -12,26 +12,27 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Aggregates; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.RecordAggregateVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class MultipleRecordAggregate extends RecordAggregate { - public MultipleRecordAggregate(Identifier iAST, Expression eAST, RecordAggregate raAST, - SourcePosition position) { + public MultipleRecordAggregate(Identifier iAST, Expression eAST, RecordAggregate raAST, SourcePosition position) { super(position); I = iAST; E = eAST; RA = raAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitMultipleRecordAggregate(this, o); + public TResult visit(RecordAggregateVisitor v, TArg arg) { + return v.visitMultipleRecordAggregate(this, arg); } - public Identifier I; - public Expression E; - public RecordAggregate RA; + public final Identifier I; + public final Expression E; + public final RecordAggregate RA; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/RecordAggregate.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/RecordAggregate.java similarity index 56% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/RecordAggregate.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/RecordAggregate.java index b149068..8350870 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/RecordAggregate.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/RecordAggregate.java @@ -12,11 +12,14 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Aggregates; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; +import Triangle.AbstractSyntaxTrees.Types.FieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.RecordAggregateVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; -public abstract class RecordAggregate extends AST { +public abstract class RecordAggregate extends AbstractSyntaxTree { public RecordAggregate(SourcePosition position) { super(position); @@ -24,4 +27,10 @@ public abstract class RecordAggregate extends AST { } public FieldTypeDenoter type; + + public abstract TResult visit(RecordAggregateVisitor visitor, TArg arg); + + public TResult visit(RecordAggregateVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleArrayAggregate.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/SingleArrayAggregate.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleArrayAggregate.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/SingleArrayAggregate.java index 8bc2b6b..c96b28e 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleArrayAggregate.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/SingleArrayAggregate.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Aggregates; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class SingleArrayAggregate extends ArrayAggregate { @@ -23,10 +25,9 @@ public class SingleArrayAggregate extends ArrayAggregate { E = eAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitSingleArrayAggregate(this, o); + public TResult visit(ArrayAggregateVisitor v, TArg arg) { + return v.visitSingleArrayAggregate(this, arg); } - public Expression E; + public final Expression E; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleRecordAggregate.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/SingleRecordAggregate.java similarity index 64% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleRecordAggregate.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/SingleRecordAggregate.java index fb4155c..ec67464 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleRecordAggregate.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Aggregates/SingleRecordAggregate.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Aggregates; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.RecordAggregateVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class SingleRecordAggregate extends RecordAggregate { @@ -24,11 +27,10 @@ public class SingleRecordAggregate extends RecordAggregate { E = eAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitSingleRecordAggregate(this, o); + public TResult visit(RecordAggregateVisitor v, TArg arg) { + return v.visitSingleRecordAggregate(this, arg); } - public Identifier I; - public Expression E; + public final Identifier I; + public final Expression E; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AssignCommand.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/AssignCommand.java similarity index 65% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AssignCommand.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/AssignCommand.java index 5e3849c..e062d67 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AssignCommand.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/AssignCommand.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Commands; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor; +import Triangle.AbstractSyntaxTrees.Vnames.Vname; import Triangle.SyntacticAnalyzer.SourcePosition; public class AssignCommand extends Command { @@ -24,11 +27,10 @@ public class AssignCommand extends Command { E = eAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitAssignCommand(this, o); + public TResult visit(CommandVisitor v, TArg arg) { + return v.visitAssignCommand(this, arg); } - public Vname V; - public Expression E; + public final Vname V; + public final Expression E; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CallCommand.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/CallCommand.java similarity index 64% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CallCommand.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/CallCommand.java index da944ef..be536e6 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CallCommand.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/CallCommand.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Commands; +import Triangle.AbstractSyntaxTrees.Actuals.ActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class CallCommand extends Command { @@ -24,11 +27,10 @@ public class CallCommand extends Command { APS = apsAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitCallCommand(this, o); + public TResult visit(CommandVisitor v, TArg arg) { + return v.visitCallCommand(this, arg); } - public Identifier I; - public ActualParameterSequence APS; + public final Identifier I; + public final ActualParameterSequence APS; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Command.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/Command.java similarity index 59% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Command.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/Command.java index 97f08d3..b171be0 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Command.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/Command.java @@ -12,13 +12,21 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Commands; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; +import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; -public abstract class Command extends AST { +public abstract class Command extends AbstractSyntaxTree { public Command(SourcePosition position) { super(position); } + + public abstract TResult visit(CommandVisitor visitor, TArg arg); + + public TResult visit(CommandVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyCommand.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/EmptyCommand.java similarity index 74% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyCommand.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/EmptyCommand.java index 7d35d61..023ec28 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyCommand.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/EmptyCommand.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Commands; +import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class EmptyCommand extends Command { @@ -22,8 +23,7 @@ public class EmptyCommand extends Command { super(position); } - @Override - public Object visit(Visitor v, Object o) { - return v.visitEmptyCommand(this, o); + public TResult visit(CommandVisitor v, TArg arg) { + return v.visitEmptyCommand(this, arg); } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IfCommand.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/IfCommand.java similarity index 69% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IfCommand.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/IfCommand.java index 372a16c..a004763 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IfCommand.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/IfCommand.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Commands; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class IfCommand extends Command { @@ -25,11 +27,10 @@ public class IfCommand extends Command { C2 = c2AST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitIfCommand(this, o); + public TResult visit(CommandVisitor v, TArg arg) { + return v.visitIfCommand(this, arg); } - public Expression E; - public Command C1, C2; + public final Expression E; + public final Command C1, C2; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/LetCommand.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/LetCommand.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/LetCommand.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/LetCommand.java index 85a38c6..7409304 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/LetCommand.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/LetCommand.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Commands; +import Triangle.AbstractSyntaxTrees.Declarations.Declaration; +import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class LetCommand extends Command { @@ -24,11 +26,10 @@ public class LetCommand extends Command { C = cAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitLetCommand(this, o); + public TResult visit(CommandVisitor v, TArg arg) { + return v.visitLetCommand(this, arg); } - public Declaration D; - public Command C; + public final Declaration D; + public final Command C; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SequentialCommand.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/SequentialCommand.java similarity index 74% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SequentialCommand.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/SequentialCommand.java index 78bc131..9fda1fb 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SequentialCommand.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/SequentialCommand.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Commands; +import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class SequentialCommand extends Command { @@ -24,10 +25,9 @@ public class SequentialCommand extends Command { C2 = c2AST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitSequentialCommand(this, o); + public TResult visit(CommandVisitor v, TArg arg) { + return v.visitSequentialCommand(this, arg); } - public Command C1, C2; + public final Command C1, C2; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/WhileCommand.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/WhileCommand.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/WhileCommand.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/WhileCommand.java index 57d4aa4..f3e38a7 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/WhileCommand.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Commands/WhileCommand.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Commands; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class WhileCommand extends Command { @@ -24,11 +26,10 @@ public class WhileCommand extends Command { C = cAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitWhileCommand(this, o); + public TResult visit(CommandVisitor v, TArg arg) { + return v.visitWhileCommand(this, arg); } - public Expression E; - public Command C; + public final Expression E; + public final Command C; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/BinaryOperatorDeclaration.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/BinaryOperatorDeclaration.java similarity index 66% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/BinaryOperatorDeclaration.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/BinaryOperatorDeclaration.java index 80edf9d..b22b2f8 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/BinaryOperatorDeclaration.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/BinaryOperatorDeclaration.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Declarations; +import Triangle.AbstractSyntaxTrees.Terminals.Operator; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class BinaryOperatorDeclaration extends Declaration { @@ -27,11 +30,10 @@ public class BinaryOperatorDeclaration extends Declaration { RES = resultAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitBinaryOperatorDeclaration(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitBinaryOperatorDeclaration(this, arg); } - public Operator O; - public TypeDenoter ARG1, ARG2, RES; + public final Operator O; + public final TypeDenoter ARG1, ARG2, RES; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ConstDeclaration.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/ConstDeclaration.java similarity index 64% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ConstDeclaration.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/ConstDeclaration.java index 116b5e7..1d13f3c 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ConstDeclaration.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/ConstDeclaration.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Declarations; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class ConstDeclaration extends Declaration { @@ -24,11 +27,10 @@ public class ConstDeclaration extends Declaration { E = eAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitConstDeclaration(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitConstDeclaration(this, arg); } - public Identifier I; - public Expression E; + public final Identifier I; + public final Expression E; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declaration.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/Declaration.java similarity index 60% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declaration.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/Declaration.java index 7a8e6c8..1d21bcf 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declaration.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/Declaration.java @@ -12,11 +12,13 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Declarations; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; -public abstract class Declaration extends AST { +public abstract class Declaration extends AbstractSyntaxTree { public Declaration(SourcePosition position) { super(position); @@ -24,4 +26,10 @@ public abstract class Declaration extends AST { } public boolean duplicated; + + public abstract TResult visit(DeclarationVisitor visitor, TArg arg); + + public TResult visit(DeclarationVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FuncDeclaration.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/FuncDeclaration.java similarity index 59% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FuncDeclaration.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/FuncDeclaration.java index 32cfde0..240d558 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FuncDeclaration.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/FuncDeclaration.java @@ -12,8 +12,13 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Declarations; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Formals.FormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class FuncDeclaration extends Declaration { @@ -27,13 +32,12 @@ public class FuncDeclaration extends Declaration { E = eAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitFuncDeclaration(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitFuncDeclaration(this, arg); } - public Identifier I; - public FormalParameterSequence FPS; + public final Identifier I; + public final FormalParameterSequence FPS; public TypeDenoter T; - public Expression E; + public final Expression E; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ProcDeclaration.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/ProcDeclaration.java similarity index 60% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ProcDeclaration.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/ProcDeclaration.java index 45eeb43..ab08f52 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ProcDeclaration.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/ProcDeclaration.java @@ -12,8 +12,12 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Declarations; +import Triangle.AbstractSyntaxTrees.Commands.Command; +import Triangle.AbstractSyntaxTrees.Formals.FormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class ProcDeclaration extends Declaration { @@ -25,12 +29,11 @@ public class ProcDeclaration extends Declaration { C = cAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitProcDeclaration(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitProcDeclaration(this, arg); } - public Identifier I; - public FormalParameterSequence FPS; - public Command C; + public final Identifier I; + public final FormalParameterSequence FPS; + public final Command C; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SequentialDeclaration.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/SequentialDeclaration.java similarity index 73% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SequentialDeclaration.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/SequentialDeclaration.java index 51014df..1003c9f 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SequentialDeclaration.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/SequentialDeclaration.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Declarations; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class SequentialDeclaration extends Declaration { @@ -24,10 +25,9 @@ public class SequentialDeclaration extends Declaration { D2 = d2AST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitSequentialDeclaration(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitSequentialDeclaration(this, arg); } - public Declaration D1, D2; + public final Declaration D1, D2; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/UnaryOperatorDeclaration.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/UnaryOperatorDeclaration.java similarity index 61% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/UnaryOperatorDeclaration.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/UnaryOperatorDeclaration.java index 7237804..2bb619c 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/UnaryOperatorDeclaration.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/UnaryOperatorDeclaration.java @@ -12,25 +12,26 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Declarations; +import Triangle.AbstractSyntaxTrees.Terminals.Operator; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class UnaryOperatorDeclaration extends Declaration { - public UnaryOperatorDeclaration(Operator oAST, TypeDenoter argAST, TypeDenoter resultAST, - SourcePosition position) { + public UnaryOperatorDeclaration(Operator oAST, TypeDenoter argAST, TypeDenoter resultAST, SourcePosition position) { super(position); O = oAST; ARG = argAST; RES = resultAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitUnaryOperatorDeclaration(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitUnaryOperatorDeclaration(this, arg); } - public Operator O; - public TypeDenoter ARG, RES; + public final Operator O; + public final TypeDenoter ARG, RES; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VarDeclaration.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/VarDeclaration.java similarity index 67% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VarDeclaration.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/VarDeclaration.java index ed06634..ce8a50f 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VarDeclaration.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Declarations/VarDeclaration.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Declarations; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class VarDeclaration extends Declaration { @@ -24,11 +27,10 @@ public class VarDeclaration extends Declaration { T = tAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitVarDeclaration(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitVarDeclaration(this, arg); } - public Identifier I; + public final Identifier I; public TypeDenoter T; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ArrayExpression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/ArrayExpression.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ArrayExpression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/ArrayExpression.java index 03baf73..8337b9d 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ArrayExpression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/ArrayExpression.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.Aggregates.ArrayAggregate; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class ArrayExpression extends Expression { @@ -23,10 +25,9 @@ public class ArrayExpression extends Expression { AA = aaAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitArrayExpression(this, o); + public TResult visit(ExpressionVisitor v, TArg arg) { + return v.visitArrayExpression(this, arg); } - public ArrayAggregate AA; + public final ArrayAggregate AA; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/BinaryExpression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/BinaryExpression.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/BinaryExpression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/BinaryExpression.java index 9d154af..d5e2626 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/BinaryExpression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/BinaryExpression.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.Terminals.Operator; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class BinaryExpression extends Expression { @@ -25,11 +27,10 @@ public class BinaryExpression extends Expression { E2 = e2AST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitBinaryExpression(this, o); + public TResult visit(ExpressionVisitor v, TArg arg) { + return v.visitBinaryExpression(this, arg); } - public Expression E1, E2; - public Operator O; + public final Expression E1, E2; + public final Operator O; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CallExpression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/CallExpression.java similarity index 63% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CallExpression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/CallExpression.java index 4fdfa02..20580f8 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CallExpression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/CallExpression.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.Actuals.ActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class CallExpression extends Expression { @@ -24,11 +27,10 @@ public class CallExpression extends Expression { APS = apsAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitCallExpression(this, o); + public TResult visit(ExpressionVisitor v, TArg arg) { + return v.visitCallExpression(this, arg); } - public Identifier I; - public ActualParameterSequence APS; + public final Identifier I; + public final ActualParameterSequence APS; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CharacterExpression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/CharacterExpression.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CharacterExpression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/CharacterExpression.java index 3b5d688..47cb1e3 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CharacterExpression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/CharacterExpression.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.Terminals.CharacterLiteral; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class CharacterExpression extends Expression { @@ -23,10 +25,9 @@ public class CharacterExpression extends Expression { CL = clAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitCharacterExpression(this, o); + public TResult visit(ExpressionVisitor v, TArg arg) { + return v.visitCharacterExpression(this, arg); } - public CharacterLiteral CL; + public final CharacterLiteral CL; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyExpression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/EmptyExpression.java similarity index 74% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyExpression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/EmptyExpression.java index 9e24680..58d173d 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyExpression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/EmptyExpression.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class EmptyExpression extends Expression { @@ -22,8 +23,7 @@ public class EmptyExpression extends Expression { super(position); } - @Override - public Object visit(Visitor v, Object o) { - return v.visitEmptyExpression(this, o); + public TResult visit(ExpressionVisitor v, TArg arg) { + return v.visitEmptyExpression(this, arg); } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/Expression.java similarity index 57% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/Expression.java index 569267a..0182ddf 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/Expression.java @@ -12,11 +12,14 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; -public abstract class Expression extends AST { +public abstract class Expression extends AbstractSyntaxTree { public Expression(SourcePosition position) { super(position); @@ -24,4 +27,10 @@ public abstract class Expression extends AST { } public TypeDenoter type; + + public abstract TResult visit(ExpressionVisitor visitor, TArg arg); + + public TResult visit(ExpressionVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IfExpression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/IfExpression.java similarity index 74% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IfExpression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/IfExpression.java index 1142766..71f4209 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IfExpression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/IfExpression.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class IfExpression extends Expression { @@ -25,10 +26,9 @@ public class IfExpression extends Expression { E3 = e3AST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitIfExpression(this, o); + public TResult visit(ExpressionVisitor v, TArg arg) { + return v.visitIfExpression(this, arg); } - public Expression E1, E2, E3; + public final Expression E1, E2, E3; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IntegerExpression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/IntegerExpression.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IntegerExpression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/IntegerExpression.java index a30879e..7284c3c 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IntegerExpression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/IntegerExpression.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class IntegerExpression extends Expression { @@ -23,10 +25,9 @@ public class IntegerExpression extends Expression { IL = ilAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitIntegerExpression(this, o); + public TResult visit(ExpressionVisitor v, TArg arg) { + return v.visitIntegerExpression(this, arg); } - public IntegerLiteral IL; + public final IntegerLiteral IL; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/LetExpression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/LetExpression.java similarity index 67% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/LetExpression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/LetExpression.java index f96fb33..d08228e 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/LetExpression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/LetExpression.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.Declarations.Declaration; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class LetExpression extends Expression { @@ -24,11 +26,10 @@ public class LetExpression extends Expression { E = eAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitLetExpression(this, o); + public TResult visit(ExpressionVisitor v, TArg arg) { + return v.visitLetExpression(this, arg); } - public Declaration D; - public Expression E; + public final Declaration D; + public final Expression E; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/RecordExpression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/RecordExpression.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/RecordExpression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/RecordExpression.java index 3f3dd23..bf6723b 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/RecordExpression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/RecordExpression.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.Aggregates.RecordAggregate; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class RecordExpression extends Expression { @@ -23,10 +25,9 @@ public class RecordExpression extends Expression { RA = raAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitRecordExpression(this, o); + public TResult visit(ExpressionVisitor v, TArg arg) { + return v.visitRecordExpression(this, arg); } - public RecordAggregate RA; + public final RecordAggregate RA; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/UnaryExpression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/UnaryExpression.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/UnaryExpression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/UnaryExpression.java index 1589235..14a931b 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/UnaryExpression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/UnaryExpression.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.Terminals.Operator; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class UnaryExpression extends Expression { @@ -24,11 +26,10 @@ public class UnaryExpression extends Expression { E = eAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitUnaryExpression(this, o); + public TResult visit(ExpressionVisitor v, TArg arg) { + return v.visitUnaryExpression(this, arg); } - public Expression E; - public Operator O; + public final Expression E; + public final Operator O; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VnameExpression.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/VnameExpression.java similarity index 69% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VnameExpression.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/VnameExpression.java index 100993d..f1a58da 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VnameExpression.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Expressions/VnameExpression.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Expressions; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; +import Triangle.AbstractSyntaxTrees.Vnames.Vname; import Triangle.SyntacticAnalyzer.SourcePosition; public class VnameExpression extends Expression { @@ -23,10 +25,9 @@ public class VnameExpression extends Expression { V = vAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitVnameExpression(this, o); + public TResult visit(ExpressionVisitor v, TArg arg) { + return v.visitVnameExpression(this, arg); } - public Vname V; + public final Vname V; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ConstFormalParameter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/ConstFormalParameter.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ConstFormalParameter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/ConstFormalParameter.java index b05ff0b..ff138ef 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ConstFormalParameter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/ConstFormalParameter.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Formals; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class ConstFormalParameter extends FormalParameter { @@ -24,20 +27,20 @@ public class ConstFormalParameter extends FormalParameter { T = tAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitConstFormalParameter(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitConstFormalParameter(this, arg); } - public Identifier I; - public TypeDenoter T; - @Override public boolean equals(Object fpAST) { if (fpAST instanceof ConstFormalParameter) { - ConstFormalParameter cfpAST = (ConstFormalParameter) fpAST; + var cfpAST = (ConstFormalParameter) fpAST; return T.equals(cfpAST.T); - } else + } else { return false; + } } + + public final Identifier I; + public TypeDenoter T; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyFormalParameterSequence.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/EmptyFormalParameterSequence.java similarity index 75% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyFormalParameterSequence.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/EmptyFormalParameterSequence.java index d7aaace..84a10ec 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/EmptyFormalParameterSequence.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/EmptyFormalParameterSequence.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Formals; +import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class EmptyFormalParameterSequence extends FormalParameterSequence { @@ -22,9 +23,8 @@ public class EmptyFormalParameterSequence extends FormalParameterSequence { super(position); } - @Override - public Object visit(Visitor v, Object o) { - return v.visitEmptyFormalParameterSequence(this, o); + public TResult visit(FormalParameterSequenceVisitor v, TArg arg) { + return v.visitEmptyFormalParameterSequence(this, arg); } @Override diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FormalParameter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/FormalParameter.java similarity index 66% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FormalParameter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/FormalParameter.java index 448a53c..6a9d0ec 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FormalParameter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/FormalParameter.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Formals; +import Triangle.AbstractSyntaxTrees.Declarations.Declaration; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public abstract class FormalParameter extends Declaration { @@ -25,4 +27,9 @@ public abstract class FormalParameter extends Declaration { @Override public abstract boolean equals(Object fpAST); + public abstract TResult visit(DeclarationVisitor visitor, TArg arg); + + public TResult visit(DeclarationVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FormalParameterSequence.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/FormalParameterSequence.java similarity index 59% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FormalParameterSequence.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/FormalParameterSequence.java index 8266327..d2997a8 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FormalParameterSequence.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/FormalParameterSequence.java @@ -12,11 +12,13 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Formals; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; +import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; -public abstract class FormalParameterSequence extends AST { +public abstract class FormalParameterSequence extends AbstractSyntaxTree { public FormalParameterSequence(SourcePosition position) { super(position); @@ -24,4 +26,10 @@ public abstract class FormalParameterSequence extends AST { @Override public abstract boolean equals(Object fpsAST); + + public abstract TResult visit(FormalParameterSequenceVisitor visitor, TArg arg); + + public TResult visit(FormalParameterSequenceVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FuncFormalParameter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/FuncFormalParameter.java similarity index 71% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FuncFormalParameter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/FuncFormalParameter.java index 7be3b1e..1f4b71b 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FuncFormalParameter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/FuncFormalParameter.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Formals; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class FuncFormalParameter extends FormalParameter { @@ -26,9 +29,8 @@ public class FuncFormalParameter extends FormalParameter { T = tAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitFuncFormalParameter(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitFuncFormalParameter(this, arg); } @Override @@ -40,7 +42,7 @@ public class FuncFormalParameter extends FormalParameter { return false; } - public Identifier I; - public FormalParameterSequence FPS; + public final Identifier I; + public final FormalParameterSequence FPS; public TypeDenoter T; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleFormalParameterSequence.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/MultipleFormalParameterSequence.java similarity index 74% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleFormalParameterSequence.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/MultipleFormalParameterSequence.java index 94d0a97..0905531 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleFormalParameterSequence.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/MultipleFormalParameterSequence.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Formals; +import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class MultipleFormalParameterSequence extends FormalParameterSequence { @@ -25,9 +26,8 @@ public class MultipleFormalParameterSequence extends FormalParameterSequence { FPS = fpsAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitMultipleFormalParameterSequence(this, o); + public TResult visit(FormalParameterSequenceVisitor v, TArg arg) { + return v.visitMultipleFormalParameterSequence(this, arg); } @Override @@ -35,10 +35,11 @@ public class MultipleFormalParameterSequence extends FormalParameterSequence { if (fpsAST instanceof MultipleFormalParameterSequence) { MultipleFormalParameterSequence mfpsAST = (MultipleFormalParameterSequence) fpsAST; return FP.equals(mfpsAST.FP) && FPS.equals(mfpsAST.FPS); - } else + } else { return false; + } } - public FormalParameter FP; - public FormalParameterSequence FPS; + public final FormalParameter FP; + public final FormalParameterSequence FPS; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ProcFormalParameter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/ProcFormalParameter.java similarity index 72% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ProcFormalParameter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/ProcFormalParameter.java index 3e6931d..a866934 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ProcFormalParameter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/ProcFormalParameter.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Formals; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class ProcFormalParameter extends FormalParameter { @@ -24,20 +26,20 @@ public class ProcFormalParameter extends FormalParameter { FPS = fpsAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitProcFormalParameter(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitProcFormalParameter(this, arg); } - public Identifier I; - public FormalParameterSequence FPS; - @Override public boolean equals(Object fpAST) { if (fpAST instanceof ProcFormalParameter) { ProcFormalParameter pfpAST = (ProcFormalParameter) fpAST; return FPS.equals(pfpAST.FPS); - } else + } else { return false; + } } + + public final Identifier I; + public final FormalParameterSequence FPS; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleFormalParameterSequence.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/SingleFormalParameterSequence.java similarity index 75% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleFormalParameterSequence.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/SingleFormalParameterSequence.java index d13f2b8..6110144 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleFormalParameterSequence.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/SingleFormalParameterSequence.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Formals; +import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class SingleFormalParameterSequence extends FormalParameterSequence { @@ -23,9 +24,8 @@ public class SingleFormalParameterSequence extends FormalParameterSequence { FP = fpAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitSingleFormalParameterSequence(this, o); + public TResult visit(FormalParameterSequenceVisitor v, TArg arg) { + return v.visitSingleFormalParameterSequence(this, arg); } @Override @@ -33,9 +33,10 @@ public class SingleFormalParameterSequence extends FormalParameterSequence { if (fpsAST instanceof SingleFormalParameterSequence) { SingleFormalParameterSequence sfpsAST = (SingleFormalParameterSequence) fpsAST; return FP.equals(sfpsAST.FP); - } else + } else { return false; + } } - public FormalParameter FP; + public final FormalParameter FP; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VarFormalParameter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/VarFormalParameter.java similarity index 71% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VarFormalParameter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/VarFormalParameter.java index fd97142..554475c 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/VarFormalParameter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Formals/VarFormalParameter.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Formals; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class VarFormalParameter extends FormalParameter { @@ -24,20 +27,20 @@ public class VarFormalParameter extends FormalParameter { T = tAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitVarFormalParameter(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitVarFormalParameter(this, arg); } - public Identifier I; - public TypeDenoter T; - @Override public boolean equals(Object fpAST) { if (fpAST instanceof VarFormalParameter) { VarFormalParameter vfpAST = (VarFormalParameter) fpAST; return T.equals(vfpAST.T); - } else + } else { return false; + } } + + public final Identifier I; + public TypeDenoter T; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Program.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Program.java index bc9082b..52e0c10 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Program.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Program.java @@ -14,19 +14,24 @@ package Triangle.AbstractSyntaxTrees; +import Triangle.AbstractSyntaxTrees.Commands.Command; +import Triangle.AbstractSyntaxTrees.Visitors.ProgramVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; -public class Program extends AST { +public class Program extends AbstractSyntaxTree { public Program(Command cAST, SourcePosition position) { super(position); C = cAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitProgram(this, o); + public Command C; + + public TResult visit(ProgramVisitor visitor, TArg arg) { + return visitor.visitProgram(this, arg); } - public Command C; + public TResult visit(ProgramVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CharacterLiteral.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/CharacterLiteral.java similarity index 64% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CharacterLiteral.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/CharacterLiteral.java index 58c2ab0..5a171fb 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CharacterLiteral.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/CharacterLiteral.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Terminals; +import Triangle.AbstractSyntaxTrees.Visitors.LiteralVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class CharacterLiteral extends Terminal { @@ -22,9 +23,15 @@ public class CharacterLiteral extends Terminal { super(spelling, position); } - @Override - public Object visit(Visitor v, Object o) { - return v.visitCharacterLiteral(this, o); + public TResult visit(LiteralVisitor v, TArg arg) { + return v.visitCharacterLiteral(this, arg); } + public TResult visit(LiteralVisitor visitor) { + return visit(visitor, null); + } + + public int getValue() { + return spelling.charAt(1); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Identifier.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/Identifier.java similarity index 58% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Identifier.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/Identifier.java index 6305dd0..b41ff32 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Identifier.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/Identifier.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Terminals; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.IdentifierVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class Identifier extends Terminal { @@ -24,11 +27,14 @@ public class Identifier extends Terminal { decl = null; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitIdentifier(this, o); + public TypeDenoter type; + public AbstractSyntaxTree decl; // Either a Declaration or a FieldTypeDenoter + + public TResult visit(IdentifierVisitor visitor, TArg arg) { + return visitor.visitIdentifier(this, arg); } - public TypeDenoter type; - public AST decl; // Either a Declaration or a FieldTypeDenoter + public TResult visit(IdentifierVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IntegerLiteral.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/IntegerLiteral.java similarity index 63% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IntegerLiteral.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/IntegerLiteral.java index 50bf7ed..dfdd33d 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IntegerLiteral.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/IntegerLiteral.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Terminals; +import Triangle.AbstractSyntaxTrees.Visitors.LiteralVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class IntegerLiteral extends Terminal { @@ -22,9 +23,15 @@ public class IntegerLiteral extends Terminal { super(spelling, position); } - @Override - public Object visit(Visitor v, Object o) { - return v.visitIntegerLiteral(this, o); + public TResult visit(LiteralVisitor v, TArg arg) { + return v.visitIntegerLiteral(this, arg); } + public TResult visit(LiteralVisitor visitor) { + return visit(visitor, null); + } + + public int getValue() { + return Integer.parseInt(spelling); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Operator.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/Operator.java similarity index 64% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Operator.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/Operator.java index a94a859..0cd50be 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Operator.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/Operator.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Terminals; +import Triangle.AbstractSyntaxTrees.Declarations.Declaration; +import Triangle.AbstractSyntaxTrees.Visitors.OperatorVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class Operator extends Terminal { @@ -23,10 +25,13 @@ public class Operator extends Terminal { decl = null; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitOperator(this, o); + public Declaration decl; + + public TResult visit(OperatorVisitor v, TArg arg) { + return v.visitOperator(this, arg); } - public Declaration decl; + public TResult visit(OperatorVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminal.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/Terminal.java similarity index 81% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminal.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/Terminal.java index c4e6af4..c4747ff 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminal.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Terminals/Terminal.java @@ -12,11 +12,12 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Terminals; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; import Triangle.SyntacticAnalyzer.SourcePosition; -abstract public class Terminal extends AST { +public abstract class Terminal extends AbstractSyntaxTree { public Terminal(String spelling, SourcePosition position) { super(position); diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AnyTypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/AnyTypeDenoter.java similarity index 76% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AnyTypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/AnyTypeDenoter.java index 96aa351..cd5a7fc 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/AnyTypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/AnyTypeDenoter.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class AnyTypeDenoter extends TypeDenoter { @@ -22,9 +23,8 @@ public class AnyTypeDenoter extends TypeDenoter { super(position); } - @Override - public Object visit(Visitor v, Object o) { - return v.visitAnyTypeDenoter(this, o); + public TResult visit(TypeDenoterVisitor v, TArg arg) { + return v.visitAnyTypeDenoter(this, arg); } @Override diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ArrayTypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/ArrayTypeDenoter.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ArrayTypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/ArrayTypeDenoter.java index 19ca206..26c74a7 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ArrayTypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/ArrayTypeDenoter.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class ArrayTypeDenoter extends TypeDenoter { @@ -24,22 +26,22 @@ public class ArrayTypeDenoter extends TypeDenoter { T = tAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitArrayTypeDenoter(this, o); + public TResult visit(TypeDenoterVisitor v, TArg arg) { + return v.visitArrayTypeDenoter(this, arg); } @Override public boolean equals(Object obj) { - if (obj != null && obj instanceof ErrorTypeDenoter) + if (obj != null && obj instanceof ErrorTypeDenoter) { return true; - else if (obj != null && obj instanceof ArrayTypeDenoter) + } else if (obj != null && obj instanceof ArrayTypeDenoter) { return this.IL.spelling.compareTo(((ArrayTypeDenoter) obj).IL.spelling) == 0 && this.T.equals(((ArrayTypeDenoter) obj).T); - else + } else { return false; + } } - public IntegerLiteral IL; + public final IntegerLiteral IL; public TypeDenoter T; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/BoolTypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/BoolTypeDenoter.java similarity index 72% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/BoolTypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/BoolTypeDenoter.java index 7941083..78828ab 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/BoolTypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/BoolTypeDenoter.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class BoolTypeDenoter extends TypeDenoter { @@ -22,16 +23,16 @@ public class BoolTypeDenoter extends TypeDenoter { super(position); } - @Override - public Object visit(Visitor v, Object o) { - return v.visitBoolTypeDenoter(this, o); + public TResult visit(TypeDenoterVisitor v, TArg arg) { + return v.visitBoolTypeDenoter(this, arg); } @Override public boolean equals(Object obj) { - if ((obj != null) && (obj instanceof ErrorTypeDenoter)) + if ((obj != null) && (obj instanceof ErrorTypeDenoter)) { return true; - else + } else { return ((obj != null) && (obj instanceof BoolTypeDenoter)); + } } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CharTypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/CharTypeDenoter.java similarity index 72% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CharTypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/CharTypeDenoter.java index 01121ce..c6f53fd 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/CharTypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/CharTypeDenoter.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class CharTypeDenoter extends TypeDenoter { @@ -22,16 +23,16 @@ public class CharTypeDenoter extends TypeDenoter { super(position); } - @Override - public Object visit(Visitor v, Object o) { - return v.visitCharTypeDenoter(this, o); + public TResult visit(TypeDenoterVisitor v, TArg arg) { + return v.visitCharTypeDenoter(this, arg); } @Override public boolean equals(Object obj) { - if (obj != null && obj instanceof ErrorTypeDenoter) + if (obj != null && obj instanceof ErrorTypeDenoter) { return true; - else + } else { return (obj != null && obj instanceof CharTypeDenoter); + } } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ErrorTypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/ErrorTypeDenoter.java similarity index 76% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ErrorTypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/ErrorTypeDenoter.java index f74cce5..551cdff 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/ErrorTypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/ErrorTypeDenoter.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class ErrorTypeDenoter extends TypeDenoter { @@ -22,9 +23,8 @@ public class ErrorTypeDenoter extends TypeDenoter { super(position); } - @Override - public Object visit(Visitor v, Object o) { - return v.visitErrorTypeDenoter(this, o); + public TResult visit(TypeDenoterVisitor v, TArg arg) { + return v.visitErrorTypeDenoter(this, arg); } @Override diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FieldTypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/FieldTypeDenoter.java similarity index 88% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FieldTypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/FieldTypeDenoter.java index eadb011..d729d1a 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/FieldTypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/FieldTypeDenoter.java @@ -12,7 +12,7 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; import Triangle.SyntacticAnalyzer.SourcePosition; @@ -21,7 +21,4 @@ public abstract class FieldTypeDenoter extends TypeDenoter { public FieldTypeDenoter(SourcePosition position) { super(position); } - - @Override - public abstract boolean equals(Object obj); } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IntTypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/IntTypeDenoter.java similarity index 72% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IntTypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/IntTypeDenoter.java index 9356b3b..13834e6 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/IntTypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/IntTypeDenoter.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class IntTypeDenoter extends TypeDenoter { @@ -22,16 +23,16 @@ public class IntTypeDenoter extends TypeDenoter { super(position); } - @Override - public Object visit(Visitor v, Object o) { - return v.visitIntTypeDenoter(this, o); + public TResult visit(TypeDenoterVisitor v, TArg arg) { + return v.visitIntTypeDenoter(this, arg); } @Override public boolean equals(Object obj) { - if (obj != null && obj instanceof ErrorTypeDenoter) + if (obj != null && obj instanceof ErrorTypeDenoter) { return true; - else + } else { return (obj != null && obj instanceof IntTypeDenoter); + } } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleFieldTypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/MultipleFieldTypeDenoter.java similarity index 77% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleFieldTypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/MultipleFieldTypeDenoter.java index 869a984..d414026 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/MultipleFieldTypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/MultipleFieldTypeDenoter.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class MultipleFieldTypeDenoter extends FieldTypeDenoter { @@ -26,9 +28,8 @@ public class MultipleFieldTypeDenoter extends FieldTypeDenoter { FT = ftAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitMultipleFieldTypeDenoter(this, o); + public TResult visit(TypeDenoterVisitor v, TArg arg) { + return v.visitMultipleFieldTypeDenoter(this, arg); } @Override @@ -36,11 +37,12 @@ public class MultipleFieldTypeDenoter extends FieldTypeDenoter { if (obj != null && obj instanceof MultipleFieldTypeDenoter) { MultipleFieldTypeDenoter ft = (MultipleFieldTypeDenoter) obj; return (this.I.spelling.compareTo(ft.I.spelling) == 0) && this.T.equals(ft.T) && this.FT.equals(ft.FT); - } else + } else { return false; + } } - public Identifier I; + public final Identifier I; public TypeDenoter T; public FieldTypeDenoter FT; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/RecordTypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/RecordTypeDenoter.java similarity index 70% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/RecordTypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/RecordTypeDenoter.java index 1089fc0..0535c90 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/RecordTypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/RecordTypeDenoter.java @@ -12,8 +12,9 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class RecordTypeDenoter extends TypeDenoter { @@ -23,19 +24,19 @@ public class RecordTypeDenoter extends TypeDenoter { FT = ftAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitRecordTypeDenoter(this, o); + public TResult visit(TypeDenoterVisitor v, TArg arg) { + return v.visitRecordTypeDenoter(this, arg); } @Override public boolean equals(Object obj) { - if (obj != null && obj instanceof ErrorTypeDenoter) + if (obj != null && obj instanceof ErrorTypeDenoter) { return true; - else if (obj != null && obj instanceof RecordTypeDenoter) + } else if (obj != null && obj instanceof RecordTypeDenoter) { return this.FT.equals(((RecordTypeDenoter) obj).FT); - else + } else { return false; + } } public FieldTypeDenoter FT; diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SimpleTypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/SimpleTypeDenoter.java similarity index 71% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SimpleTypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/SimpleTypeDenoter.java index 25ef45b..8d35166 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SimpleTypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/SimpleTypeDenoter.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class SimpleTypeDenoter extends TypeDenoter { @@ -23,9 +25,8 @@ public class SimpleTypeDenoter extends TypeDenoter { I = iAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitSimpleTypeDenoter(this, o); + public TResult visit(TypeDenoterVisitor v, TArg arg) { + return v.visitSimpleTypeDenoter(this, arg); } @Override @@ -33,5 +34,5 @@ public class SimpleTypeDenoter extends TypeDenoter { return false; // should not happen } - public Identifier I; + public final Identifier I; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleFieldTypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/SingleFieldTypeDenoter.java similarity index 75% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleFieldTypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/SingleFieldTypeDenoter.java index 5a4056a..093f675 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SingleFieldTypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/SingleFieldTypeDenoter.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class SingleFieldTypeDenoter extends FieldTypeDenoter { @@ -24,9 +26,8 @@ public class SingleFieldTypeDenoter extends FieldTypeDenoter { T = tAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitSingleFieldTypeDenoter(this, o); + public TResult visit(TypeDenoterVisitor v, TArg arg) { + return v.visitSingleFieldTypeDenoter(this, arg); } @Override @@ -34,10 +35,11 @@ public class SingleFieldTypeDenoter extends FieldTypeDenoter { if (obj != null && obj instanceof SingleFieldTypeDenoter) { SingleFieldTypeDenoter ft = (SingleFieldTypeDenoter) obj; return (this.I.spelling.compareTo(ft.I.spelling) == 0) && this.T.equals(ft.T); - } else + } else { return false; + } } - public Identifier I; + public final Identifier I; public TypeDenoter T; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/TypeDeclaration.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/TypeDeclaration.java similarity index 67% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/TypeDeclaration.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/TypeDeclaration.java index a5ff149..8870509 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/TypeDeclaration.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/TypeDeclaration.java @@ -12,8 +12,11 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.Declarations.Declaration; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class TypeDeclaration extends Declaration { @@ -24,11 +27,10 @@ public class TypeDeclaration extends Declaration { T = tAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitTypeDeclaration(this, o); + public TResult visit(DeclarationVisitor v, TArg arg) { + return v.visitTypeDeclaration(this, arg); } - public Identifier I; + public final Identifier I; public TypeDenoter T; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/TypeDenoter.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/TypeDenoter.java similarity index 61% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/TypeDenoter.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/TypeDenoter.java index 2d1e5de..015d08b 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/TypeDenoter.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Types/TypeDenoter.java @@ -12,11 +12,13 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Types; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; -public abstract class TypeDenoter extends AST { +public abstract class TypeDenoter extends AbstractSyntaxTree { public TypeDenoter(SourcePosition position) { super(position); @@ -25,4 +27,9 @@ public abstract class TypeDenoter extends AST { @Override public abstract boolean equals(Object obj); + public abstract TResult visit(TypeDenoterVisitor visitor, TArg arg); + + public TResult visit(TypeDenoterVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitor.java deleted file mode 100644 index b40caac..0000000 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitor.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * @(#)Visitor.java 2.1 2003/10/07 - * - * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown - * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland - * and School of Computer and Math Sciences, The Robert Gordon University, - * St. Andrew Street, Aberdeen AB25 1HG, Scotland. - * All rights reserved. - * - * This software is provided free for educational use only. It may - * not be used for commercial purposes without the prior written permission - * of the authors. - */ - -package Triangle.AbstractSyntaxTrees; - -public interface Visitor { - - // Commands - Object visitAssignCommand(AssignCommand ast, Object o); - - Object visitCallCommand(CallCommand ast, Object o); - - Object visitEmptyCommand(EmptyCommand ast, Object o); - - Object visitIfCommand(IfCommand ast, Object o); - - Object visitLetCommand(LetCommand ast, Object o); - - Object visitSequentialCommand(SequentialCommand ast, Object o); - - Object visitWhileCommand(WhileCommand ast, Object o); - - // Expressions - Object visitArrayExpression(ArrayExpression ast, Object o); - - Object visitBinaryExpression(BinaryExpression ast, Object o); - - Object visitCallExpression(CallExpression ast, Object o); - - Object visitCharacterExpression(CharacterExpression ast, Object o); - - Object visitEmptyExpression(EmptyExpression ast, Object o); - - Object visitIfExpression(IfExpression ast, Object o); - - Object visitIntegerExpression(IntegerExpression ast, Object o); - - Object visitLetExpression(LetExpression ast, Object o); - - Object visitRecordExpression(RecordExpression ast, Object o); - - Object visitUnaryExpression(UnaryExpression ast, Object o); - - Object visitVnameExpression(VnameExpression ast, Object o); - - // Declarations - Object visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, Object o); - - Object visitConstDeclaration(ConstDeclaration ast, Object o); - - Object visitFuncDeclaration(FuncDeclaration ast, Object o); - - Object visitProcDeclaration(ProcDeclaration ast, Object o); - - Object visitSequentialDeclaration(SequentialDeclaration ast, Object o); - - Object visitTypeDeclaration(TypeDeclaration ast, Object o); - - Object visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Object o); - - Object visitVarDeclaration(VarDeclaration ast, Object o); - - // Array Aggregates - Object visitMultipleArrayAggregate(MultipleArrayAggregate ast, Object o); - - Object visitSingleArrayAggregate(SingleArrayAggregate ast, Object o); - - // Record Aggregates - Object visitMultipleRecordAggregate(MultipleRecordAggregate ast, Object o); - - Object visitSingleRecordAggregate(SingleRecordAggregate ast, Object o); - - // Formal Parameters - Object visitConstFormalParameter(ConstFormalParameter ast, Object o); - - Object visitFuncFormalParameter(FuncFormalParameter ast, Object o); - - Object visitProcFormalParameter(ProcFormalParameter ast, Object o); - - Object visitVarFormalParameter(VarFormalParameter ast, Object o); - - Object visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Object o); - - Object visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Object o); - - Object visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Object o); - - // Actual Parameters - Object visitConstActualParameter(ConstActualParameter ast, Object o); - - Object visitFuncActualParameter(FuncActualParameter ast, Object o); - - Object visitProcActualParameter(ProcActualParameter ast, Object o); - - Object visitVarActualParameter(VarActualParameter ast, Object o); - - Object visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, Object o); - - Object visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, Object o); - - Object visitSingleActualParameterSequence(SingleActualParameterSequence ast, Object o); - - // Type Denoters - Object visitAnyTypeDenoter(AnyTypeDenoter ast, Object o); - - Object visitArrayTypeDenoter(ArrayTypeDenoter ast, Object o); - - Object visitBoolTypeDenoter(BoolTypeDenoter ast, Object o); - - Object visitCharTypeDenoter(CharTypeDenoter ast, Object o); - - Object visitErrorTypeDenoter(ErrorTypeDenoter ast, Object o); - - Object visitSimpleTypeDenoter(SimpleTypeDenoter ast, Object o); - - Object visitIntTypeDenoter(IntTypeDenoter ast, Object o); - - Object visitRecordTypeDenoter(RecordTypeDenoter ast, Object o); - - Object visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Object o); - - Object visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, Object o); - - // Literals, Identifiers and Operators - Object visitCharacterLiteral(CharacterLiteral ast, Object o); - - Object visitIdentifier(Identifier ast, Object o); - - Object visitIntegerLiteral(IntegerLiteral ast, Object o); - - Object visitOperator(Operator ast, Object o); - - // Value-or-variable names - Object visitDotVname(DotVname ast, Object o); - - Object visitSimpleVname(SimpleVname ast, Object o); - - Object visitSubscriptVname(SubscriptVname ast, Object o); - - // Programs - Object visitProgram(Program ast, Object o); - -} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ActualParameterSequenceVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ActualParameterSequenceVisitor.java new file mode 100644 index 0000000..533552a --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ActualParameterSequenceVisitor.java @@ -0,0 +1,15 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Actuals.EmptyActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.MultipleActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.SingleActualParameterSequence; + +public interface ActualParameterSequenceVisitor { + + TResult visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, TArg arg); + + TResult visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, TArg arg); + + TResult visitSingleActualParameterSequence(SingleActualParameterSequence ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ActualParameterVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ActualParameterVisitor.java new file mode 100644 index 0000000..b376cde --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ActualParameterVisitor.java @@ -0,0 +1,18 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Actuals.ConstActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.FuncActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.ProcActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.VarActualParameter; + +public interface ActualParameterVisitor { + + TResult visitConstActualParameter(ConstActualParameter ast, TArg arg); + + TResult visitFuncActualParameter(FuncActualParameter ast, TArg arg); + + TResult visitProcActualParameter(ProcActualParameter ast, TArg arg); + + TResult visitVarActualParameter(VarActualParameter ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ArrayAggregateVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ArrayAggregateVisitor.java new file mode 100644 index 0000000..197d7da --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ArrayAggregateVisitor.java @@ -0,0 +1,12 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Aggregates.MultipleArrayAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.SingleArrayAggregate; + +public interface ArrayAggregateVisitor { + + TResult visitMultipleArrayAggregate(MultipleArrayAggregate ast, TArg arg); + + TResult visitSingleArrayAggregate(SingleArrayAggregate ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/CommandVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/CommandVisitor.java new file mode 100644 index 0000000..7f9efea --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/CommandVisitor.java @@ -0,0 +1,27 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Commands.AssignCommand; +import Triangle.AbstractSyntaxTrees.Commands.CallCommand; +import Triangle.AbstractSyntaxTrees.Commands.EmptyCommand; +import Triangle.AbstractSyntaxTrees.Commands.IfCommand; +import Triangle.AbstractSyntaxTrees.Commands.LetCommand; +import Triangle.AbstractSyntaxTrees.Commands.SequentialCommand; +import Triangle.AbstractSyntaxTrees.Commands.WhileCommand; + +public interface CommandVisitor { + + TResult visitAssignCommand(AssignCommand ast, TArg arg); + + TResult visitCallCommand(CallCommand ast, TArg arg); + + TResult visitEmptyCommand(EmptyCommand ast, TArg arg); + + TResult visitIfCommand(IfCommand ast, TArg arg); + + TResult visitLetCommand(LetCommand ast, TArg arg); + + TResult visitSequentialCommand(SequentialCommand ast, TArg arg); + + TResult visitWhileCommand(WhileCommand ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/DeclarationVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/DeclarationVisitor.java new file mode 100644 index 0000000..2d31430 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/DeclarationVisitor.java @@ -0,0 +1,30 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Declarations.BinaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.ConstDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.FuncDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.ProcDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.SequentialDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.UnaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.VarDeclaration; +import Triangle.AbstractSyntaxTrees.Types.TypeDeclaration; + +public interface DeclarationVisitor extends FormalParameterVisitor { + + TResult visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, TArg arg); + + TResult visitConstDeclaration(ConstDeclaration ast, TArg arg); + + TResult visitFuncDeclaration(FuncDeclaration ast, TArg arg); + + TResult visitProcDeclaration(ProcDeclaration ast, TArg arg); + + TResult visitSequentialDeclaration(SequentialDeclaration ast, TArg arg); + + TResult visitTypeDeclaration(TypeDeclaration ast, TArg arg); + + TResult visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, TArg arg); + + TResult visitVarDeclaration(VarDeclaration ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ExpressionVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ExpressionVisitor.java new file mode 100644 index 0000000..776d5e6 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ExpressionVisitor.java @@ -0,0 +1,39 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Expressions.ArrayExpression; +import Triangle.AbstractSyntaxTrees.Expressions.BinaryExpression; +import Triangle.AbstractSyntaxTrees.Expressions.CallExpression; +import Triangle.AbstractSyntaxTrees.Expressions.CharacterExpression; +import Triangle.AbstractSyntaxTrees.Expressions.EmptyExpression; +import Triangle.AbstractSyntaxTrees.Expressions.IfExpression; +import Triangle.AbstractSyntaxTrees.Expressions.IntegerExpression; +import Triangle.AbstractSyntaxTrees.Expressions.LetExpression; +import Triangle.AbstractSyntaxTrees.Expressions.RecordExpression; +import Triangle.AbstractSyntaxTrees.Expressions.UnaryExpression; +import Triangle.AbstractSyntaxTrees.Expressions.VnameExpression; + +public interface ExpressionVisitor { + + TResult visitArrayExpression(ArrayExpression ast, TArg arg); + + TResult visitBinaryExpression(BinaryExpression ast, TArg arg); + + TResult visitCallExpression(CallExpression ast, TArg arg); + + TResult visitCharacterExpression(CharacterExpression ast, TArg arg); + + TResult visitEmptyExpression(EmptyExpression ast, TArg arg); + + TResult visitIfExpression(IfExpression ast, TArg arg); + + TResult visitIntegerExpression(IntegerExpression ast, TArg arg); + + TResult visitLetExpression(LetExpression ast, TArg arg); + + TResult visitRecordExpression(RecordExpression ast, TArg arg); + + TResult visitUnaryExpression(UnaryExpression ast, TArg arg); + + TResult visitVnameExpression(VnameExpression ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/FieldTypeDenoterVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/FieldTypeDenoterVisitor.java new file mode 100644 index 0000000..518f65e --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/FieldTypeDenoterVisitor.java @@ -0,0 +1,12 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Types.MultipleFieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.SingleFieldTypeDenoter; + +public interface FieldTypeDenoterVisitor { + + TResult visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, TArg arg); + + TResult visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/FormalParameterSequenceVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/FormalParameterSequenceVisitor.java new file mode 100644 index 0000000..7a570ba --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/FormalParameterSequenceVisitor.java @@ -0,0 +1,15 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Formals.EmptyFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.MultipleFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.SingleFormalParameterSequence; + +public interface FormalParameterSequenceVisitor { + + TResult visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, TArg arg); + + TResult visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, TArg arg); + + TResult visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/FormalParameterVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/FormalParameterVisitor.java new file mode 100644 index 0000000..2a9edd1 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/FormalParameterVisitor.java @@ -0,0 +1,18 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Formals.ConstFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.FuncFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.ProcFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.VarFormalParameter; + +public interface FormalParameterVisitor { + + TResult visitConstFormalParameter(ConstFormalParameter ast, TArg arg); + + TResult visitFuncFormalParameter(FuncFormalParameter ast, TArg arg); + + TResult visitProcFormalParameter(ProcFormalParameter ast, TArg arg); + + TResult visitVarFormalParameter(VarFormalParameter ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/IdentifierVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/IdentifierVisitor.java new file mode 100644 index 0000000..40a6141 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/IdentifierVisitor.java @@ -0,0 +1,9 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; + +public interface IdentifierVisitor { + + TResult visitIdentifier(Identifier ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/LiteralVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/LiteralVisitor.java new file mode 100644 index 0000000..f5021e7 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/LiteralVisitor.java @@ -0,0 +1,12 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Terminals.CharacterLiteral; +import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral; + +public interface LiteralVisitor { + + TResult visitCharacterLiteral(CharacterLiteral ast, TArg arg); + + TResult visitIntegerLiteral(IntegerLiteral ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/OperatorVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/OperatorVisitor.java new file mode 100644 index 0000000..bfeed74 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/OperatorVisitor.java @@ -0,0 +1,9 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Terminals.Operator; + +public interface OperatorVisitor { + + TResult visitOperator(Operator ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ProgramVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ProgramVisitor.java new file mode 100644 index 0000000..9601e1b --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/ProgramVisitor.java @@ -0,0 +1,9 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Program; + +public interface ProgramVisitor { + + TResult visitProgram(Program ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/RecordAggregateVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/RecordAggregateVisitor.java new file mode 100644 index 0000000..4a818e7 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/RecordAggregateVisitor.java @@ -0,0 +1,12 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Aggregates.MultipleRecordAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.SingleRecordAggregate; + +public interface RecordAggregateVisitor { + + TResult visitMultipleRecordAggregate(MultipleRecordAggregate ast, TArg arg); + + TResult visitSingleRecordAggregate(SingleRecordAggregate ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/TypeDenoterVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/TypeDenoterVisitor.java new file mode 100644 index 0000000..2208acb --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/TypeDenoterVisitor.java @@ -0,0 +1,30 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Types.AnyTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.ArrayTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.BoolTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.CharTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.ErrorTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.IntTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.RecordTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.SimpleTypeDenoter; + +public interface TypeDenoterVisitor extends FieldTypeDenoterVisitor { + + TResult visitAnyTypeDenoter(AnyTypeDenoter ast, TArg arg); + + TResult visitArrayTypeDenoter(ArrayTypeDenoter ast, TArg arg); + + TResult visitBoolTypeDenoter(BoolTypeDenoter ast, TArg arg); + + TResult visitCharTypeDenoter(CharTypeDenoter ast, TArg arg); + + TResult visitErrorTypeDenoter(ErrorTypeDenoter ast, TArg arg); + + TResult visitSimpleTypeDenoter(SimpleTypeDenoter ast, TArg arg); + + TResult visitIntTypeDenoter(IntTypeDenoter ast, TArg arg); + + TResult visitRecordTypeDenoter(RecordTypeDenoter ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/VnameVisitor.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/VnameVisitor.java new file mode 100644 index 0000000..7c1968a --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Visitors/VnameVisitor.java @@ -0,0 +1,15 @@ +package Triangle.AbstractSyntaxTrees.Visitors; + +import Triangle.AbstractSyntaxTrees.Vnames.DotVname; +import Triangle.AbstractSyntaxTrees.Vnames.SimpleVname; +import Triangle.AbstractSyntaxTrees.Vnames.SubscriptVname; + +public interface VnameVisitor { + + TResult visitDotVname(DotVname ast, TArg arg); + + TResult visitSimpleVname(SimpleVname ast, TArg arg); + + TResult visitSubscriptVname(SubscriptVname ast, TArg arg); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/DotVname.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/DotVname.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/DotVname.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/DotVname.java index f07f45f..4f25dfc 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/DotVname.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/DotVname.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Vnames; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class DotVname extends Vname { @@ -24,11 +26,10 @@ public class DotVname extends Vname { I = iAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitDotVname(this, o); + public TResult visit(VnameVisitor v, TArg arg) { + return v.visitDotVname(this, arg); } - public Identifier I; - public Vname V; + public final Identifier I; + public final Vname V; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SimpleVname.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/SimpleVname.java similarity index 69% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SimpleVname.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/SimpleVname.java index 4a89017..c107131 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SimpleVname.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/SimpleVname.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Vnames; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class SimpleVname extends Vname { @@ -23,10 +25,9 @@ public class SimpleVname extends Vname { I = iAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitSimpleVname(this, o); + public TResult visit(VnameVisitor v, TArg arg) { + return v.visitSimpleVname(this, arg); } - public Identifier I; + public final Identifier I; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SubscriptVname.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/SubscriptVname.java similarity index 68% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SubscriptVname.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/SubscriptVname.java index 1fc80a7..adff222 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/SubscriptVname.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/SubscriptVname.java @@ -12,8 +12,10 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Vnames; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; public class SubscriptVname extends Vname { @@ -24,11 +26,10 @@ public class SubscriptVname extends Vname { E = eAST; } - @Override - public Object visit(Visitor v, Object o) { - return v.visitSubscriptVname(this, o); + public TResult visit(VnameVisitor v, TArg arg) { + return v.visitSubscriptVname(this, arg); } - public Expression E; - public Vname V; + public final Expression E; + public final Vname V; } diff --git a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vname.java b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/Vname.java similarity index 60% rename from Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vname.java rename to Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/Vname.java index 7103179..c630829 100644 --- a/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vname.java +++ b/Triangle.Compiler/src/main/java/Triangle/AbstractSyntaxTrees/Vnames/Vname.java @@ -12,11 +12,14 @@ * of the authors. */ -package Triangle.AbstractSyntaxTrees; +package Triangle.AbstractSyntaxTrees.Vnames; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor; import Triangle.SyntacticAnalyzer.SourcePosition; -public abstract class Vname extends AST { +public abstract class Vname extends AbstractSyntaxTree { public Vname(SourcePosition position) { super(position); @@ -27,4 +30,10 @@ public abstract class Vname extends AST { public boolean variable, indexed; public int offset; public TypeDenoter type; + + public abstract TResult visit(VnameVisitor visitor, TArg arg); + + public TResult visit(VnameVisitor visitor) { + return visit(visitor, null); + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Emitter.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Emitter.java new file mode 100644 index 0000000..f8aa600 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Emitter.java @@ -0,0 +1,120 @@ +package Triangle.CodeGenerator; + +import java.io.DataOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + +import Triangle.ErrorReporter; +import Triangle.AbstractMachine.Instruction; +import Triangle.AbstractMachine.Machine; +import Triangle.AbstractMachine.OpCode; +import Triangle.AbstractMachine.Primitive; +import Triangle.AbstractMachine.Register; + +public class Emitter { + + // OBJECT CODE + + // Implementation notes: + // Object code is generated directly into the TAM Code Store, starting at + // CB. + // The address of the next instruction is held in nextInstrAddr. + + ErrorReporter errorReporter; + + int nextInstrAddr; + + public Emitter(ErrorReporter errorReporter) { + this.errorReporter = errorReporter; + nextInstrAddr = Machine.CB; + } + + public int getNextInstrAddr() { + return nextInstrAddr; + } + + public int emit(OpCode op) { + return emit(op, 0, Register.CB, 0); + } + + public int emit(OpCode op, int operand) { + return emit(op, 0, Register.CB, operand); + } + + public int emit(OpCode op, int length, int operand) { + return emit(op, length, Register.CB, operand); + } + + public int emit(OpCode op, Register staticRegister, Register register, int operand) { + return emit(op, staticRegister.ordinal(), register, operand); + } + + public int emit(OpCode op, Register register, int operand) { + return emit(op, 0, register, operand); + } + + public int emit(OpCode op, Register register) { + return emit(op, 0, register, 0); + } + + public int emit(OpCode op, int length, Register register) { + return emit(op, length, register, 0); + } + + public int emit(OpCode op, Register register, Primitive primitive) { + return emit(op, 0, register, primitive.ordinal()); + } + + /** + * Appends an instruction, with the given fields, to the object code. + * + * @param op the opcode + * @param length the length field + * @param register the register field + * @param operand the operand field + * @return the code address of the new instruction + **/ + public int emit(OpCode op, int length, Register register, int operand) { + + if (length > 255) { + errorReporter.reportRestriction("length of operand can't exceed 255 words"); + length = 255; // to allow code generation to continue + } + + var nextInstr = new Instruction(op, register, length, operand); + + var currentInstrAddr = nextInstrAddr; + if (nextInstrAddr == Machine.PB) { + errorReporter.reportRestriction("too many instructions for code segment"); + } else { + Machine.code[nextInstrAddr++] = nextInstr; + } + return currentInstrAddr; + + } + + // Patches the d-field of the instruction at address addr with the next + // instruction address. + public void patch(int addr) { + Machine.code[addr].setOperand(nextInstrAddr); + } + + /** + * Saves the object program in the given object file. + * + * @param objectFile the object file + */ + public void saveObjectProgram(String objectFileName) { + try (var objectFile = new FileOutputStream(objectFileName)) { + var objectStream = new DataOutputStream(objectFile); + for (var addr = Machine.CB; addr < nextInstrAddr; addr++) { + Machine.code[addr].write(objectStream); + } + } catch (FileNotFoundException fnfe) { + System.err.println("Error opening object file: " + fnfe); + } catch (IOException ioe) { + System.err.println("Error writing object file: " + ioe); + } + } +} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Encoder.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Encoder.java index 168d165..82b8f69 100644 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Encoder.java +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Encoder.java @@ -14,770 +14,755 @@ package Triangle.CodeGenerator; -import java.io.DataOutputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; - import Triangle.ErrorReporter; import Triangle.StdEnvironment; -import Triangle.AbstractMachine.Instruction; import Triangle.AbstractMachine.Machine; -import Triangle.AbstractSyntaxTrees.AST; -import Triangle.AbstractSyntaxTrees.AnyTypeDenoter; -import Triangle.AbstractSyntaxTrees.ArrayExpression; -import Triangle.AbstractSyntaxTrees.ArrayTypeDenoter; -import Triangle.AbstractSyntaxTrees.AssignCommand; -import Triangle.AbstractSyntaxTrees.BinaryExpression; -import Triangle.AbstractSyntaxTrees.BinaryOperatorDeclaration; -import Triangle.AbstractSyntaxTrees.BoolTypeDenoter; -import Triangle.AbstractSyntaxTrees.CallCommand; -import Triangle.AbstractSyntaxTrees.CallExpression; -import Triangle.AbstractSyntaxTrees.CharTypeDenoter; -import Triangle.AbstractSyntaxTrees.CharacterExpression; -import Triangle.AbstractSyntaxTrees.CharacterLiteral; -import Triangle.AbstractSyntaxTrees.ConstActualParameter; -import Triangle.AbstractSyntaxTrees.ConstDeclaration; -import Triangle.AbstractSyntaxTrees.ConstFormalParameter; -import Triangle.AbstractSyntaxTrees.Declaration; -import Triangle.AbstractSyntaxTrees.DotVname; -import Triangle.AbstractSyntaxTrees.EmptyActualParameterSequence; -import Triangle.AbstractSyntaxTrees.EmptyCommand; -import Triangle.AbstractSyntaxTrees.EmptyExpression; -import Triangle.AbstractSyntaxTrees.EmptyFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.ErrorTypeDenoter; -import Triangle.AbstractSyntaxTrees.FuncActualParameter; -import Triangle.AbstractSyntaxTrees.FuncDeclaration; -import Triangle.AbstractSyntaxTrees.FuncFormalParameter; -import Triangle.AbstractSyntaxTrees.Identifier; -import Triangle.AbstractSyntaxTrees.IfCommand; -import Triangle.AbstractSyntaxTrees.IfExpression; -import Triangle.AbstractSyntaxTrees.IntTypeDenoter; -import Triangle.AbstractSyntaxTrees.IntegerExpression; -import Triangle.AbstractSyntaxTrees.IntegerLiteral; -import Triangle.AbstractSyntaxTrees.LetCommand; -import Triangle.AbstractSyntaxTrees.LetExpression; -import Triangle.AbstractSyntaxTrees.MultipleActualParameterSequence; -import Triangle.AbstractSyntaxTrees.MultipleArrayAggregate; -import Triangle.AbstractSyntaxTrees.MultipleFieldTypeDenoter; -import Triangle.AbstractSyntaxTrees.MultipleFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.MultipleRecordAggregate; -import Triangle.AbstractSyntaxTrees.Operator; -import Triangle.AbstractSyntaxTrees.ProcActualParameter; -import Triangle.AbstractSyntaxTrees.ProcDeclaration; -import Triangle.AbstractSyntaxTrees.ProcFormalParameter; +import Triangle.AbstractMachine.OpCode; +import Triangle.AbstractMachine.Primitive; +import Triangle.AbstractMachine.Register; +import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree; import Triangle.AbstractSyntaxTrees.Program; -import Triangle.AbstractSyntaxTrees.RecordExpression; -import Triangle.AbstractSyntaxTrees.RecordTypeDenoter; -import Triangle.AbstractSyntaxTrees.SequentialCommand; -import Triangle.AbstractSyntaxTrees.SequentialDeclaration; -import Triangle.AbstractSyntaxTrees.SimpleTypeDenoter; -import Triangle.AbstractSyntaxTrees.SimpleVname; -import Triangle.AbstractSyntaxTrees.SingleActualParameterSequence; -import Triangle.AbstractSyntaxTrees.SingleArrayAggregate; -import Triangle.AbstractSyntaxTrees.SingleFieldTypeDenoter; -import Triangle.AbstractSyntaxTrees.SingleFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.SingleRecordAggregate; -import Triangle.AbstractSyntaxTrees.SubscriptVname; -import Triangle.AbstractSyntaxTrees.TypeDeclaration; -import Triangle.AbstractSyntaxTrees.UnaryExpression; -import Triangle.AbstractSyntaxTrees.UnaryOperatorDeclaration; -import Triangle.AbstractSyntaxTrees.VarActualParameter; -import Triangle.AbstractSyntaxTrees.VarDeclaration; -import Triangle.AbstractSyntaxTrees.VarFormalParameter; -import Triangle.AbstractSyntaxTrees.Visitor; -import Triangle.AbstractSyntaxTrees.Vname; -import Triangle.AbstractSyntaxTrees.VnameExpression; -import Triangle.AbstractSyntaxTrees.WhileCommand; - -public final class Encoder implements Visitor { +import Triangle.AbstractSyntaxTrees.Actuals.ConstActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.EmptyActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.FuncActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.MultipleActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.ProcActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.SingleActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.VarActualParameter; +import Triangle.AbstractSyntaxTrees.Aggregates.MultipleArrayAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.MultipleRecordAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.SingleArrayAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.SingleRecordAggregate; +import Triangle.AbstractSyntaxTrees.Commands.AssignCommand; +import Triangle.AbstractSyntaxTrees.Commands.CallCommand; +import Triangle.AbstractSyntaxTrees.Commands.EmptyCommand; +import Triangle.AbstractSyntaxTrees.Commands.IfCommand; +import Triangle.AbstractSyntaxTrees.Commands.LetCommand; +import Triangle.AbstractSyntaxTrees.Commands.SequentialCommand; +import Triangle.AbstractSyntaxTrees.Commands.WhileCommand; +import Triangle.AbstractSyntaxTrees.Declarations.BinaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.ConstDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.Declaration; +import Triangle.AbstractSyntaxTrees.Declarations.FuncDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.ProcDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.SequentialDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.UnaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.VarDeclaration; +import Triangle.AbstractSyntaxTrees.Expressions.ArrayExpression; +import Triangle.AbstractSyntaxTrees.Expressions.BinaryExpression; +import Triangle.AbstractSyntaxTrees.Expressions.CallExpression; +import Triangle.AbstractSyntaxTrees.Expressions.CharacterExpression; +import Triangle.AbstractSyntaxTrees.Expressions.EmptyExpression; +import Triangle.AbstractSyntaxTrees.Expressions.IfExpression; +import Triangle.AbstractSyntaxTrees.Expressions.IntegerExpression; +import Triangle.AbstractSyntaxTrees.Expressions.LetExpression; +import Triangle.AbstractSyntaxTrees.Expressions.RecordExpression; +import Triangle.AbstractSyntaxTrees.Expressions.UnaryExpression; +import Triangle.AbstractSyntaxTrees.Expressions.VnameExpression; +import Triangle.AbstractSyntaxTrees.Formals.ConstFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.EmptyFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.FuncFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.MultipleFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.ProcFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.SingleFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.VarFormalParameter; +import Triangle.AbstractSyntaxTrees.Terminals.CharacterLiteral; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral; +import Triangle.AbstractSyntaxTrees.Terminals.Operator; +import Triangle.AbstractSyntaxTrees.Types.AnyTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.ArrayTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.BoolTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.CharTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.ErrorTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.IntTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.MultipleFieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.RecordTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.SimpleTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.SingleFieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.TypeDeclaration; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.IdentifierVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.LiteralVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.OperatorVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ProgramVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.RecordAggregateVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor; +import Triangle.AbstractSyntaxTrees.Vnames.DotVname; +import Triangle.AbstractSyntaxTrees.Vnames.SimpleVname; +import Triangle.AbstractSyntaxTrees.Vnames.SubscriptVname; +import Triangle.AbstractSyntaxTrees.Vnames.Vname; +import Triangle.CodeGenerator.Entities.AddressableEntity; +import Triangle.CodeGenerator.Entities.EqualityRoutine; +import Triangle.CodeGenerator.Entities.FetchableEntity; +import Triangle.CodeGenerator.Entities.Field; +import Triangle.CodeGenerator.Entities.KnownAddress; +import Triangle.CodeGenerator.Entities.KnownRoutine; +import Triangle.CodeGenerator.Entities.KnownValue; +import Triangle.CodeGenerator.Entities.PrimitiveRoutine; +import Triangle.CodeGenerator.Entities.RuntimeEntity; +import Triangle.CodeGenerator.Entities.TypeRepresentation; +import Triangle.CodeGenerator.Entities.UnknownAddress; +import Triangle.CodeGenerator.Entities.UnknownRoutine; +import Triangle.CodeGenerator.Entities.UnknownValue; + +public final class Encoder + implements ActualParameterVisitor, ActualParameterSequenceVisitor, + ArrayAggregateVisitor, CommandVisitor, DeclarationVisitor, + ExpressionVisitor, FormalParameterVisitor, + FormalParameterSequenceVisitor, IdentifierVisitor, LiteralVisitor, + OperatorVisitor, ProgramVisitor, RecordAggregateVisitor, + TypeDenoterVisitor, VnameVisitor { // Commands @Override - public Object visitAssignCommand(AssignCommand ast, Object o) { - Frame frame = (Frame) o; - Integer valSize = (Integer) ast.E.visit(this, frame); - encodeStore(ast.V, new Frame(frame, valSize.intValue()), valSize.intValue()); + public Void visitAssignCommand(AssignCommand ast, Frame frame) { + var valSize = ast.E.visit(this, frame); + encodeStore(ast.V, frame.expand(valSize), valSize); return null; } @Override - public Object visitCallCommand(CallCommand ast, Object o) { - Frame frame = (Frame) o; - Integer argsSize = (Integer) ast.APS.visit(this, frame); - ast.I.visit(this, new Frame(frame.level, argsSize)); + public Void visitCallCommand(CallCommand ast, Frame frame) { + var argsSize = ast.APS.visit(this, frame); + ast.I.visit(this, frame.replace(argsSize)); return null; } @Override - public Object visitEmptyCommand(EmptyCommand ast, Object o) { + public Void visitEmptyCommand(EmptyCommand ast, Frame frame) { return null; } @Override - public Object visitIfCommand(IfCommand ast, Object o) { - Frame frame = (Frame) o; - int jumpifAddr, jumpAddr; - - Integer valSize = (Integer) ast.E.visit(this, frame); - jumpifAddr = nextInstrAddr; - emit(Machine.JUMPIFop, Machine.falseRep, Machine.CBr, 0); + public Void visitIfCommand(IfCommand ast, Frame frame) { + ast.E.visit(this, frame); + var jumpifAddr = emitter.emit(OpCode.JUMPIF, Machine.falseRep, Register.CB, 0); ast.C1.visit(this, frame); - jumpAddr = nextInstrAddr; - emit(Machine.JUMPop, 0, Machine.CBr, 0); - patch(jumpifAddr, nextInstrAddr); + var jumpAddr = emitter.emit(OpCode.JUMP, 0, Register.CB, 0); + emitter.patch(jumpifAddr); ast.C2.visit(this, frame); - patch(jumpAddr, nextInstrAddr); + emitter.patch(jumpAddr); return null; } @Override - public Object visitLetCommand(LetCommand ast, Object o) { - Frame frame = (Frame) o; - int extraSize = ((Integer) ast.D.visit(this, frame)).intValue(); - ast.C.visit(this, new Frame(frame, extraSize)); - if (extraSize > 0) - emit(Machine.POPop, 0, 0, extraSize); + public Void visitLetCommand(LetCommand ast, Frame frame) { + var extraSize = ast.D.visit(this, frame); + ast.C.visit(this, frame.expand(extraSize)); + if (extraSize > 0) { + emitter.emit(OpCode.POP, extraSize); + } return null; } @Override - public Object visitSequentialCommand(SequentialCommand ast, Object o) { - ast.C1.visit(this, o); - ast.C2.visit(this, o); + public Void visitSequentialCommand(SequentialCommand ast, Frame frame) { + ast.C1.visit(this, frame); + ast.C2.visit(this, frame); return null; } @Override - public Object visitWhileCommand(WhileCommand ast, Object o) { - Frame frame = (Frame) o; - int jumpAddr, loopAddr; - - jumpAddr = nextInstrAddr; - emit(Machine.JUMPop, 0, Machine.CBr, 0); - loopAddr = nextInstrAddr; + public Void visitWhileCommand(WhileCommand ast, Frame frame) { + var jumpAddr = emitter.emit(OpCode.JUMP, 0, Register.CB, 0); + var loopAddr = emitter.getNextInstrAddr(); ast.C.visit(this, frame); - patch(jumpAddr, nextInstrAddr); + emitter.patch(jumpAddr); ast.E.visit(this, frame); - emit(Machine.JUMPIFop, Machine.trueRep, Machine.CBr, loopAddr); + emitter.emit(OpCode.JUMPIF, Machine.trueRep, Register.CB, loopAddr); return null; } // Expressions @Override - public Object visitArrayExpression(ArrayExpression ast, Object o) { - ast.type.visit(this); - return ast.AA.visit(this, o); + public Integer visitArrayExpression(ArrayExpression ast, Frame frame) { + ast.type.visit(this, frame); + return ast.AA.visit(this, frame); } @Override - public Object visitBinaryExpression(BinaryExpression ast, Object o) { - Frame frame = (Frame) o; - Integer valSize = (Integer) ast.type.visit(this); - int valSize1 = ((Integer) ast.E1.visit(this, frame)).intValue(); - Frame frame1 = new Frame(frame, valSize1); - int valSize2 = ((Integer) ast.E2.visit(this, frame1)).intValue(); - Frame frame2 = new Frame(frame.level, valSize1 + valSize2); + public Integer visitBinaryExpression(BinaryExpression ast, Frame frame) { + var valSize = ast.type.visit(this); + var valSize1 = ast.E1.visit(this, frame); + var frame1 = frame.expand(valSize1); + var valSize2 = ast.E2.visit(this, frame1); + var frame2 = frame.replace(valSize1 + valSize2); ast.O.visit(this, frame2); return valSize; } @Override - public Object visitCallExpression(CallExpression ast, Object o) { - Frame frame = (Frame) o; - Integer valSize = (Integer) ast.type.visit(this); - Integer argsSize = (Integer) ast.APS.visit(this, frame); - ast.I.visit(this, new Frame(frame.level, argsSize)); + public Integer visitCallExpression(CallExpression ast, Frame frame) { + var valSize = ast.type.visit(this); + var argsSize = ast.APS.visit(this, frame); + ast.I.visit(this, frame.replace(argsSize)); return valSize; } @Override - public Object visitCharacterExpression(CharacterExpression ast, Object o) { - Frame frame = (Frame) o; - Integer valSize = (Integer) ast.type.visit(this); - emit(Machine.LOADLop, 0, 0, ast.CL.spelling.charAt(1)); + public Integer visitCharacterExpression(CharacterExpression ast, Frame frame) { + var valSize = ast.type.visit(this); + emitter.emit(OpCode.LOADL, ast.CL.spelling.charAt(1)); return valSize; } @Override - public Object visitEmptyExpression(EmptyExpression ast, Object o) { - return Integer.valueOf(0); + public Integer visitEmptyExpression(EmptyExpression ast, Frame frame) { + return 0; } @Override - public Object visitIfExpression(IfExpression ast, Object o) { - Frame frame = (Frame) o; - Integer valSize; - int jumpifAddr, jumpAddr; - + public Integer visitIfExpression(IfExpression ast, Frame frame) { ast.type.visit(this); ast.E1.visit(this, frame); - jumpifAddr = nextInstrAddr; - emit(Machine.JUMPIFop, Machine.falseRep, Machine.CBr, 0); - valSize = (Integer) ast.E2.visit(this, frame); - jumpAddr = nextInstrAddr; - emit(Machine.JUMPop, 0, Machine.CBr, 0); - patch(jumpifAddr, nextInstrAddr); - valSize = (Integer) ast.E3.visit(this, frame); - patch(jumpAddr, nextInstrAddr); + var jumpifAddr = emitter.emit(OpCode.JUMPIF, Machine.falseRep, Register.CB, 0); + var valSize = ast.E2.visit(this, frame); + var jumpAddr = emitter.emit(OpCode.JUMP, 0, Register.CB, 0); + emitter.patch(jumpifAddr); + valSize = ast.E3.visit(this, frame); + emitter.patch(jumpAddr); return valSize; } @Override - public Object visitIntegerExpression(IntegerExpression ast, Object o) { - Frame frame = (Frame) o; - Integer valSize = (Integer) ast.type.visit(this); - emit(Machine.LOADLop, 0, 0, Integer.parseInt(ast.IL.spelling)); + public Integer visitIntegerExpression(IntegerExpression ast, Frame frame) { + var valSize = ast.type.visit(this); + emitter.emit(OpCode.LOADL, Integer.parseInt(ast.IL.spelling)); return valSize; } @Override - public Object visitLetExpression(LetExpression ast, Object o) { - Frame frame = (Frame) o; + public Integer visitLetExpression(LetExpression ast, Frame frame) { ast.type.visit(this); - int extraSize = ((Integer) ast.D.visit(this, frame)).intValue(); - Frame frame1 = new Frame(frame, extraSize); - Integer valSize = (Integer) ast.E.visit(this, frame1); - if (extraSize > 0) - emit(Machine.POPop, valSize.intValue(), 0, extraSize); + var extraSize = ast.D.visit(this, frame); + var frame1 = frame.expand(extraSize); + var valSize = ast.E.visit(this, frame1); + if (extraSize > 0) { + emitter.emit(OpCode.POP, valSize, extraSize); + } return valSize; } @Override - public Object visitRecordExpression(RecordExpression ast, Object o) { + public Integer visitRecordExpression(RecordExpression ast, Frame frame) { ast.type.visit(this); - return ast.RA.visit(this, o); + return ast.RA.visit(this, frame); } @Override - public Object visitUnaryExpression(UnaryExpression ast, Object o) { - Frame frame = (Frame) o; - Integer valSize = (Integer) ast.type.visit(this); + public Integer visitUnaryExpression(UnaryExpression ast, Frame frame) { + var valSize = ast.type.visit(this); ast.E.visit(this, frame); - ast.O.visit(this, new Frame(frame.level, valSize.intValue())); + ast.O.visit(this, frame.replace(valSize)); return valSize; } @Override - public Object visitVnameExpression(VnameExpression ast, Object o) { - Frame frame = (Frame) o; - Integer valSize = (Integer) ast.type.visit(this); - encodeFetch(ast.V, frame, valSize.intValue()); + public Integer visitVnameExpression(VnameExpression ast, Frame frame) { + var valSize = ast.type.visit(this); + encodeFetch(ast.V, frame, valSize); return valSize; } // Declarations @Override - public Object visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, Object o) { - return Integer.valueOf(0); + public Integer visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, Frame frame) { + return 0; } @Override - public Object visitConstDeclaration(ConstDeclaration ast, Object o) { - Frame frame = (Frame) o; - int extraSize = 0; - + public Integer visitConstDeclaration(ConstDeclaration ast, Frame frame) { + var extraSize = 0; if (ast.E instanceof CharacterExpression) { - CharacterLiteral CL = ((CharacterExpression) ast.E).CL; - ast.entity = new KnownValue(Machine.characterSize, characterValuation(CL.spelling)); + var CL = ((CharacterExpression) ast.E).CL; + ast.entity = new KnownValue(Machine.characterSize, CL.getValue()); } else if (ast.E instanceof IntegerExpression) { - IntegerLiteral IL = ((IntegerExpression) ast.E).IL; - ast.entity = new KnownValue(Machine.integerSize, Integer.parseInt(IL.spelling)); + var IL = ((IntegerExpression) ast.E).IL; + ast.entity = new KnownValue(Machine.integerSize, IL.getValue()); } else { - int valSize = ((Integer) ast.E.visit(this, frame)).intValue(); - ast.entity = new UnknownValue(valSize, frame.level, frame.size); + var valSize = ast.E.visit(this, frame); + ast.entity = new UnknownValue(valSize, frame.getLevel(), frame.getSize()); extraSize = valSize; } writeTableDetails(ast); - return Integer.valueOf(extraSize); + return extraSize; } @Override - public Object visitFuncDeclaration(FuncDeclaration ast, Object o) { - Frame frame = (Frame) o; - int jumpAddr = nextInstrAddr; - int argsSize = 0, valSize = 0; + public Integer visitFuncDeclaration(FuncDeclaration ast, Frame frame) { + var argsSize = 0; + var valSize = 0; - emit(Machine.JUMPop, 0, Machine.CBr, 0); - ast.entity = new KnownRoutine(Machine.closureSize, frame.level, nextInstrAddr); + var jumpAddr = emitter.emit(OpCode.JUMP, 0, Register.CB, 0); + ast.entity = new KnownRoutine(Machine.closureSize, frame.getLevel(), emitter.getNextInstrAddr()); writeTableDetails(ast); - if (frame.level == Machine.maxRoutineLevel) + if (frame.getLevel() == Machine.maxRoutineLevel) { reporter.reportRestriction("can't nest routines more than 7 deep"); - else { - Frame frame1 = new Frame(frame.level + 1, 0); - argsSize = ((Integer) ast.FPS.visit(this, frame1)).intValue(); - Frame frame2 = new Frame(frame.level + 1, Machine.linkDataSize); - valSize = ((Integer) ast.E.visit(this, frame2)).intValue(); + } else { + var frame1 = frame.push(0); + argsSize = ast.FPS.visit(this, frame1); + var frame2 = frame.push(Machine.linkDataSize); + valSize = ast.E.visit(this, frame2); } - emit(Machine.RETURNop, valSize, 0, argsSize); - patch(jumpAddr, nextInstrAddr); - return Integer.valueOf(0); + emitter.emit(OpCode.RETURN, valSize, argsSize); + emitter.patch(jumpAddr); + return 0; } @Override - public Object visitProcDeclaration(ProcDeclaration ast, Object o) { - Frame frame = (Frame) o; - int jumpAddr = nextInstrAddr; - int argsSize = 0; - - emit(Machine.JUMPop, 0, Machine.CBr, 0); - ast.entity = new KnownRoutine(Machine.closureSize, frame.level, nextInstrAddr); + public Integer visitProcDeclaration(ProcDeclaration ast, Frame frame) { + var argsSize = 0; + var jumpAddr = emitter.emit(OpCode.JUMP, 0, Register.CB, 0); + ast.entity = new KnownRoutine(Machine.closureSize, frame.getLevel(), emitter.getNextInstrAddr()); writeTableDetails(ast); - if (frame.level == Machine.maxRoutineLevel) + if (frame.getLevel() == Machine.maxRoutineLevel) { reporter.reportRestriction("can't nest routines so deeply"); - else { - Frame frame1 = new Frame(frame.level + 1, 0); - argsSize = ((Integer) ast.FPS.visit(this, frame1)).intValue(); - Frame frame2 = new Frame(frame.level + 1, Machine.linkDataSize); + } else { + var frame1 = frame.push(0); + argsSize = ast.FPS.visit(this, frame1); + var frame2 = frame.push(Machine.linkDataSize); ast.C.visit(this, frame2); } - emit(Machine.RETURNop, 0, 0, argsSize); - patch(jumpAddr, nextInstrAddr); - return Integer.valueOf(0); + emitter.emit(OpCode.RETURN, argsSize); + emitter.patch(jumpAddr); + return 0; } @Override - public Object visitSequentialDeclaration(SequentialDeclaration ast, Object o) { - Frame frame = (Frame) o; - int extraSize1, extraSize2; - - extraSize1 = ((Integer) ast.D1.visit(this, frame)).intValue(); - Frame frame1 = new Frame(frame, extraSize1); - extraSize2 = ((Integer) ast.D2.visit(this, frame1)).intValue(); - return Integer.valueOf(extraSize1 + extraSize2); + public Integer visitSequentialDeclaration(SequentialDeclaration ast, Frame frame) { + var extraSize1 = ast.D1.visit(this, frame); + var frame1 = frame.expand(extraSize1); + var extraSize2 = ast.D2.visit(this, frame1); + return extraSize1 + extraSize2; } @Override - public Object visitTypeDeclaration(TypeDeclaration ast, Object o) { + public Integer visitTypeDeclaration(TypeDeclaration ast, Frame frame) { // just to ensure the type's representation is decided ast.T.visit(this); - return Integer.valueOf(0); + return 0; } @Override - public Object visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Object o) { - return Integer.valueOf(0); + public Integer visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Frame frame) { + return 0; } @Override - public Object visitVarDeclaration(VarDeclaration ast, Object o) { - Frame frame = (Frame) o; - int extraSize; - - extraSize = ((Integer) ast.T.visit(this)).intValue(); - emit(Machine.PUSHop, 0, 0, extraSize); - ast.entity = new KnownAddress(Machine.addressSize, frame.level, frame.size); + public Integer visitVarDeclaration(VarDeclaration ast, Frame frame) { + var extraSize = ast.T.visit(this); + emitter.emit(OpCode.PUSH, extraSize); + ast.entity = new KnownAddress(Machine.addressSize, frame.getLevel(), frame.getSize()); writeTableDetails(ast); - return Integer.valueOf(extraSize); + return extraSize; } // Array Aggregates @Override - public Object visitMultipleArrayAggregate(MultipleArrayAggregate ast, Object o) { - Frame frame = (Frame) o; - int elemSize = ((Integer) ast.E.visit(this, frame)).intValue(); - Frame frame1 = new Frame(frame, elemSize); - int arraySize = ((Integer) ast.AA.visit(this, frame1)).intValue(); - return Integer.valueOf(elemSize + arraySize); + public Integer visitMultipleArrayAggregate(MultipleArrayAggregate ast, Frame frame) { + var elemSize = ast.E.visit(this, frame); + var frame1 = frame.expand(elemSize); + var arraySize = ast.AA.visit(this, frame1); + return elemSize + arraySize; } @Override - public Object visitSingleArrayAggregate(SingleArrayAggregate ast, Object o) { - return ast.E.visit(this, o); + public Integer visitSingleArrayAggregate(SingleArrayAggregate ast, Frame frame) { + return ast.E.visit(this, frame); } // Record Aggregates @Override - public Object visitMultipleRecordAggregate(MultipleRecordAggregate ast, Object o) { - Frame frame = (Frame) o; - int fieldSize = ((Integer) ast.E.visit(this, frame)).intValue(); - Frame frame1 = new Frame(frame, fieldSize); - int recordSize = ((Integer) ast.RA.visit(this, frame1)).intValue(); - return Integer.valueOf(fieldSize + recordSize); + public Integer visitMultipleRecordAggregate(MultipleRecordAggregate ast, Frame frame) { + var fieldSize = ast.E.visit(this, frame); + var frame1 = frame.expand(fieldSize); + var recordSize = ast.RA.visit(this, frame1); + return fieldSize + recordSize; } @Override - public Object visitSingleRecordAggregate(SingleRecordAggregate ast, Object o) { - return ast.E.visit(this, o); + public Integer visitSingleRecordAggregate(SingleRecordAggregate ast, Frame frame) { + return ast.E.visit(this, frame); } // Formal Parameters @Override - public Object visitConstFormalParameter(ConstFormalParameter ast, Object o) { - Frame frame = (Frame) o; - int valSize = ((Integer) ast.T.visit(this)).intValue(); - ast.entity = new UnknownValue(valSize, frame.level, -frame.size - valSize); + public Integer visitConstFormalParameter(ConstFormalParameter ast, Frame frame) { + var valSize = ast.T.visit(this); + ast.entity = new UnknownValue(valSize, frame.getLevel(), -frame.getSize() - valSize); writeTableDetails(ast); - return Integer.valueOf(valSize); + return valSize; } @Override - public Object visitFuncFormalParameter(FuncFormalParameter ast, Object o) { - Frame frame = (Frame) o; - int argsSize = Machine.closureSize; - ast.entity = new UnknownRoutine(Machine.closureSize, frame.level, -frame.size - argsSize); + public Integer visitFuncFormalParameter(FuncFormalParameter ast, Frame frame) { + var argsSize = Machine.closureSize; + ast.entity = new UnknownRoutine(Machine.closureSize, frame.getLevel(), -frame.getSize() - argsSize); writeTableDetails(ast); - return Integer.valueOf(argsSize); + return argsSize; } @Override - public Object visitProcFormalParameter(ProcFormalParameter ast, Object o) { - Frame frame = (Frame) o; - int argsSize = Machine.closureSize; - ast.entity = new UnknownRoutine(Machine.closureSize, frame.level, -frame.size - argsSize); + public Integer visitProcFormalParameter(ProcFormalParameter ast, Frame frame) { + var argsSize = Machine.closureSize; + ast.entity = new UnknownRoutine(Machine.closureSize, frame.getLevel(), -frame.getSize() - argsSize); writeTableDetails(ast); - return Integer.valueOf(argsSize); + return argsSize; } @Override - public Object visitVarFormalParameter(VarFormalParameter ast, Object o) { - Frame frame = (Frame) o; + public Integer visitVarFormalParameter(VarFormalParameter ast, Frame frame) { ast.T.visit(this); - ast.entity = new UnknownAddress(Machine.addressSize, frame.level, -frame.size - Machine.addressSize); + ast.entity = new UnknownAddress(Machine.addressSize, frame.getLevel(), -frame.getSize() - Machine.addressSize); writeTableDetails(ast); - return Integer.valueOf(Machine.addressSize); + return Machine.addressSize; } @Override - public Object visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Object o) { - return Integer.valueOf(0); + public Integer visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Frame frame) { + return 0; } @Override - public Object visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Object o) { - Frame frame = (Frame) o; - int argsSize1 = ((Integer) ast.FPS.visit(this, frame)).intValue(); - Frame frame1 = new Frame(frame, argsSize1); - int argsSize2 = ((Integer) ast.FP.visit(this, frame1)).intValue(); - return Integer.valueOf(argsSize1 + argsSize2); + public Integer visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Frame frame) { + var argsSize1 = ast.FPS.visit(this, frame); + var frame1 = frame.expand(argsSize1); + var argsSize2 = ast.FP.visit(this, frame1); + return argsSize1 + argsSize2; } @Override - public Object visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Object o) { - return ast.FP.visit(this, o); + public Integer visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Frame frame) { + return ast.FP.visit(this, frame); } // Actual Parameters @Override - public Object visitConstActualParameter(ConstActualParameter ast, Object o) { - return ast.E.visit(this, o); + public Integer visitConstActualParameter(ConstActualParameter ast, Frame frame) { + return ast.E.visit(this, frame); } @Override - public Object visitFuncActualParameter(FuncActualParameter ast, Object o) { - Frame frame = (Frame) o; + public Integer visitFuncActualParameter(FuncActualParameter ast, Frame frame) { if (ast.I.decl.entity instanceof KnownRoutine) { - ObjectAddress address = ((KnownRoutine) ast.I.decl.entity).address; + var address = ((KnownRoutine) ast.I.decl.entity).getAddress(); // static link, code address - emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), 0); - emit(Machine.LOADAop, 0, Machine.CBr, address.displacement); + emitter.emit(OpCode.LOADA, 0, frame.getDisplayRegister(address), 0); + emitter.emit(OpCode.LOADA, 0, Register.CB, address.getDisplacement()); } else if (ast.I.decl.entity instanceof UnknownRoutine) { - ObjectAddress address = ((UnknownRoutine) ast.I.decl.entity).address; - emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level, address.level), - address.displacement); + var address = ((UnknownRoutine) ast.I.decl.entity).getAddress(); + emitter.emit(OpCode.LOAD, Machine.closureSize, frame.getDisplayRegister(address), + address.getDisplacement()); } else if (ast.I.decl.entity instanceof PrimitiveRoutine) { - int displacement = ((PrimitiveRoutine) ast.I.decl.entity).displacement; + var primitive = ((PrimitiveRoutine) ast.I.decl.entity).getPrimitive(); // static link, code address - emit(Machine.LOADAop, 0, Machine.SBr, 0); - emit(Machine.LOADAop, 0, Machine.PBr, displacement); + emitter.emit(OpCode.LOADA, 0, Register.SB, 0); + emitter.emit(OpCode.LOADA, Register.PB, primitive); } - return Integer.valueOf(Machine.closureSize); + return Machine.closureSize; } @Override - public Object visitProcActualParameter(ProcActualParameter ast, Object o) { - Frame frame = (Frame) o; + public Integer visitProcActualParameter(ProcActualParameter ast, Frame frame) { if (ast.I.decl.entity instanceof KnownRoutine) { - ObjectAddress address = ((KnownRoutine) ast.I.decl.entity).address; + var address = ((KnownRoutine) ast.I.decl.entity).getAddress(); // static link, code address - emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), 0); - emit(Machine.LOADAop, 0, Machine.CBr, address.displacement); + emitter.emit(OpCode.LOADA, 0, frame.getDisplayRegister(address), 0); + emitter.emit(OpCode.LOADA, 0, Register.CB, address.getDisplacement()); } else if (ast.I.decl.entity instanceof UnknownRoutine) { - ObjectAddress address = ((UnknownRoutine) ast.I.decl.entity).address; - emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level, address.level), - address.displacement); + var address = ((UnknownRoutine) ast.I.decl.entity).getAddress(); + emitter.emit(OpCode.LOAD, Machine.closureSize, frame.getDisplayRegister(address), + address.getDisplacement()); } else if (ast.I.decl.entity instanceof PrimitiveRoutine) { - int displacement = ((PrimitiveRoutine) ast.I.decl.entity).displacement; + var primitive = ((PrimitiveRoutine) ast.I.decl.entity).getPrimitive(); // static link, code address - emit(Machine.LOADAop, 0, Machine.SBr, 0); - emit(Machine.LOADAop, 0, Machine.PBr, displacement); + emitter.emit(OpCode.LOADA, 0, Register.SB, 0); + emitter.emit(OpCode.LOADA, Register.PB, primitive); } - return Integer.valueOf(Machine.closureSize); + return Machine.closureSize; } @Override - public Object visitVarActualParameter(VarActualParameter ast, Object o) { - encodeFetchAddress(ast.V, (Frame) o); - return Integer.valueOf(Machine.addressSize); + public Integer visitVarActualParameter(VarActualParameter ast, Frame frame) { + encodeFetchAddress(ast.V, frame); + return Machine.addressSize; } @Override - public Object visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, Object o) { - return Integer.valueOf(0); + public Integer visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, Frame frame) { + return 0; } @Override - public Object visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, Object o) { - Frame frame = (Frame) o; - int argsSize1 = ((Integer) ast.AP.visit(this, frame)).intValue(); - Frame frame1 = new Frame(frame, argsSize1); - int argsSize2 = ((Integer) ast.APS.visit(this, frame1)).intValue(); - return Integer.valueOf(argsSize1 + argsSize2); + public Integer visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, Frame frame) { + var argsSize1 = ast.AP.visit(this, frame); + var frame1 = frame.expand(argsSize1); + var argsSize2 = ast.APS.visit(this, frame1); + return argsSize1 + argsSize2; } @Override - public Object visitSingleActualParameterSequence(SingleActualParameterSequence ast, Object o) { - return ast.AP.visit(this, o); + public Integer visitSingleActualParameterSequence(SingleActualParameterSequence ast, Frame frame) { + return ast.AP.visit(this, frame); } // Type Denoters @Override - public Object visitAnyTypeDenoter(AnyTypeDenoter ast, Object o) { - return Integer.valueOf(0); + public Integer visitAnyTypeDenoter(AnyTypeDenoter ast, Frame frame) { + return 0; } @Override - public Object visitArrayTypeDenoter(ArrayTypeDenoter ast, Object o) { + public Integer visitArrayTypeDenoter(ArrayTypeDenoter ast, Frame frame) { int typeSize; if (ast.entity == null) { - int elemSize = ((Integer) ast.T.visit(this)).intValue(); + var elemSize = ast.T.visit(this); typeSize = Integer.parseInt(ast.IL.spelling) * elemSize; ast.entity = new TypeRepresentation(typeSize); writeTableDetails(ast); - } else - typeSize = ast.entity.size; - return Integer.valueOf(typeSize); + } else { + typeSize = ast.entity.getSize(); + } + return typeSize; } @Override - public Object visitBoolTypeDenoter(BoolTypeDenoter ast, Object o) { + public Integer visitBoolTypeDenoter(BoolTypeDenoter ast, Frame frame) { if (ast.entity == null) { ast.entity = new TypeRepresentation(Machine.booleanSize); writeTableDetails(ast); } - return Integer.valueOf(Machine.booleanSize); + return Machine.booleanSize; } @Override - public Object visitCharTypeDenoter(CharTypeDenoter ast, Object o) { + public Integer visitCharTypeDenoter(CharTypeDenoter ast, Frame frame) { if (ast.entity == null) { ast.entity = new TypeRepresentation(Machine.characterSize); writeTableDetails(ast); } - return Integer.valueOf(Machine.characterSize); + return Machine.characterSize; } @Override - public Object visitErrorTypeDenoter(ErrorTypeDenoter ast, Object o) { - return Integer.valueOf(0); + public Integer visitErrorTypeDenoter(ErrorTypeDenoter ast, Frame frame) { + return 0; } @Override - public Object visitSimpleTypeDenoter(SimpleTypeDenoter ast, Object o) { - return Integer.valueOf(0); + public Integer visitSimpleTypeDenoter(SimpleTypeDenoter ast, Frame frame) { + return 0; } @Override - public Object visitIntTypeDenoter(IntTypeDenoter ast, Object o) { + public Integer visitIntTypeDenoter(IntTypeDenoter ast, Frame frame) { if (ast.entity == null) { ast.entity = new TypeRepresentation(Machine.integerSize); writeTableDetails(ast); } - return Integer.valueOf(Machine.integerSize); + return Machine.integerSize; } @Override - public Object visitRecordTypeDenoter(RecordTypeDenoter ast, Object o) { + public Integer visitRecordTypeDenoter(RecordTypeDenoter ast, Frame frame) { int typeSize; if (ast.entity == null) { - typeSize = ((Integer) ast.FT.visit(this, Integer.valueOf(0))).intValue(); + typeSize = ast.FT.visit(this, null); ast.entity = new TypeRepresentation(typeSize); writeTableDetails(ast); - } else - typeSize = ast.entity.size; - return Integer.valueOf(typeSize); + } else { + typeSize = ast.entity.getSize(); + } + return typeSize; } @Override - public Object visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Object o) { - int offset = ((Integer) o).intValue(); + public Integer visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Frame frame) { + var offset = frame.getSize(); int fieldSize; - if (ast.entity == null) { - fieldSize = ((Integer) ast.T.visit(this)).intValue(); + fieldSize = ast.T.visit(this); ast.entity = new Field(fieldSize, offset); writeTableDetails(ast); - } else - fieldSize = ast.entity.size; + } else { + fieldSize = ast.entity.getSize(); + } - Integer offset1 = Integer.valueOf(offset + fieldSize); - int recSize = ((Integer) ast.FT.visit(this, offset1)).intValue(); - return Integer.valueOf(fieldSize + recSize); + var offset1 = frame.replace(offset + fieldSize); + var recSize = ast.FT.visit(this, offset1); + return fieldSize + recSize; } @Override - public Object visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, Object o) { - int offset = ((Integer) o).intValue(); + public Integer visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, Frame frame) { + var offset = frame.getSize(); int fieldSize; - if (ast.entity == null) { - fieldSize = ((Integer) ast.T.visit(this)).intValue(); + fieldSize = ast.T.visit(this); ast.entity = new Field(fieldSize, offset); writeTableDetails(ast); - } else - fieldSize = ast.entity.size; + } else { + fieldSize = ast.entity.getSize(); + } - return Integer.valueOf(fieldSize); + return fieldSize; } // Literals, Identifiers and Operators @Override - public Object visitCharacterLiteral(CharacterLiteral ast, Object o) { + public Void visitCharacterLiteral(CharacterLiteral ast, Void arg) { return null; } @Override - public Object visitIdentifier(Identifier ast, Object o) { - Frame frame = (Frame) o; + public Void visitIdentifier(Identifier ast, Frame frame) { if (ast.decl.entity instanceof KnownRoutine) { - ObjectAddress address = ((KnownRoutine) ast.decl.entity).address; - emit(Machine.CALLop, displayRegister(frame.level, address.level), Machine.CBr, address.displacement); + var address = ((KnownRoutine) ast.decl.entity).getAddress(); + emitter.emit(OpCode.CALL, frame.getDisplayRegister(address), Register.CB, address.getDisplacement()); } else if (ast.decl.entity instanceof UnknownRoutine) { - ObjectAddress address = ((UnknownRoutine) ast.decl.entity).address; - emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level, address.level), - address.displacement); - emit(Machine.CALLIop, 0, 0, 0); + var address = ((UnknownRoutine) ast.decl.entity).getAddress(); + emitter.emit(OpCode.LOAD, Machine.closureSize, frame.getDisplayRegister(address), + address.getDisplacement()); + emitter.emit(OpCode.CALLI, 0); } else if (ast.decl.entity instanceof PrimitiveRoutine) { - int displacement = ((PrimitiveRoutine) ast.decl.entity).displacement; - if (displacement != Machine.idDisplacement) - emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement); + var primitive = ((PrimitiveRoutine) ast.decl.entity).getPrimitive(); + if (primitive != Primitive.ID) + emitter.emit(OpCode.CALL, Register.PB, primitive); } else if (ast.decl.entity instanceof EqualityRoutine) { // "=" or "\=" - int displacement = ((EqualityRoutine) ast.decl.entity).displacement; - emit(Machine.LOADLop, 0, 0, frame.size / 2); - emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement); + var primitive = ((EqualityRoutine) ast.decl.entity).getPrimitive(); + emitter.emit(OpCode.LOADL, 0, frame.getSize() / 2); + emitter.emit(OpCode.CALL, Register.PB, primitive); } return null; } @Override - public Object visitIntegerLiteral(IntegerLiteral ast, Object o) { + public Void visitIntegerLiteral(IntegerLiteral ast, Void arg) { return null; } @Override - public Object visitOperator(Operator ast, Object o) { - Frame frame = (Frame) o; + public Void visitOperator(Operator ast, Frame frame) { if (ast.decl.entity instanceof KnownRoutine) { - ObjectAddress address = ((KnownRoutine) ast.decl.entity).address; - emit(Machine.CALLop, displayRegister(frame.level, address.level), Machine.CBr, address.displacement); + var address = ((KnownRoutine) ast.decl.entity).getAddress(); + emitter.emit(OpCode.CALL, frame.getDisplayRegister(address), Register.CB, address.getDisplacement()); } else if (ast.decl.entity instanceof UnknownRoutine) { - ObjectAddress address = ((UnknownRoutine) ast.decl.entity).address; - emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level, address.level), - address.displacement); - emit(Machine.CALLIop, 0, 0, 0); + var address = ((UnknownRoutine) ast.decl.entity).getAddress(); + emitter.emit(OpCode.LOAD, Machine.closureSize, frame.getDisplayRegister(address), + address.getDisplacement()); + emitter.emit(OpCode.CALLI, 0); } else if (ast.decl.entity instanceof PrimitiveRoutine) { - int displacement = ((PrimitiveRoutine) ast.decl.entity).displacement; - if (displacement != Machine.idDisplacement) - emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement); + var primitive = ((PrimitiveRoutine) ast.decl.entity).getPrimitive(); + if (primitive != Primitive.ID) + emitter.emit(OpCode.CALL, Register.PB, primitive); } else if (ast.decl.entity instanceof EqualityRoutine) { // "=" or "\=" - int displacement = ((EqualityRoutine) ast.decl.entity).displacement; - emit(Machine.LOADLop, 0, 0, frame.size / 2); - emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement); + var primitive = ((EqualityRoutine) ast.decl.entity).getPrimitive(); + emitter.emit(OpCode.LOADL, 0, frame.getSize() / 2); + emitter.emit(OpCode.CALL, Register.PB, primitive); } return null; } // Value-or-variable names @Override - public Object visitDotVname(DotVname ast, Object o) { - Frame frame = (Frame) o; - RuntimeEntity baseObject = (RuntimeEntity) ast.V.visit(this, frame); - ast.offset = ast.V.offset + ((Field) ast.I.decl.entity).fieldOffset; + public RuntimeEntity visitDotVname(DotVname ast, Frame frame) { + var baseObject = ast.V.visit(this, frame); + ast.offset = ast.V.offset + ((Field) ast.I.decl.entity).getFieldOffset(); // I.decl points to the appropriate record field ast.indexed = ast.V.indexed; return baseObject; } @Override - public Object visitSimpleVname(SimpleVname ast, Object o) { + public RuntimeEntity visitSimpleVname(SimpleVname ast, Frame frame) { ast.offset = 0; ast.indexed = false; return ast.I.decl.entity; } @Override - public Object visitSubscriptVname(SubscriptVname ast, Object o) { - Frame frame = (Frame) o; - RuntimeEntity baseObject; - int elemSize, indexSize; - - baseObject = (RuntimeEntity) ast.V.visit(this, frame); + public RuntimeEntity visitSubscriptVname(SubscriptVname ast, Frame frame) { + var baseObject = ast.V.visit(this, frame); ast.offset = ast.V.offset; ast.indexed = ast.V.indexed; - elemSize = ((Integer) ast.type.visit(this)).intValue(); + var elemSize = ast.type.visit(this); if (ast.E instanceof IntegerExpression) { - IntegerLiteral IL = ((IntegerExpression) ast.E).IL; + var IL = ((IntegerExpression) ast.E).IL; ast.offset = ast.offset + Integer.parseInt(IL.spelling) * elemSize; } else { // v-name is indexed by a proper expression, not a literal - if (ast.indexed) - frame.size = frame.size + Machine.integerSize; - indexSize = ((Integer) ast.E.visit(this, frame)).intValue(); + if (ast.indexed) { + frame = frame.expand(Machine.integerSize); + } + ast.E.visit(this, frame); if (elemSize != 1) { - emit(Machine.LOADLop, 0, 0, elemSize); - emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.multDisplacement); + emitter.emit(OpCode.LOADL, 0, elemSize); + emitter.emit(OpCode.CALL, Register.PB, Primitive.MULT); } if (ast.indexed) - emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); - else + emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD); + else { ast.indexed = true; + } } return baseObject; } // Programs @Override - public Object visitProgram(Program ast, Object o) { - return ast.C.visit(this, o); + public Void visitProgram(Program ast, Frame frame) { + return ast.C.visit(this, frame); } - public Encoder(ErrorReporter reporter) { + public Encoder(Emitter emitter, ErrorReporter reporter) { + this.emitter = emitter; this.reporter = reporter; - nextInstrAddr = Machine.CB; + elaborateStdEnvironment(); } + private Emitter emitter; + private ErrorReporter reporter; // Generates code to run a program. // showingTable is true iff entity description details // are to be displayed. - public final void encodeRun(Program theAST, boolean showingTable) { + public final void encodeRun(Program program, boolean showingTable) { tableDetailsReqd = showingTable; // startCodeGeneration(); - theAST.visit(this, new Frame(0, 0)); - emit(Machine.HALTop, 0, 0, 0); + program.visit(this, Frame.Initial); + emitter.emit(OpCode.HALT); } // Decides run-time representation of a standard constant. private final void elaborateStdConst(Declaration constDeclaration, int value) { if (constDeclaration instanceof ConstDeclaration) { - ConstDeclaration decl = (ConstDeclaration) constDeclaration; - int typeSize = ((Integer) decl.E.type.visit(this)).intValue(); + var decl = (ConstDeclaration) constDeclaration; + var typeSize = decl.E.type.visit(this); decl.entity = new KnownValue(typeSize, value); writeTableDetails(constDeclaration); } } // Decides run-time representation of a standard routine. - private final void elaborateStdPrimRoutine(Declaration routineDeclaration, int routineOffset) { - routineDeclaration.entity = new PrimitiveRoutine(Machine.closureSize, routineOffset); + private final void elaborateStdPrimRoutine(Declaration routineDeclaration, Primitive primitive) { + routineDeclaration.entity = new PrimitiveRoutine(Machine.closureSize, primitive); writeTableDetails(routineDeclaration); } - private final void elaborateStdEqRoutine(Declaration routineDeclaration, int routineOffset) { - routineDeclaration.entity = new EqualityRoutine(Machine.closureSize, routineOffset); + private final void elaborateStdEqRoutine(Declaration routineDeclaration, Primitive primitive) { + routineDeclaration.entity = new EqualityRoutine(Machine.closureSize, primitive); writeTableDetails(routineDeclaration); } @@ -790,114 +775,36 @@ public final class Encoder implements Visitor { tableDetailsReqd = false; elaborateStdConst(StdEnvironment.falseDecl, Machine.falseRep); elaborateStdConst(StdEnvironment.trueDecl, Machine.trueRep); - elaborateStdPrimRoutine(StdEnvironment.notDecl, Machine.notDisplacement); - elaborateStdPrimRoutine(StdEnvironment.andDecl, Machine.andDisplacement); - elaborateStdPrimRoutine(StdEnvironment.orDecl, Machine.orDisplacement); + elaborateStdPrimRoutine(StdEnvironment.notDecl, Primitive.NOT); + elaborateStdPrimRoutine(StdEnvironment.andDecl, Primitive.AND); + elaborateStdPrimRoutine(StdEnvironment.orDecl, Primitive.OR); elaborateStdConst(StdEnvironment.maxintDecl, Machine.maxintRep); - elaborateStdPrimRoutine(StdEnvironment.addDecl, Machine.addDisplacement); - elaborateStdPrimRoutine(StdEnvironment.subtractDecl, Machine.subDisplacement); - elaborateStdPrimRoutine(StdEnvironment.multiplyDecl, Machine.multDisplacement); - elaborateStdPrimRoutine(StdEnvironment.divideDecl, Machine.divDisplacement); - elaborateStdPrimRoutine(StdEnvironment.moduloDecl, Machine.modDisplacement); - elaborateStdPrimRoutine(StdEnvironment.lessDecl, Machine.ltDisplacement); - elaborateStdPrimRoutine(StdEnvironment.notgreaterDecl, Machine.leDisplacement); - elaborateStdPrimRoutine(StdEnvironment.greaterDecl, Machine.gtDisplacement); - elaborateStdPrimRoutine(StdEnvironment.notlessDecl, Machine.geDisplacement); - elaborateStdPrimRoutine(StdEnvironment.chrDecl, Machine.idDisplacement); - elaborateStdPrimRoutine(StdEnvironment.ordDecl, Machine.idDisplacement); - elaborateStdPrimRoutine(StdEnvironment.eolDecl, Machine.eolDisplacement); - elaborateStdPrimRoutine(StdEnvironment.eofDecl, Machine.eofDisplacement); - elaborateStdPrimRoutine(StdEnvironment.getDecl, Machine.getDisplacement); - elaborateStdPrimRoutine(StdEnvironment.putDecl, Machine.putDisplacement); - elaborateStdPrimRoutine(StdEnvironment.getintDecl, Machine.getintDisplacement); - elaborateStdPrimRoutine(StdEnvironment.putintDecl, Machine.putintDisplacement); - elaborateStdPrimRoutine(StdEnvironment.geteolDecl, Machine.geteolDisplacement); - elaborateStdPrimRoutine(StdEnvironment.puteolDecl, Machine.puteolDisplacement); - elaborateStdEqRoutine(StdEnvironment.equalDecl, Machine.eqDisplacement); - elaborateStdEqRoutine(StdEnvironment.unequalDecl, Machine.neDisplacement); - } - - // Saves the object program in the named file. - - public void saveObjectProgram(String objectName) { - FileOutputStream objectFile = null; - DataOutputStream objectStream = null; - - int addr; - - try { - objectFile = new FileOutputStream(objectName); - objectStream = new DataOutputStream(objectFile); - - addr = Machine.CB; - for (addr = Machine.CB; addr < nextInstrAddr; addr++) - Machine.code[addr].write(objectStream); - objectFile.close(); - } catch (FileNotFoundException s) { - System.err.println("Error opening object file: " + s); - } catch (IOException s) { - System.err.println("Error writing object file: " + s); - } + elaborateStdPrimRoutine(StdEnvironment.addDecl, Primitive.ADD); + elaborateStdPrimRoutine(StdEnvironment.subtractDecl, Primitive.SUB); + elaborateStdPrimRoutine(StdEnvironment.multiplyDecl, Primitive.MULT); + elaborateStdPrimRoutine(StdEnvironment.divideDecl, Primitive.DIV); + elaborateStdPrimRoutine(StdEnvironment.moduloDecl, Primitive.MOD); + elaborateStdPrimRoutine(StdEnvironment.lessDecl, Primitive.LT); + elaborateStdPrimRoutine(StdEnvironment.notgreaterDecl, Primitive.LE); + elaborateStdPrimRoutine(StdEnvironment.greaterDecl, Primitive.GT); + elaborateStdPrimRoutine(StdEnvironment.notlessDecl, Primitive.GE); + elaborateStdPrimRoutine(StdEnvironment.chrDecl, Primitive.ID); + elaborateStdPrimRoutine(StdEnvironment.ordDecl, Primitive.ID); + elaborateStdPrimRoutine(StdEnvironment.eolDecl, Primitive.EOL); + elaborateStdPrimRoutine(StdEnvironment.eofDecl, Primitive.EOF); + elaborateStdPrimRoutine(StdEnvironment.getDecl, Primitive.GET); + elaborateStdPrimRoutine(StdEnvironment.putDecl, Primitive.PUT); + elaborateStdPrimRoutine(StdEnvironment.getintDecl, Primitive.GETINT); + elaborateStdPrimRoutine(StdEnvironment.putintDecl, Primitive.PUTINT); + elaborateStdPrimRoutine(StdEnvironment.geteolDecl, Primitive.GETEOL); + elaborateStdPrimRoutine(StdEnvironment.puteolDecl, Primitive.PUTEOL); + elaborateStdEqRoutine(StdEnvironment.equalDecl, Primitive.EQ); + elaborateStdEqRoutine(StdEnvironment.unequalDecl, Primitive.NE); } boolean tableDetailsReqd; - public static void writeTableDetails(AST ast) { - } - - // OBJECT CODE - - // Implementation notes: - // Object code is generated directly into the TAM Code Store, starting at CB. - // The address of the next instruction is held in nextInstrAddr. - - private int nextInstrAddr; - - // Appends an instruction, with the given fields, to the object code. - private void emit(int op, int n, int r, int d) { - Instruction nextInstr = new Instruction(); - if (n > 255) { - reporter.reportRestriction("length of operand can't exceed 255 words"); - n = 255; // to allow code generation to continue - } - nextInstr.op = op; - nextInstr.n = n; - nextInstr.r = r; - nextInstr.d = d; - if (nextInstrAddr == Machine.PB) - reporter.reportRestriction("too many instructions for code segment"); - else { - Machine.code[nextInstrAddr] = nextInstr; - nextInstrAddr = nextInstrAddr + 1; - } - } - - // Patches the d-field of the instruction at address addr. - private void patch(int addr, int d) { - Machine.code[addr].d = d; - } - - // DATA REPRESENTATION - - public int characterValuation(String spelling) { - // Returns the machine representation of the given character literal. - return spelling.charAt(1); - // since the character literal is of the form 'x'} - } - - // REGISTERS - - // Returns the register number appropriate for object code at currentLevel - // to address a data object at objectLevel. - private int displayRegister(int currentLevel, int objectLevel) { - if (objectLevel == 0) - return Machine.SBr; - else if (currentLevel - objectLevel <= 6) - return Machine.LBr + currentLevel - objectLevel; // LBr|L1r|...|L6r - else { - reporter.reportRestriction("can't access data more than 6 levels out"); - return Machine.L6r; // to allow code generation to continue - } + public static void writeTableDetails(AbstractSyntaxTree ast) { } // Generates code to fetch the value of a named constant or variable @@ -909,34 +816,14 @@ public final class Encoder implements Visitor { private void encodeStore(Vname V, Frame frame, int valSize) { - RuntimeEntity baseObject = (RuntimeEntity) V.visit(this, frame); + var baseObject = (AddressableEntity) V.visit(this, frame); // If indexed = true, code will have been generated to load an index value. if (valSize > 255) { reporter.reportRestriction("can't store values larger than 255 words"); valSize = 255; // to allow code generation to continue } - if (baseObject instanceof KnownAddress) { - ObjectAddress address = ((KnownAddress) baseObject).address; - if (V.indexed) { - emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), address.displacement + V.offset); - emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); - emit(Machine.STOREIop, valSize, 0, 0); - } else { - emit(Machine.STOREop, valSize, displayRegister(frame.level, address.level), - address.displacement + V.offset); - } - } else if (baseObject instanceof UnknownAddress) { - ObjectAddress address = ((UnknownAddress) baseObject).address; - emit(Machine.LOADop, Machine.addressSize, displayRegister(frame.level, address.level), - address.displacement); - if (V.indexed) - emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); - if (V.offset != 0) { - emit(Machine.LOADLop, 0, 0, V.offset); - emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); - } - emit(Machine.STOREIop, valSize, 0, 0); - } + + baseObject.encodeStore(emitter, frame, valSize, V); } // Generates code to fetch the value of a named constant or variable @@ -948,38 +835,14 @@ public final class Encoder implements Visitor { private void encodeFetch(Vname V, Frame frame, int valSize) { - RuntimeEntity baseObject = (RuntimeEntity) V.visit(this, frame); + var baseObject = (FetchableEntity) V.visit(this, frame); // If indexed = true, code will have been generated to load an index value. if (valSize > 255) { reporter.reportRestriction("can't load values larger than 255 words"); valSize = 255; // to allow code generation to continue } - if (baseObject instanceof KnownValue) { - // presumably offset = 0 and indexed = false - int value = ((KnownValue) baseObject).value; - emit(Machine.LOADLop, 0, 0, value); - } else if ((baseObject instanceof UnknownValue) || (baseObject instanceof KnownAddress)) { - ObjectAddress address = (baseObject instanceof UnknownValue) ? ((UnknownValue) baseObject).address - : ((KnownAddress) baseObject).address; - if (V.indexed) { - emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), address.displacement + V.offset); - emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); - emit(Machine.LOADIop, valSize, 0, 0); - } else - emit(Machine.LOADop, valSize, displayRegister(frame.level, address.level), - address.displacement + V.offset); - } else if (baseObject instanceof UnknownAddress) { - ObjectAddress address = ((UnknownAddress) baseObject).address; - emit(Machine.LOADop, Machine.addressSize, displayRegister(frame.level, address.level), - address.displacement); - if (V.indexed) - emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); - if (V.offset != 0) { - emit(Machine.LOADLop, 0, 0, V.offset); - emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); - } - emit(Machine.LOADIop, valSize, 0, 0); - } + + baseObject.encodeFetch(emitter, frame, valSize, V); } // Generates code to compute and push the address of a named variable. @@ -990,23 +853,7 @@ public final class Encoder implements Visitor { private void encodeFetchAddress(Vname V, Frame frame) { - RuntimeEntity baseObject = (RuntimeEntity) V.visit(this, frame); - // If indexed = true, code will have been generated to load an index value. - if (baseObject instanceof KnownAddress) { - ObjectAddress address = ((KnownAddress) baseObject).address; - emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), address.displacement + V.offset); - if (V.indexed) - emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); - } else if (baseObject instanceof UnknownAddress) { - ObjectAddress address = ((UnknownAddress) baseObject).address; - emit(Machine.LOADop, Machine.addressSize, displayRegister(frame.level, address.level), - address.displacement); - if (V.indexed) - emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); - if (V.offset != 0) { - emit(Machine.LOADLop, 0, 0, V.offset); - emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); - } - } + var baseObject = (AddressableEntity) V.visit(this, frame); + baseObject.encodeFetchAddress(emitter, frame, V); } } diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/AddressableEntity.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/AddressableEntity.java new file mode 100644 index 0000000..96ca554 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/AddressableEntity.java @@ -0,0 +1,29 @@ +package Triangle.CodeGenerator.Entities; + +import Triangle.AbstractSyntaxTrees.Vnames.Vname; +import Triangle.CodeGenerator.Emitter; +import Triangle.CodeGenerator.Frame; + +public abstract class AddressableEntity extends RuntimeEntity implements FetchableEntity { + + protected final ObjectAddress address; + + protected AddressableEntity(int size, int level, int displacement) { + super(size); + address = new ObjectAddress(level, displacement); + } + + protected AddressableEntity(int size, Frame frame) { + this(size, frame.getLevel(), frame.getSize()); + } + + public ObjectAddress getAddress() { + return address; + } + + public abstract void encodeStore(Emitter emitter, Frame frame, int size, Vname vname); + + public abstract void encodeFetchAddress(Emitter emitter, Frame frame, Vname vname); + + public abstract void encodeFetch(Emitter emitter, Frame frame, int size, Vname vname); +} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/EqualityRoutine.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/EqualityRoutine.java new file mode 100644 index 0000000..0ff2774 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/EqualityRoutine.java @@ -0,0 +1,46 @@ +/* + * @(#)EqualityRoutine.java 2.1 2003/10/07 + * + * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown + * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland + * and School of Computer and Math Sciences, The Robert Gordon University, + * St. Andrew Street, Aberdeen AB25 1HG, Scotland. + * All rights reserved. + * + * This software is provided free for educational use only. It may + * not be used for commercial purposes without the prior written permission + * of the authors. + */ + +package Triangle.CodeGenerator.Entities; + +import Triangle.AbstractMachine.OpCode; +import Triangle.AbstractMachine.Primitive; +import Triangle.AbstractMachine.Register; +import Triangle.CodeGenerator.Emitter; +import Triangle.CodeGenerator.Frame; + +public class EqualityRoutine extends RuntimeEntity implements RoutineEntity { + + private final Primitive primitive; + + public EqualityRoutine(int size, Primitive primitive) { + super(size); + this.primitive = primitive; + } + + public final Primitive getPrimitive() { + return primitive; + } + + public void encodeCall(Emitter emitter, Frame frame) { + emitter.emit(OpCode.LOADL, frame.getSize() / 2); + emitter.emit(OpCode.CALL, Register.PB, primitive); + } + + public void encodeFetch(Emitter emitter, Frame frame) { + emitter.emit(OpCode.LOADA, 0, Register.SB, 0); + emitter.emit(OpCode.LOADA, Register.PB, primitive); + } + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/FetchableEntity.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/FetchableEntity.java new file mode 100644 index 0000000..c573dfc --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/FetchableEntity.java @@ -0,0 +1,11 @@ +package Triangle.CodeGenerator.Entities; + +import Triangle.AbstractSyntaxTrees.Vnames.Vname; +import Triangle.CodeGenerator.Emitter; +import Triangle.CodeGenerator.Frame; + +public interface FetchableEntity { + + void encodeFetch(Emitter emitter, Frame frame, int size, Vname vname); + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Field.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/Field.java similarity index 83% rename from Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Field.java rename to Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/Field.java index 7906945..ba7c120 100644 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Field.java +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/Field.java @@ -12,20 +12,18 @@ * of the authors. */ -package Triangle.CodeGenerator; +package Triangle.CodeGenerator.Entities; public class Field extends RuntimeEntity { - public Field() { - super(); - fieldOffset = 0; - } + private final int fieldOffset; public Field(int size, int fieldOffset) { super(size); this.fieldOffset = fieldOffset; } - public int fieldOffset; - + public final int getFieldOffset() { + return fieldOffset; + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/KnownAddress.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/KnownAddress.java new file mode 100644 index 0000000..7343da5 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/KnownAddress.java @@ -0,0 +1,62 @@ +/* + * @(#)KnownAddress.java 2.1 2003/10/07 + * + * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown + * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland + * and School of Computer and Math Sciences, The Robert Gordon University, + * St. Andrew Street, Aberdeen AB25 1HG, Scotland. + * All rights reserved. + * + * This software is provided free for educational use only. It may + * not be used for commercial purposes without the prior written permission + * of the authors. + */ + +package Triangle.CodeGenerator.Entities; + +import Triangle.AbstractMachine.OpCode; +import Triangle.AbstractMachine.Primitive; +import Triangle.AbstractMachine.Register; +import Triangle.AbstractSyntaxTrees.Vnames.Vname; +import Triangle.CodeGenerator.Emitter; +import Triangle.CodeGenerator.Frame; + +public class KnownAddress extends AddressableEntity { + + public KnownAddress(int size, int level, int displacement) { + super(size, level, displacement); + } + + public KnownAddress(int size, Frame frame) { + super(size, frame); + } + + public void encodeStore(Emitter emitter, Frame frame, int size, Vname vname) { + if (vname.indexed) { + emitter.emit(OpCode.LOADA, 0, frame.getDisplayRegister(address), address.getDisplacement() + vname.offset); + emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD); + emitter.emit(OpCode.STOREI, size, 0); + } else { + emitter.emit(OpCode.STORE, size, frame.getDisplayRegister(address), + address.getDisplacement() + vname.offset); + } + } + + public void encodeFetch(Emitter emitter, Frame frame, int size, Vname vname) { + if (vname.indexed) { + emitter.emit(OpCode.LOADA, 0, frame.getDisplayRegister(address), address.getDisplacement() + vname.offset); + emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD); + emitter.emit(OpCode.LOADI, size, 0); + } else { + emitter.emit(OpCode.LOAD, size, frame.getDisplayRegister(address), + address.getDisplacement() + vname.offset); + } + } + + public void encodeFetchAddress(Emitter emitter, Frame frame, Vname vname) { + emitter.emit(OpCode.LOADA, 0, frame.getDisplayRegister(address), address.getDisplacement() + vname.offset); + if (vname.indexed) { + emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD); + } + } +} \ No newline at end of file diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/KnownRoutine.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/KnownRoutine.java new file mode 100644 index 0000000..0a1c835 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/KnownRoutine.java @@ -0,0 +1,44 @@ +/* + * @(#)KnownRoutine.java 2.1 2003/10/07 + * + * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown + * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland + * and School of Computer and Math Sciences, The Robert Gordon University, + * St. Andrew Street, Aberdeen AB25 1HG, Scotland. + * All rights reserved. + * + * This software is provided free for educational use only. It may + * not be used for commercial purposes without the prior written permission + * of the authors. + */ + +package Triangle.CodeGenerator.Entities; + +import Triangle.AbstractMachine.OpCode; +import Triangle.AbstractMachine.Register; +import Triangle.CodeGenerator.Emitter; +import Triangle.CodeGenerator.Frame; + +public class KnownRoutine extends RuntimeEntity implements RoutineEntity { + + private final ObjectAddress address; + + public KnownRoutine(int size, int level, int displacement) { + super(size); + address = new ObjectAddress(level, displacement); + } + + public final ObjectAddress getAddress() { + return address; + } + + public void encodeCall(Emitter emitter, Frame frame) { + emitter.emit(OpCode.CALL, frame.getDisplayRegister(address), Register.CB, address.getDisplacement()); + } + + public void encodeFetch(Emitter emitter, Frame frame) { + emitter.emit(OpCode.LOADA, frame.getDisplayRegister(address), 0); + emitter.emit(OpCode.LOADA, Register.CB, address.getDisplacement()); + } + +} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/KnownValue.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/KnownValue.java similarity index 53% rename from Triangle.Compiler/src/main/java/Triangle/CodeGenerator/KnownValue.java rename to Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/KnownValue.java index 2144a6a..8de3458 100644 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/KnownValue.java +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/KnownValue.java @@ -12,20 +12,28 @@ * of the authors. */ -package Triangle.CodeGenerator; +package Triangle.CodeGenerator.Entities; -public class KnownValue extends RuntimeEntity { +import Triangle.AbstractMachine.OpCode; +import Triangle.AbstractSyntaxTrees.Vnames.Vname; +import Triangle.CodeGenerator.Emitter; +import Triangle.CodeGenerator.Frame; - public KnownValue() { - super(); - value = 0; - } +public class KnownValue extends RuntimeEntity implements FetchableEntity { + + private final int value; public KnownValue(int size, int value) { super(size); this.value = value; } - public int value; + public final int getValue() { + return value; + } -} + public void encodeFetch(Emitter emitter, Frame frame, int size, Vname vname) { + // presumably offset = 0 and indexed = false + emitter.emit(OpCode.LOADL, 0, value); + } +} \ No newline at end of file diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/ObjectAddress.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/ObjectAddress.java similarity index 72% rename from Triangle.Compiler/src/main/java/Triangle/CodeGenerator/ObjectAddress.java rename to Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/ObjectAddress.java index 05df9fc..ba1eb85 100644 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/ObjectAddress.java +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/ObjectAddress.java @@ -12,15 +12,24 @@ * of the authors. */ -package Triangle.CodeGenerator; +package Triangle.CodeGenerator.Entities; -public final class ObjectAddress { +public class ObjectAddress { + + private final int level; + + private final int displacement; public ObjectAddress(int level, int displacement) { this.level = level; this.displacement = displacement; } - public int level, displacement; + public final int getLevel() { + return level; + } -} + public int getDisplacement() { + return displacement; + } +} \ No newline at end of file diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/PrimitiveRoutine.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/PrimitiveRoutine.java new file mode 100644 index 0000000..f547a84 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/PrimitiveRoutine.java @@ -0,0 +1,47 @@ +/* + * @(#)PrimitiveRoutine.java 2.1 2003/10/07 + * + * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown + * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland + * and School of Computer and Math Sciences, The Robert Gordon University, + * St. Andrew Street, Aberdeen AB25 1HG, Scotland. + * All rights reserved. + * + * This software is provided free for educational use only. It may + * not be used for commercial purposes without the prior written permission + * of the authors. + */ + +package Triangle.CodeGenerator.Entities; + +import Triangle.AbstractMachine.OpCode; +import Triangle.AbstractMachine.Primitive; +import Triangle.AbstractMachine.Register; +import Triangle.CodeGenerator.Emitter; +import Triangle.CodeGenerator.Frame; + +public class PrimitiveRoutine extends RuntimeEntity implements RoutineEntity { + + private final Primitive primitive; + + public PrimitiveRoutine(int size, Primitive primitive) { + super(size); + this.primitive = primitive; + } + + public final Primitive getPrimitive() { + return primitive; + } + + public void encodeCall(Emitter emitter, Frame frame) { + if (primitive != Primitive.ID) { + emitter.emit(OpCode.CALL, Register.PB, primitive); + } + } + + public void encodeFetch(Emitter emitter, Frame frame) { + emitter.emit(OpCode.LOADA, 0, Register.SB, 0); + emitter.emit(OpCode.LOADA, Register.PB, primitive); + } + +} \ No newline at end of file diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/RoutineEntity.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/RoutineEntity.java new file mode 100644 index 0000000..37884fe --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/RoutineEntity.java @@ -0,0 +1,11 @@ +package Triangle.CodeGenerator.Entities; + +import Triangle.CodeGenerator.Emitter; +import Triangle.CodeGenerator.Frame; + +public interface RoutineEntity { + + void encodeCall(Emitter emitter, Frame frame); + + void encodeFetch(Emitter emitter, Frame frame); +} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/RuntimeEntity.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/RuntimeEntity.java similarity index 78% rename from Triangle.Compiler/src/main/java/Triangle/CodeGenerator/RuntimeEntity.java rename to Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/RuntimeEntity.java index 69a1cf6..ed99d3a 100644 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/RuntimeEntity.java +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/RuntimeEntity.java @@ -12,22 +12,19 @@ * of the authors. */ -package Triangle.CodeGenerator; +package Triangle.CodeGenerator.Entities; // Run-time object public abstract class RuntimeEntity { - public final static int maxRoutineLevel = 7; + private final int size; - public RuntimeEntity() { - size = 0; - } - - public RuntimeEntity(int size) { + protected RuntimeEntity(int size) { this.size = size; } - public int size; - + public final int getSize() { + return size; + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/TypeRepresentation.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/TypeRepresentation.java similarity index 94% rename from Triangle.Compiler/src/main/java/Triangle/CodeGenerator/TypeRepresentation.java rename to Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/TypeRepresentation.java index ebe50c0..f39bd52 100644 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/TypeRepresentation.java +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/TypeRepresentation.java @@ -12,7 +12,7 @@ * of the authors. */ -package Triangle.CodeGenerator; +package Triangle.CodeGenerator.Entities; public class TypeRepresentation extends RuntimeEntity { diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/UnknownAddress.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/UnknownAddress.java new file mode 100644 index 0000000..38d820b --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/UnknownAddress.java @@ -0,0 +1,74 @@ +/* + * @(#)UnknownAddress.java 2.1 2003/10/07 + * + * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown + * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland + * and School of Computer and Math Sciences, The Robert Gordon University, + * St. Andrew Street, Aberdeen AB25 1HG, Scotland. + * All rights reserved. + * + * This software is provided free for educational use only. It may + * not be used for commercial purposes without the prior written permission + * of the authors. + */ + +package Triangle.CodeGenerator.Entities; + +import Triangle.AbstractMachine.Machine; +import Triangle.AbstractMachine.OpCode; +import Triangle.AbstractMachine.Primitive; +import Triangle.AbstractMachine.Register; +import Triangle.AbstractSyntaxTrees.Vnames.Vname; +import Triangle.CodeGenerator.Emitter; +import Triangle.CodeGenerator.Frame; + +public class UnknownAddress extends AddressableEntity { + + public UnknownAddress(int size, int level, int displacement) { + super(size, level, displacement); + } + + public void encodeStore(Emitter emitter, Frame frame, int size, Vname vname) { + + emitter.emit(OpCode.LOAD, Machine.addressSize, frame.getDisplayRegister(address), address.getDisplacement()); + if (vname.indexed) { + emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD); + } + + int offset = vname.offset; + if (offset != 0) { + emitter.emit(OpCode.LOADL, 0, offset); + emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD); + } + emitter.emit(OpCode.STOREI, size, 0); + } + + public void encodeFetch(Emitter emitter, Frame frame, int size, Vname vname) { + emitter.emit(OpCode.LOAD, Machine.addressSize, frame.getDisplayRegister(address), address.getDisplacement()); + + if (vname.indexed) { + emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD); + } + + int offset = vname.offset; + if (offset != 0) { + emitter.emit(OpCode.LOADL, offset); + emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD); + } + emitter.emit(OpCode.LOADI, size); + } + + public void encodeFetchAddress(Emitter emitter, Frame frame, Vname vname) { + + emitter.emit(OpCode.LOAD, Machine.addressSize, frame.getDisplayRegister(address), address.getDisplacement()); + if (vname.indexed) { + emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD); + } + + int offset = vname.offset; + if (offset != 0) { + emitter.emit(OpCode.LOADL, offset); + emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD); + } + } +} \ No newline at end of file diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/UnknownRoutine.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/UnknownRoutine.java new file mode 100644 index 0000000..b37b03e --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/UnknownRoutine.java @@ -0,0 +1,44 @@ +/* + * @(#)UnknownRoutine.java 2.1 2003/10/07 + * + * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown + * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland + * and School of Computer and Math Sciences, The Robert Gordon University, + * St. Andrew Street, Aberdeen AB25 1HG, Scotland. + * All rights reserved. + * + * This software is provided free for educational use only. It may + * not be used for commercial purposes without the prior written permission + * of the authors. + */ + +package Triangle.CodeGenerator.Entities; + +import Triangle.AbstractMachine.Machine; +import Triangle.AbstractMachine.OpCode; +import Triangle.CodeGenerator.Emitter; +import Triangle.CodeGenerator.Frame; + +public class UnknownRoutine extends RuntimeEntity implements RoutineEntity { + + private final ObjectAddress address; + + public UnknownRoutine(int size, int level, int displacement) { + super(size); + address = new ObjectAddress(level, displacement); + } + + public final ObjectAddress getAddress() { + return address; + } + + public void encodeCall(Emitter emitter, Frame frame) { + emitter.emit(OpCode.LOAD, Machine.closureSize, frame.getDisplayRegister(address), address.getDisplacement()); + emitter.emit(OpCode.CALLI, 0); + } + + public void encodeFetch(Emitter emitter, Frame frame) { + emitter.emit(OpCode.LOAD, Machine.closureSize, frame.getDisplayRegister(address), address.getDisplacement()); + } + +} \ No newline at end of file diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/UnknownValue.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/UnknownValue.java new file mode 100644 index 0000000..ba37c23 --- /dev/null +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Entities/UnknownValue.java @@ -0,0 +1,51 @@ +/* + * @(#)UnknownValue.java 2.1 2003/10/07 + * + * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown + * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland + * and School of Computer and Math Sciences, The Robert Gordon University, + * St. Andrew Street, Aberdeen AB25 1HG, Scotland. + * All rights reserved. + * + * This software is provided free for educational use only. It may + * not be used for commercial purposes without the prior written permission + * of the authors. + */ + +package Triangle.CodeGenerator.Entities; + +import Triangle.AbstractMachine.OpCode; +import Triangle.AbstractMachine.Primitive; +import Triangle.AbstractMachine.Register; +import Triangle.AbstractSyntaxTrees.Vnames.Vname; +import Triangle.CodeGenerator.Emitter; +import Triangle.CodeGenerator.Frame; + +public class UnknownValue extends RuntimeEntity implements FetchableEntity { + + private final ObjectAddress address; + + public UnknownValue(int size, int level, int displacement) { + super(size); + address = new ObjectAddress(level, displacement); + } + + public UnknownValue(int size, Frame frame) { + this(size, frame.getLevel(), frame.getSize()); + } + + public final ObjectAddress getAddress() { + return address; + } + + public void encodeFetch(Emitter emitter, Frame frame, int size, Vname vname) { + if (vname.indexed) { + emitter.emit(OpCode.LOADA, 0, frame.getDisplayRegister(address), address.getDisplacement() + vname.offset); + emitter.emit(OpCode.CALL, Register.PB, Primitive.ADD); + emitter.emit(OpCode.LOADI, size, 0); + } else { + emitter.emit(OpCode.LOAD, size, frame.getDisplayRegister(address), + address.getDisplacement() + vname.offset); + } + } +} \ No newline at end of file diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/EqualityRoutine.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/EqualityRoutine.java deleted file mode 100644 index 564e3ab..0000000 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/EqualityRoutine.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * @(#)EqualityRoutine.java 2.1 2003/10/07 - * - * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown - * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland - * and School of Computer and Math Sciences, The Robert Gordon University, - * St. Andrew Street, Aberdeen AB25 1HG, Scotland. - * All rights reserved. - * - * This software is provided free for educational use only. It may - * not be used for commercial purposes without the prior written permission - * of the authors. - */ - -package Triangle.CodeGenerator; - -public class EqualityRoutine extends RuntimeEntity { - - public EqualityRoutine() { - super(); - } - - public EqualityRoutine(int size, int displacement) { - super(size); - this.displacement = displacement; - } - - public int displacement; - -} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Frame.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Frame.java index 2d784d8..a05b44c 100644 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Frame.java +++ b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/Frame.java @@ -14,33 +14,60 @@ package Triangle.CodeGenerator; +import Triangle.AbstractMachine.Register; +import Triangle.CodeGenerator.Entities.ObjectAddress; + public class Frame { - public Frame() { - this.level = 0; - this.size = 0; - } + public static final Frame Initial = new Frame(0, 0); - public Frame(int level, Integer size) { - this.level = level; - this.size = size.intValue(); - } + private final int level; - public Frame(int level, int size) { + private final int size; + + private Frame(int level, int size) { this.level = level; this.size = size; } - public Frame(Frame frame, int sizeIncrement) { - this.level = frame.level; - this.size = frame.size + sizeIncrement; + public final int getLevel() { + return level; + } + + public final int getSize() { + return size; } - public Frame(Frame frame, Integer sizeIncrement) { - this.level = frame.level; - this.size = frame.size + sizeIncrement.intValue(); + public Frame expand(int increment) { + return new Frame(level, size + increment); } - protected int level; - protected int size; + public Frame replace(int size) { + return new Frame(level, size); + } + + public Frame push(int size) { + return new Frame(level + 1, size); + } + + /** + * Returns the display register appropriate for object code at the current + * static level to access a data object at the static level of the given + * address. + * + * @param address the address of the data object + * @return the display register required for static addressing + */ + public Register getDisplayRegister(ObjectAddress address) { + if (address.getLevel() == 0) { + return Register.SB; + } + + if (level - address.getLevel() <= 6) { + return Register.values()[Register.LB.ordinal() + level - address.getLevel()]; // LB|L1|...|L6 + } + + // _errorReporter.ReportRestriction("can't access data more than 6 levels out"); + return Register.L6; // to allow code generation to continue + } } diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/KnownAddress.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/KnownAddress.java deleted file mode 100644 index 3e84c59..0000000 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/KnownAddress.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * @(#)KnownAddress.java 2.1 2003/10/07 - * - * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown - * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland - * and School of Computer and Math Sciences, The Robert Gordon University, - * St. Andrew Street, Aberdeen AB25 1HG, Scotland. - * All rights reserved. - * - * This software is provided free for educational use only. It may - * not be used for commercial purposes without the prior written permission - * of the authors. - */ - -package Triangle.CodeGenerator; - -public class KnownAddress extends RuntimeEntity { - - public KnownAddress() { - super(); - address = null; - } - - public KnownAddress(int size, int level, int displacement) { - super(size); - address = new ObjectAddress(level, displacement); - } - - public ObjectAddress address; - -} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/KnownRoutine.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/KnownRoutine.java deleted file mode 100644 index 4262c6b..0000000 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/KnownRoutine.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * @(#)KnownRoutine.java 2.1 2003/10/07 - * - * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown - * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland - * and School of Computer and Math Sciences, The Robert Gordon University, - * St. Andrew Street, Aberdeen AB25 1HG, Scotland. - * All rights reserved. - * - * This software is provided free for educational use only. It may - * not be used for commercial purposes without the prior written permission - * of the authors. - */ - -package Triangle.CodeGenerator; - -public class KnownRoutine extends RuntimeEntity { - - public KnownRoutine() { - super(); - address = null; - } - - public KnownRoutine(int size, int level, int displacement) { - super(size); - address = new ObjectAddress(level, displacement); - } - - public ObjectAddress address; - -} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/PrimitiveRoutine.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/PrimitiveRoutine.java deleted file mode 100644 index e857dd5..0000000 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/PrimitiveRoutine.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * @(#)PrimitiveRoutine.java 2.1 2003/10/07 - * - * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown - * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland - * and School of Computer and Math Sciences, The Robert Gordon University, - * St. Andrew Street, Aberdeen AB25 1HG, Scotland. - * All rights reserved. - * - * This software is provided free for educational use only. It may - * not be used for commercial purposes without the prior written permission - * of the authors. - */ - -package Triangle.CodeGenerator; - -public class PrimitiveRoutine extends RuntimeEntity { - - public PrimitiveRoutine() { - super(); - displacement = 0; - } - - public PrimitiveRoutine(int size, int displacement) { - super(size); - this.displacement = displacement; - } - - public int displacement; - -} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/UnknownAddress.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/UnknownAddress.java deleted file mode 100644 index d3ff717..0000000 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/UnknownAddress.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * @(#)UnknownAddress.java 2.1 2003/10/07 - * - * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown - * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland - * and School of Computer and Math Sciences, The Robert Gordon University, - * St. Andrew Street, Aberdeen AB25 1HG, Scotland. - * All rights reserved. - * - * This software is provided free for educational use only. It may - * not be used for commercial purposes without the prior written permission - * of the authors. - */ - -package Triangle.CodeGenerator; - -public class UnknownAddress extends RuntimeEntity { - - public UnknownAddress() { - super(); - address = null; - } - - public UnknownAddress(int size, int level, int displacement) { - super(size); - address = new ObjectAddress(level, displacement); - } - - public ObjectAddress address; - -} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/UnknownRoutine.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/UnknownRoutine.java deleted file mode 100644 index 0b2d4ea..0000000 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/UnknownRoutine.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * @(#)UnknownRoutine.java 2.1 2003/10/07 - * - * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown - * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland - * and School of Computer and Math Sciences, The Robert Gordon University, - * St. Andrew Street, Aberdeen AB25 1HG, Scotland. - * All rights reserved. - * - * This software is provided free for educational use only. It may - * not be used for commercial purposes without the prior written permission - * of the authors. - */ - -package Triangle.CodeGenerator; - -public class UnknownRoutine extends RuntimeEntity { - - public UnknownRoutine() { - super(); - address = null; - } - - public UnknownRoutine(int size, int level, int displacement) { - super(size); - address = new ObjectAddress(level, displacement); - } - - public ObjectAddress address; - -} diff --git a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/UnknownValue.java b/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/UnknownValue.java deleted file mode 100644 index 3918607..0000000 --- a/Triangle.Compiler/src/main/java/Triangle/CodeGenerator/UnknownValue.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * @(#)UnknownValue.java 2.1 2003/10/07 - * - * Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown - * Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland - * and School of Computer and Math Sciences, The Robert Gordon University, - * St. Andrew Street, Aberdeen AB25 1HG, Scotland. - * All rights reserved. - * - * This software is provided free for educational use only. It may - * not be used for commercial purposes without the prior written permission - * of the authors. - */ - -package Triangle.CodeGenerator; - -public class UnknownValue extends RuntimeEntity { - - public UnknownValue() { - super(); - address = null; - } - - public UnknownValue(int size, int level, int displacement) { - super(size); - address = new ObjectAddress(level, displacement); - } - - public ObjectAddress address; - -} diff --git a/Triangle.Compiler/src/main/java/Triangle/Compiler.java b/Triangle.Compiler/src/main/java/Triangle/Compiler.java index 0fc04b1..0d68c42 100644 --- a/Triangle.Compiler/src/main/java/Triangle/Compiler.java +++ b/Triangle.Compiler/src/main/java/Triangle/Compiler.java @@ -15,6 +15,7 @@ package Triangle; import Triangle.AbstractSyntaxTrees.Program; +import Triangle.CodeGenerator.Emitter; import Triangle.CodeGenerator.Encoder; import Triangle.ContextualAnalyzer.Checker; import Triangle.SyntacticAnalyzer.Parser; @@ -37,6 +38,7 @@ public class Compiler { private static Parser parser; private static Checker checker; private static Encoder encoder; + private static Emitter emitter; private static ErrorReporter reporter; private static Drawer drawer; @@ -72,7 +74,8 @@ public class Compiler { reporter = new ErrorReporter(); parser = new Parser(scanner, reporter); checker = new Checker(reporter); - encoder = new Encoder(reporter); + encoder = new Encoder(emitter, reporter); + emitter = new Emitter(reporter); drawer = new Drawer(); // scanner.enableDebugging(); @@ -94,7 +97,7 @@ public class Compiler { boolean successful = (reporter.numErrors == 0); if (successful) { - encoder.saveObjectProgram(objectName); + emitter.saveObjectProgram(objectName); System.out.println("Compilation was successful."); } else { System.out.println("Compilation was unsuccessful."); diff --git a/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/Checker.java b/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/Checker.java index 0b157b5..a97af88 100644 --- a/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/Checker.java +++ b/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/Checker.java @@ -16,126 +16,156 @@ package Triangle.ContextualAnalyzer; import Triangle.ErrorReporter; import Triangle.StdEnvironment; -import Triangle.AbstractSyntaxTrees.AnyTypeDenoter; -import Triangle.AbstractSyntaxTrees.ArrayExpression; -import Triangle.AbstractSyntaxTrees.ArrayTypeDenoter; -import Triangle.AbstractSyntaxTrees.AssignCommand; -import Triangle.AbstractSyntaxTrees.BinaryExpression; -import Triangle.AbstractSyntaxTrees.BinaryOperatorDeclaration; -import Triangle.AbstractSyntaxTrees.BoolTypeDenoter; -import Triangle.AbstractSyntaxTrees.CallCommand; -import Triangle.AbstractSyntaxTrees.CallExpression; -import Triangle.AbstractSyntaxTrees.CharTypeDenoter; -import Triangle.AbstractSyntaxTrees.CharacterExpression; -import Triangle.AbstractSyntaxTrees.CharacterLiteral; -import Triangle.AbstractSyntaxTrees.ConstActualParameter; -import Triangle.AbstractSyntaxTrees.ConstDeclaration; -import Triangle.AbstractSyntaxTrees.ConstFormalParameter; -import Triangle.AbstractSyntaxTrees.Declaration; -import Triangle.AbstractSyntaxTrees.DotVname; -import Triangle.AbstractSyntaxTrees.EmptyActualParameterSequence; -import Triangle.AbstractSyntaxTrees.EmptyCommand; -import Triangle.AbstractSyntaxTrees.EmptyExpression; -import Triangle.AbstractSyntaxTrees.EmptyFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.ErrorTypeDenoter; -import Triangle.AbstractSyntaxTrees.FieldTypeDenoter; -import Triangle.AbstractSyntaxTrees.FormalParameter; -import Triangle.AbstractSyntaxTrees.FormalParameterSequence; -import Triangle.AbstractSyntaxTrees.FuncActualParameter; -import Triangle.AbstractSyntaxTrees.FuncDeclaration; -import Triangle.AbstractSyntaxTrees.FuncFormalParameter; -import Triangle.AbstractSyntaxTrees.Identifier; -import Triangle.AbstractSyntaxTrees.IfCommand; -import Triangle.AbstractSyntaxTrees.IfExpression; -import Triangle.AbstractSyntaxTrees.IntTypeDenoter; -import Triangle.AbstractSyntaxTrees.IntegerExpression; -import Triangle.AbstractSyntaxTrees.IntegerLiteral; -import Triangle.AbstractSyntaxTrees.LetCommand; -import Triangle.AbstractSyntaxTrees.LetExpression; -import Triangle.AbstractSyntaxTrees.MultipleActualParameterSequence; -import Triangle.AbstractSyntaxTrees.MultipleArrayAggregate; -import Triangle.AbstractSyntaxTrees.MultipleFieldTypeDenoter; -import Triangle.AbstractSyntaxTrees.MultipleFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.MultipleRecordAggregate; -import Triangle.AbstractSyntaxTrees.Operator; -import Triangle.AbstractSyntaxTrees.ProcActualParameter; -import Triangle.AbstractSyntaxTrees.ProcDeclaration; -import Triangle.AbstractSyntaxTrees.ProcFormalParameter; import Triangle.AbstractSyntaxTrees.Program; -import Triangle.AbstractSyntaxTrees.RecordExpression; -import Triangle.AbstractSyntaxTrees.RecordTypeDenoter; -import Triangle.AbstractSyntaxTrees.SequentialCommand; -import Triangle.AbstractSyntaxTrees.SequentialDeclaration; -import Triangle.AbstractSyntaxTrees.SimpleTypeDenoter; -import Triangle.AbstractSyntaxTrees.SimpleVname; -import Triangle.AbstractSyntaxTrees.SingleActualParameterSequence; -import Triangle.AbstractSyntaxTrees.SingleArrayAggregate; -import Triangle.AbstractSyntaxTrees.SingleFieldTypeDenoter; -import Triangle.AbstractSyntaxTrees.SingleFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.SingleRecordAggregate; -import Triangle.AbstractSyntaxTrees.SubscriptVname; -import Triangle.AbstractSyntaxTrees.Terminal; -import Triangle.AbstractSyntaxTrees.TypeDeclaration; -import Triangle.AbstractSyntaxTrees.TypeDenoter; -import Triangle.AbstractSyntaxTrees.UnaryExpression; -import Triangle.AbstractSyntaxTrees.UnaryOperatorDeclaration; -import Triangle.AbstractSyntaxTrees.VarActualParameter; -import Triangle.AbstractSyntaxTrees.VarDeclaration; -import Triangle.AbstractSyntaxTrees.VarFormalParameter; -import Triangle.AbstractSyntaxTrees.Visitor; -import Triangle.AbstractSyntaxTrees.VnameExpression; -import Triangle.AbstractSyntaxTrees.WhileCommand; +import Triangle.AbstractSyntaxTrees.Actuals.ConstActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.EmptyActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.FuncActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.MultipleActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.ProcActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.SingleActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.VarActualParameter; +import Triangle.AbstractSyntaxTrees.Aggregates.MultipleArrayAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.MultipleRecordAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.SingleArrayAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.SingleRecordAggregate; +import Triangle.AbstractSyntaxTrees.Commands.AssignCommand; +import Triangle.AbstractSyntaxTrees.Commands.CallCommand; +import Triangle.AbstractSyntaxTrees.Commands.EmptyCommand; +import Triangle.AbstractSyntaxTrees.Commands.IfCommand; +import Triangle.AbstractSyntaxTrees.Commands.LetCommand; +import Triangle.AbstractSyntaxTrees.Commands.SequentialCommand; +import Triangle.AbstractSyntaxTrees.Commands.WhileCommand; +import Triangle.AbstractSyntaxTrees.Declarations.BinaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.ConstDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.Declaration; +import Triangle.AbstractSyntaxTrees.Declarations.FuncDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.ProcDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.SequentialDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.UnaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.VarDeclaration; +import Triangle.AbstractSyntaxTrees.Expressions.ArrayExpression; +import Triangle.AbstractSyntaxTrees.Expressions.BinaryExpression; +import Triangle.AbstractSyntaxTrees.Expressions.CallExpression; +import Triangle.AbstractSyntaxTrees.Expressions.CharacterExpression; +import Triangle.AbstractSyntaxTrees.Expressions.EmptyExpression; +import Triangle.AbstractSyntaxTrees.Expressions.IfExpression; +import Triangle.AbstractSyntaxTrees.Expressions.IntegerExpression; +import Triangle.AbstractSyntaxTrees.Expressions.LetExpression; +import Triangle.AbstractSyntaxTrees.Expressions.RecordExpression; +import Triangle.AbstractSyntaxTrees.Expressions.UnaryExpression; +import Triangle.AbstractSyntaxTrees.Expressions.VnameExpression; +import Triangle.AbstractSyntaxTrees.Formals.ConstFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.EmptyFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.FormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.FormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.FuncFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.MultipleFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.ProcFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.SingleFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.VarFormalParameter; +import Triangle.AbstractSyntaxTrees.Terminals.CharacterLiteral; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral; +import Triangle.AbstractSyntaxTrees.Terminals.Operator; +import Triangle.AbstractSyntaxTrees.Terminals.Terminal; +import Triangle.AbstractSyntaxTrees.Types.AnyTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.ArrayTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.BoolTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.CharTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.ErrorTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.FieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.IntTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.MultipleFieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.RecordTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.SimpleTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.SingleFieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.TypeDeclaration; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.IdentifierVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.LiteralVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.OperatorVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ProgramVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.RecordAggregateVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor; +import Triangle.AbstractSyntaxTrees.Vnames.DotVname; +import Triangle.AbstractSyntaxTrees.Vnames.SimpleVname; +import Triangle.AbstractSyntaxTrees.Vnames.SubscriptVname; import Triangle.SyntacticAnalyzer.SourcePosition; -public final class Checker implements Visitor { +public final class Checker implements ActualParameterVisitor, + ActualParameterSequenceVisitor, ArrayAggregateVisitor, + CommandVisitor, DeclarationVisitor, ExpressionVisitor, + FormalParameterVisitor, FormalParameterSequenceVisitor, + IdentifierVisitor, LiteralVisitor, OperatorVisitor, + ProgramVisitor, RecordAggregateVisitor, + TypeDenoterVisitor, VnameVisitor { // Commands // Always returns null. Does not use the given object. @Override - public Object visitAssignCommand(AssignCommand ast, Object o) { - TypeDenoter vType = (TypeDenoter) ast.V.visit(this); - TypeDenoter eType = (TypeDenoter) ast.E.visit(this); - if (!ast.V.variable) - reporter.reportError("LHS of assignment is not a variable", "", ast.V.position); - if (!eType.equals(vType)) - reporter.reportError("assignment incompatibilty", "", ast.position); + public Void visitAssignCommand(AssignCommand ast, Void arg) { + var vType = ast.V.visit(this); + var eType = ast.E.visit(this); + + if (!ast.V.variable) { + reporter.reportError("LHS of assignment is not a variable", "", ast.V.getPosition()); + } + + if (!eType.equals(vType)) { + reporter.reportError("assignment incompatibilty", "", ast.getPosition()); + } + return null; } @Override - public Object visitCallCommand(CallCommand ast, Object o) { + public Void visitCallCommand(CallCommand ast, Void arg) { - Declaration binding = (Declaration) ast.I.visit(this); - if (binding == null) + var binding = ast.I.visit(this); + if (binding == null) { reportUndeclared(ast.I); - else if (binding instanceof ProcDeclaration) { + } else if (binding instanceof ProcDeclaration) { ast.APS.visit(this, ((ProcDeclaration) binding).FPS); } else if (binding instanceof ProcFormalParameter) { ast.APS.visit(this, ((ProcFormalParameter) binding).FPS); - } else - reporter.reportError("\"%\" is not a procedure identifier", ast.I.spelling, ast.I.position); + } else { + reporter.reportError("\"%\" is not a procedure identifier", ast.I.spelling, ast.I.getPosition()); + } + return null; } @Override - public Object visitEmptyCommand(EmptyCommand ast, Object o) { + public Void visitEmptyCommand(EmptyCommand ast, Void arg) { return null; } @Override - public Object visitIfCommand(IfCommand ast, Object o) { - TypeDenoter eType = (TypeDenoter) ast.E.visit(this); - if (!eType.equals(StdEnvironment.booleanType)) - reporter.reportError("Boolean expression expected here", "", ast.E.position); + public Void visitIfCommand(IfCommand ast, Void arg) { + var eType = ast.E.visit(this); + if (!eType.equals(StdEnvironment.booleanType)) { + reporter.reportError("Boolean expression expected here", "", ast.E.getPosition()); + } + ast.C1.visit(this); ast.C2.visit(this); + return null; } @Override - public Object visitLetCommand(LetCommand ast, Object o) { + public Void visitLetCommand(LetCommand ast, Void arg) { idTable.openScope(); ast.D.visit(this); ast.C.visit(this); @@ -144,17 +174,18 @@ public final class Checker implements Visitor { } @Override - public Object visitSequentialCommand(SequentialCommand ast, Object o) { + public Void visitSequentialCommand(SequentialCommand ast, Void arg) { ast.C1.visit(this); ast.C2.visit(this); return null; } @Override - public Object visitWhileCommand(WhileCommand ast, Object o) { - TypeDenoter eType = (TypeDenoter) ast.E.visit(this); - if (!eType.equals(StdEnvironment.booleanType)) - reporter.reportError("Boolean expression expected here", "", ast.E.position); + public Void visitWhileCommand(WhileCommand ast, Void arg) { + var eType = ast.E.visit(this); + if (!eType.equals(StdEnvironment.booleanType)) { + reporter.reportError("Boolean expression expected here", "", ast.E.getPosition()); + } ast.C.visit(this); return null; } @@ -165,42 +196,46 @@ public final class Checker implements Visitor { // not use the given object. @Override - public Object visitArrayExpression(ArrayExpression ast, Object o) { - TypeDenoter elemType = (TypeDenoter) ast.AA.visit(this); - IntegerLiteral il = new IntegerLiteral(Integer.valueOf(ast.AA.elemCount).toString(), ast.position); - ast.type = new ArrayTypeDenoter(il, elemType, ast.position); + public TypeDenoter visitArrayExpression(ArrayExpression ast, Void arg) { + var elemType = ast.AA.visit(this); + var il = new IntegerLiteral(Integer.toString(ast.AA.elemCount), ast.getPosition()); + ast.type = new ArrayTypeDenoter(il, elemType, ast.getPosition()); return ast.type; } @Override - public Object visitBinaryExpression(BinaryExpression ast, Object o) { + public TypeDenoter visitBinaryExpression(BinaryExpression ast, Void arg) { - TypeDenoter e1Type = (TypeDenoter) ast.E1.visit(this); - TypeDenoter e2Type = (TypeDenoter) ast.E2.visit(this); - Declaration binding = (Declaration) ast.O.visit(this); + var e1Type = ast.E1.visit(this); + var e2Type = ast.E2.visit(this); + var binding = ast.O.visit(this); - if (binding == null) + if (binding == null) { reportUndeclared(ast.O); - else { + } else { if (!(binding instanceof BinaryOperatorDeclaration)) - reporter.reportError("\"%\" is not a binary operator", ast.O.spelling, ast.O.position); - BinaryOperatorDeclaration bbinding = (BinaryOperatorDeclaration) binding; + reporter.reportError("\"%\" is not a binary operator", ast.O.spelling, ast.O.getPosition()); + var bbinding = (BinaryOperatorDeclaration) binding; if (bbinding.ARG1 == StdEnvironment.anyType) { // this operator must be "=" or "\=" - if (!e1Type.equals(e2Type)) - reporter.reportError("incompatible argument types for \"%\"", ast.O.spelling, ast.position); - } else if (!e1Type.equals(bbinding.ARG1)) - reporter.reportError("wrong argument type for \"%\"", ast.O.spelling, ast.E1.position); - else if (!e2Type.equals(bbinding.ARG2)) - reporter.reportError("wrong argument type for \"%\"", ast.O.spelling, ast.E2.position); + if (!e1Type.equals(e2Type)) { + reporter.reportError("incompatible argument types for \"%\"", ast.O.spelling, ast.getPosition()); + } + } else if (!e1Type.equals(bbinding.ARG1)) { + reporter.reportError("wrong argument type for \"%\"", ast.O.spelling, ast.E1.getPosition()); + } else if (!e2Type.equals(bbinding.ARG2)) { + reporter.reportError("wrong argument type for \"%\"", ast.O.spelling, ast.E2.getPosition()); + } + ast.type = bbinding.RES; } + return ast.type; } @Override - public Object visitCallExpression(CallExpression ast, Object o) { - Declaration binding = (Declaration) ast.I.visit(this); + public TypeDenoter visitCallExpression(CallExpression ast, Void arg) { + var binding = ast.I.visit(this); if (binding == null) { reportUndeclared(ast.I); ast.type = StdEnvironment.errorType; @@ -210,80 +245,85 @@ public final class Checker implements Visitor { } else if (binding instanceof FuncFormalParameter) { ast.APS.visit(this, ((FuncFormalParameter) binding).FPS); ast.type = ((FuncFormalParameter) binding).T; - } else - reporter.reportError("\"%\" is not a function identifier", ast.I.spelling, ast.I.position); + } else { + reporter.reportError("\"%\" is not a function identifier", ast.I.spelling, ast.I.getPosition()); + } + return ast.type; } @Override - public Object visitCharacterExpression(CharacterExpression ast, Object o) { + public TypeDenoter visitCharacterExpression(CharacterExpression ast, Void arg) { ast.type = StdEnvironment.charType; return ast.type; } @Override - public Object visitEmptyExpression(EmptyExpression ast, Object o) { + public TypeDenoter visitEmptyExpression(EmptyExpression ast, Void arg) { ast.type = null; return ast.type; } @Override - public Object visitIfExpression(IfExpression ast, Object o) { - TypeDenoter e1Type = (TypeDenoter) ast.E1.visit(this); - if (!e1Type.equals(StdEnvironment.booleanType)) - reporter.reportError("Boolean expression expected here", "", ast.E1.position); - TypeDenoter e2Type = (TypeDenoter) ast.E2.visit(this); - TypeDenoter e3Type = (TypeDenoter) ast.E3.visit(this); - if (!e2Type.equals(e3Type)) - reporter.reportError("incompatible limbs in if-expression", "", ast.position); + public TypeDenoter visitIfExpression(IfExpression ast, Void arg) { + var e1Type = ast.E1.visit(this); + if (!e1Type.equals(StdEnvironment.booleanType)) { + reporter.reportError("Boolean expression expected here", "", ast.E1.getPosition()); + } + var e2Type = ast.E2.visit(this); + var e3Type = ast.E3.visit(this); + if (!e2Type.equals(e3Type)) { + reporter.reportError("incompatible limbs in if-expression", "", ast.getPosition()); + } ast.type = e2Type; return ast.type; } @Override - public Object visitIntegerExpression(IntegerExpression ast, Object o) { + public TypeDenoter visitIntegerExpression(IntegerExpression ast, Void arg) { ast.type = StdEnvironment.integerType; return ast.type; } @Override - public Object visitLetExpression(LetExpression ast, Object o) { + public TypeDenoter visitLetExpression(LetExpression ast, Void arg) { idTable.openScope(); ast.D.visit(this); - ast.type = (TypeDenoter) ast.E.visit(this); + ast.type = ast.E.visit(this); idTable.closeScope(); return ast.type; } @Override - public Object visitRecordExpression(RecordExpression ast, Object o) { - FieldTypeDenoter rType = (FieldTypeDenoter) ast.RA.visit(this); - ast.type = new RecordTypeDenoter(rType, ast.position); + public TypeDenoter visitRecordExpression(RecordExpression ast, Void arg) { + var rType = ast.RA.visit(this); + ast.type = new RecordTypeDenoter(rType, ast.getPosition()); return ast.type; } @Override - public Object visitUnaryExpression(UnaryExpression ast, Object o) { + public TypeDenoter visitUnaryExpression(UnaryExpression ast, Void arg) { - TypeDenoter eType = (TypeDenoter) ast.E.visit(this); - Declaration binding = (Declaration) ast.O.visit(this); + var eType = ast.E.visit(this); + var binding = ast.O.visit(this); if (binding == null) { reportUndeclared(ast.O); ast.type = StdEnvironment.errorType; - } else if (!(binding instanceof UnaryOperatorDeclaration)) - reporter.reportError("\"%\" is not a unary operator", ast.O.spelling, ast.O.position); - else { - UnaryOperatorDeclaration ubinding = (UnaryOperatorDeclaration) binding; - if (!eType.equals(ubinding.ARG)) - reporter.reportError("wrong argument type for \"%\"", ast.O.spelling, ast.O.position); + } else if (!(binding instanceof UnaryOperatorDeclaration)) { + reporter.reportError("\"%\" is not a unary operator", ast.O.spelling, ast.O.getPosition()); + } else { + var ubinding = (UnaryOperatorDeclaration) binding; + if (!eType.equals(ubinding.ARG)) { + reporter.reportError("wrong argument type for \"%\"", ast.O.spelling, ast.O.getPosition()); + } ast.type = ubinding.RES; } return ast.type; } @Override - public Object visitVnameExpression(VnameExpression ast, Object o) { - ast.type = (TypeDenoter) ast.V.visit(this); + public TypeDenoter visitVnameExpression(VnameExpression ast, Void arg) { + ast.type = ast.V.visit(this); return ast.type; } @@ -291,39 +331,43 @@ public final class Checker implements Visitor { // Always returns null. Does not use the given object. @Override - public Object visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, Object o) { + public Void visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, Void arg) { return null; } @Override - public Object visitConstDeclaration(ConstDeclaration ast, Object o) { - TypeDenoter eType = (TypeDenoter) ast.E.visit(this); + public Void visitConstDeclaration(ConstDeclaration ast, Void arg) { + ast.E.visit(this); idTable.enter(ast.I.spelling, ast); - if (ast.duplicated) - reporter.reportError("identifier \"%\" already declared", ast.I.spelling, ast.position); + if (ast.duplicated) { + reporter.reportError("identifier \"%\" already declared", ast.I.spelling, ast.getPosition()); + } return null; } @Override - public Object visitFuncDeclaration(FuncDeclaration ast, Object o) { - ast.T = (TypeDenoter) ast.T.visit(this); + public Void visitFuncDeclaration(FuncDeclaration ast, Void arg) { + ast.T = ast.T.visit(this); idTable.enter(ast.I.spelling, ast); // permits recursion - if (ast.duplicated) - reporter.reportError("identifier \"%\" already declared", ast.I.spelling, ast.position); + if (ast.duplicated) { + reporter.reportError("identifier \"%\" already declared", ast.I.spelling, ast.getPosition()); + } idTable.openScope(); ast.FPS.visit(this); - TypeDenoter eType = (TypeDenoter) ast.E.visit(this); + var eType = ast.E.visit(this); idTable.closeScope(); - if (!ast.T.equals(eType)) - reporter.reportError("body of function \"%\" has wrong type", ast.I.spelling, ast.E.position); + if (!ast.T.equals(eType)) { + reporter.reportError("body of function \"%\" has wrong type", ast.I.spelling, ast.E.getPosition()); + } return null; } @Override - public Object visitProcDeclaration(ProcDeclaration ast, Object o) { + public Void visitProcDeclaration(ProcDeclaration ast, Void arg) { idTable.enter(ast.I.spelling, ast); // permits recursion - if (ast.duplicated) - reporter.reportError("identifier \"%\" already declared", ast.I.spelling, ast.position); + if (ast.duplicated) { + reporter.reportError("identifier \"%\" already declared", ast.I.spelling, ast.getPosition()); + } idTable.openScope(); ast.FPS.visit(this); ast.C.visit(this); @@ -332,32 +376,34 @@ public final class Checker implements Visitor { } @Override - public Object visitSequentialDeclaration(SequentialDeclaration ast, Object o) { + public Void visitSequentialDeclaration(SequentialDeclaration ast, Void arg) { ast.D1.visit(this); ast.D2.visit(this); return null; } @Override - public Object visitTypeDeclaration(TypeDeclaration ast, Object o) { - ast.T = (TypeDenoter) ast.T.visit(this); + public Void visitTypeDeclaration(TypeDeclaration ast, Void arg) { + ast.T = ast.T.visit(this); idTable.enter(ast.I.spelling, ast); - if (ast.duplicated) - reporter.reportError("identifier \"%\" already declared", ast.I.spelling, ast.position); + if (ast.duplicated) { + reporter.reportError("identifier \"%\" already declared", ast.I.spelling, ast.getPosition()); + } return null; } @Override - public Object visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Object o) { + public Void visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Void arg) { return null; } @Override - public Object visitVarDeclaration(VarDeclaration ast, Object o) { - ast.T = (TypeDenoter) ast.T.visit(this); + public Void visitVarDeclaration(VarDeclaration ast, Void arg) { + ast.T = ast.T.visit(this); idTable.enter(ast.I.spelling, ast); - if (ast.duplicated) - reporter.reportError("identifier \"%\" already declared", ast.I.spelling, ast.position); + if (ast.duplicated) { + reporter.reportError("identifier \"%\" already declared", ast.I.spelling, ast.getPosition()); + } return null; } @@ -368,18 +414,19 @@ public final class Checker implements Visitor { // given object. @Override - public Object visitMultipleArrayAggregate(MultipleArrayAggregate ast, Object o) { - TypeDenoter eType = (TypeDenoter) ast.E.visit(this); - TypeDenoter elemType = (TypeDenoter) ast.AA.visit(this); + public TypeDenoter visitMultipleArrayAggregate(MultipleArrayAggregate ast, Void arg) { + var eType = ast.E.visit(this); + var elemType = ast.AA.visit(this); ast.elemCount = ast.AA.elemCount + 1; - if (!eType.equals(elemType)) - reporter.reportError("incompatible array-aggregate element", "", ast.E.position); + if (!eType.equals(elemType)) { + reporter.reportError("incompatible array-aggregate element", "", ast.E.getPosition()); + } return elemType; } @Override - public Object visitSingleArrayAggregate(SingleArrayAggregate ast, Object o) { - TypeDenoter elemType = (TypeDenoter) ast.E.visit(this); + public TypeDenoter visitSingleArrayAggregate(SingleArrayAggregate ast, Void arg) { + var elemType = ast.E.visit(this); ast.elemCount = 1; return elemType; } @@ -390,20 +437,21 @@ public final class Checker implements Visitor { // given object. @Override - public Object visitMultipleRecordAggregate(MultipleRecordAggregate ast, Object o) { - TypeDenoter eType = (TypeDenoter) ast.E.visit(this); - FieldTypeDenoter rType = (FieldTypeDenoter) ast.RA.visit(this); - TypeDenoter fType = checkFieldIdentifier(rType, ast.I); - if (fType != StdEnvironment.errorType) - reporter.reportError("duplicate field \"%\" in record", ast.I.spelling, ast.I.position); - ast.type = new MultipleFieldTypeDenoter(ast.I, eType, rType, ast.position); + public FieldTypeDenoter visitMultipleRecordAggregate(MultipleRecordAggregate ast, Void arg) { + var eType = ast.E.visit(this); + var rType = ast.RA.visit(this); + var fType = checkFieldIdentifier(rType, ast.I); + if (fType != StdEnvironment.errorType) { + reporter.reportError("duplicate field \"%\" in record", ast.I.spelling, ast.I.getPosition()); + } + ast.type = new MultipleFieldTypeDenoter(ast.I, eType, rType, ast.getPosition()); return ast.type; } @Override - public Object visitSingleRecordAggregate(SingleRecordAggregate ast, Object o) { - TypeDenoter eType = (TypeDenoter) ast.E.visit(this); - ast.type = new SingleFieldTypeDenoter(ast.I, eType, ast.position); + public FieldTypeDenoter visitSingleRecordAggregate(SingleRecordAggregate ast, Void arg) { + var eType = ast.E.visit(this); + ast.type = new SingleFieldTypeDenoter(ast.I, eType, ast.getPosition()); return ast.type; } @@ -412,60 +460,64 @@ public final class Checker implements Visitor { // Always returns null. Does not use the given object. @Override - public Object visitConstFormalParameter(ConstFormalParameter ast, Object o) { - ast.T = (TypeDenoter) ast.T.visit(this); + public Void visitConstFormalParameter(ConstFormalParameter ast, Void arg) { + ast.T = ast.T.visit(this); idTable.enter(ast.I.spelling, ast); - if (ast.duplicated) - reporter.reportError("duplicated formal parameter \"%\"", ast.I.spelling, ast.position); + if (ast.duplicated) { + reporter.reportError("duplicated formal parameter \"%\"", ast.I.spelling, ast.getPosition()); + } return null; } @Override - public Object visitFuncFormalParameter(FuncFormalParameter ast, Object o) { + public Void visitFuncFormalParameter(FuncFormalParameter ast, Void arg) { idTable.openScope(); ast.FPS.visit(this); idTable.closeScope(); - ast.T = (TypeDenoter) ast.T.visit(this); + ast.T = ast.T.visit(this); idTable.enter(ast.I.spelling, ast); - if (ast.duplicated) - reporter.reportError("duplicated formal parameter \"%\"", ast.I.spelling, ast.position); + if (ast.duplicated) { + reporter.reportError("duplicated formal parameter \"%\"", ast.I.spelling, ast.getPosition()); + } return null; } @Override - public Object visitProcFormalParameter(ProcFormalParameter ast, Object o) { + public Void visitProcFormalParameter(ProcFormalParameter ast, Void arg) { idTable.openScope(); ast.FPS.visit(this); idTable.closeScope(); idTable.enter(ast.I.spelling, ast); - if (ast.duplicated) - reporter.reportError("duplicated formal parameter \"%\"", ast.I.spelling, ast.position); + if (ast.duplicated) { + reporter.reportError("duplicated formal parameter \"%\"", ast.I.spelling, ast.getPosition()); + } return null; } @Override - public Object visitVarFormalParameter(VarFormalParameter ast, Object o) { - ast.T = (TypeDenoter) ast.T.visit(this); + public Void visitVarFormalParameter(VarFormalParameter ast, Void arg) { + ast.T = ast.T.visit(this); idTable.enter(ast.I.spelling, ast); - if (ast.duplicated) - reporter.reportError("duplicated formal parameter \"%\"", ast.I.spelling, ast.position); + if (ast.duplicated) { + reporter.reportError("duplicated formal parameter \"%\"", ast.I.spelling, ast.getPosition()); + } return null; } @Override - public Object visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Object o) { + public Void visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Void arg) { return null; } @Override - public Object visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Object o) { + public Void visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Void arg) { ast.FP.visit(this); ast.FPS.visit(this); return null; } @Override - public Object visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Object o) { + public Void visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Void arg) { ast.FP.visit(this); return null; } @@ -475,29 +527,26 @@ public final class Checker implements Visitor { // Always returns null. Uses the given FormalParameter. @Override - public Object visitConstActualParameter(ConstActualParameter ast, Object o) { - FormalParameter fp = (FormalParameter) o; - TypeDenoter eType = (TypeDenoter) ast.E.visit(this); - - if (!(fp instanceof ConstFormalParameter)) - reporter.reportError("const actual parameter not expected here", "", ast.position); - else if (!eType.equals(((ConstFormalParameter) fp).T)) - reporter.reportError("wrong type for const actual parameter", "", ast.E.position); + public Void visitConstActualParameter(ConstActualParameter ast, FormalParameter arg) { + var eType = ast.E.visit(this); + if (!(arg instanceof ConstFormalParameter)) { + reporter.reportError("const actual parameter not expected here", "", ast.getPosition()); + } else if (!eType.equals(((ConstFormalParameter) arg).T)) { + reporter.reportError("wrong type for const actual parameter", "", ast.E.getPosition()); + } return null; } @Override - public Object visitFuncActualParameter(FuncActualParameter ast, Object o) { - FormalParameter fp = (FormalParameter) o; - - Declaration binding = (Declaration) ast.I.visit(this); - if (binding == null) + public Void visitFuncActualParameter(FuncActualParameter ast, FormalParameter arg) { + var binding = ast.I.visit(this); + if (binding == null) { reportUndeclared(ast.I); - else if (!(binding instanceof FuncDeclaration || binding instanceof FuncFormalParameter)) - reporter.reportError("\"%\" is not a function identifier", ast.I.spelling, ast.I.position); - else if (!(fp instanceof FuncFormalParameter)) - reporter.reportError("func actual parameter not expected here", "", ast.position); - else { + } else if (!(binding instanceof FuncDeclaration || binding instanceof FuncFormalParameter)) { + reporter.reportError("\"%\" is not a function identifier", ast.I.spelling, ast.I.getPosition()); + } else if (!(arg instanceof FuncFormalParameter)) { + reporter.reportError("func actual parameter not expected here", "", ast.getPosition()); + } else { FormalParameterSequence FPS = null; TypeDenoter T = null; if (binding instanceof FuncDeclaration) { @@ -507,78 +556,76 @@ public final class Checker implements Visitor { FPS = ((FuncFormalParameter) binding).FPS; T = ((FuncFormalParameter) binding).T; } - if (!FPS.equals(((FuncFormalParameter) fp).FPS)) - reporter.reportError("wrong signature for function \"%\"", ast.I.spelling, ast.I.position); - else if (!T.equals(((FuncFormalParameter) fp).T)) - reporter.reportError("wrong type for function \"%\"", ast.I.spelling, ast.I.position); + if (!FPS.equals(((FuncFormalParameter) arg).FPS)) { + reporter.reportError("wrong signature for function \"%\"", ast.I.spelling, ast.I.getPosition()); + } else if (!T.equals(((FuncFormalParameter) arg).T)) { + reporter.reportError("wrong type for function \"%\"", ast.I.spelling, ast.I.getPosition()); + } } return null; } @Override - public Object visitProcActualParameter(ProcActualParameter ast, Object o) { - FormalParameter fp = (FormalParameter) o; - - Declaration binding = (Declaration) ast.I.visit(this); - if (binding == null) + public Void visitProcActualParameter(ProcActualParameter ast, FormalParameter arg) { + var binding = ast.I.visit(this); + if (binding == null) { reportUndeclared(ast.I); - else if (!(binding instanceof ProcDeclaration || binding instanceof ProcFormalParameter)) - reporter.reportError("\"%\" is not a procedure identifier", ast.I.spelling, ast.I.position); - else if (!(fp instanceof ProcFormalParameter)) - reporter.reportError("proc actual parameter not expected here", "", ast.position); - else { + } else if (!(binding instanceof ProcDeclaration || binding instanceof ProcFormalParameter)) { + reporter.reportError("\"%\" is not a procedure identifier", ast.I.spelling, ast.I.getPosition()); + } else if (!(arg instanceof ProcFormalParameter)) { + reporter.reportError("proc actual parameter not expected here", "", ast.getPosition()); + } else { FormalParameterSequence FPS = null; - if (binding instanceof ProcDeclaration) + if (binding instanceof ProcDeclaration) { FPS = ((ProcDeclaration) binding).FPS; - else + } else { FPS = ((ProcFormalParameter) binding).FPS; - if (!FPS.equals(((ProcFormalParameter) fp).FPS)) - reporter.reportError("wrong signature for procedure \"%\"", ast.I.spelling, ast.I.position); + } + if (!FPS.equals(((ProcFormalParameter) arg).FPS)) { + reporter.reportError("wrong signature for procedure \"%\"", ast.I.spelling, ast.I.getPosition()); + } } return null; } @Override - public Object visitVarActualParameter(VarActualParameter ast, Object o) { - FormalParameter fp = (FormalParameter) o; - - TypeDenoter vType = (TypeDenoter) ast.V.visit(this); - if (!ast.V.variable) - reporter.reportError("actual parameter is not a variable", "", ast.V.position); - else if (!(fp instanceof VarFormalParameter)) - reporter.reportError("var actual parameter not expected here", "", ast.V.position); - else if (!vType.equals(((VarFormalParameter) fp).T)) - reporter.reportError("wrong type for var actual parameter", "", ast.V.position); + public Void visitVarActualParameter(VarActualParameter ast, FormalParameter arg) { + var vType = ast.V.visit(this); + if (!ast.V.variable) { + reporter.reportError("actual parameter is not a variable", "", ast.V.getPosition()); + } else if (!(arg instanceof VarFormalParameter)) { + reporter.reportError("var actual parameter not expected here", "", ast.V.getPosition()); + } else if (!vType.equals(((VarFormalParameter) arg).T)) { + reporter.reportError("wrong type for var actual parameter", "", ast.V.getPosition()); + } return null; } @Override - public Object visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, Object o) { - FormalParameterSequence fps = (FormalParameterSequence) o; - if (!(fps instanceof EmptyFormalParameterSequence)) - reporter.reportError("too few actual parameters", "", ast.position); + public Void visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, FormalParameterSequence arg) { + if (!(arg instanceof EmptyFormalParameterSequence)) { + reporter.reportError("too few actual parameters", "", ast.getPosition()); + } return null; } @Override - public Object visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, Object o) { - FormalParameterSequence fps = (FormalParameterSequence) o; - if (!(fps instanceof MultipleFormalParameterSequence)) - reporter.reportError("too many actual parameters", "", ast.position); - else { - ast.AP.visit(this, ((MultipleFormalParameterSequence) fps).FP); - ast.APS.visit(this, ((MultipleFormalParameterSequence) fps).FPS); + public Void visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, FormalParameterSequence arg) { + if (!(arg instanceof MultipleFormalParameterSequence)) { + reporter.reportError("too many actual parameters", "", ast.getPosition()); + } else { + ast.AP.visit(this, ((MultipleFormalParameterSequence) arg).FP); + ast.APS.visit(this, ((MultipleFormalParameterSequence) arg).FPS); } return null; } @Override - public Object visitSingleActualParameterSequence(SingleActualParameterSequence ast, Object o) { - FormalParameterSequence fps = (FormalParameterSequence) o; - if (!(fps instanceof SingleFormalParameterSequence)) - reporter.reportError("incorrect number of actual parameters", "", ast.position); - else { - ast.AP.visit(this, ((SingleFormalParameterSequence) fps).FP); + public Void visitSingleActualParameterSequence(SingleActualParameterSequence ast, FormalParameterSequence arg) { + if (!(arg instanceof SingleFormalParameterSequence)) { + reporter.reportError("incorrect number of actual parameters", "", ast.getPosition()); + } else { + ast.AP.visit(this, ((SingleFormalParameterSequence) arg).FP); } return null; } @@ -589,94 +636,97 @@ public final class Checker implements Visitor { // use the given object. @Override - public Object visitAnyTypeDenoter(AnyTypeDenoter ast, Object o) { + public TypeDenoter visitAnyTypeDenoter(AnyTypeDenoter ast, Void arg) { return StdEnvironment.anyType; } @Override - public Object visitArrayTypeDenoter(ArrayTypeDenoter ast, Object o) { - ast.T = (TypeDenoter) ast.T.visit(this); - if ((Integer.valueOf(ast.IL.spelling).intValue()) == 0) - reporter.reportError("arrays must not be empty", "", ast.IL.position); + public TypeDenoter visitArrayTypeDenoter(ArrayTypeDenoter ast, Void arg) { + ast.T = ast.T.visit(this); + if ((Integer.valueOf(ast.IL.spelling)) == 0) { + reporter.reportError("arrays must not be empty", "", ast.IL.getPosition()); + } return ast; } @Override - public Object visitBoolTypeDenoter(BoolTypeDenoter ast, Object o) { + public TypeDenoter visitBoolTypeDenoter(BoolTypeDenoter ast, Void arg) { return StdEnvironment.booleanType; } @Override - public Object visitCharTypeDenoter(CharTypeDenoter ast, Object o) { + public TypeDenoter visitCharTypeDenoter(CharTypeDenoter ast, Void arg) { return StdEnvironment.charType; } @Override - public Object visitErrorTypeDenoter(ErrorTypeDenoter ast, Object o) { + public TypeDenoter visitErrorTypeDenoter(ErrorTypeDenoter ast, Void arg) { return StdEnvironment.errorType; } @Override - public Object visitSimpleTypeDenoter(SimpleTypeDenoter ast, Object o) { - Declaration binding = (Declaration) ast.I.visit(this); + public TypeDenoter visitSimpleTypeDenoter(SimpleTypeDenoter ast, Void arg) { + var binding = ast.I.visit(this); if (binding == null) { reportUndeclared(ast.I); return StdEnvironment.errorType; } else if (!(binding instanceof TypeDeclaration)) { - reporter.reportError("\"%\" is not a type identifier", ast.I.spelling, ast.I.position); + reporter.reportError("\"%\" is not a type identifier", ast.I.spelling, ast.I.getPosition()); return StdEnvironment.errorType; } return ((TypeDeclaration) binding).T; } @Override - public Object visitIntTypeDenoter(IntTypeDenoter ast, Object o) { + public TypeDenoter visitIntTypeDenoter(IntTypeDenoter ast, Void arg) { return StdEnvironment.integerType; } @Override - public Object visitRecordTypeDenoter(RecordTypeDenoter ast, Object o) { + public TypeDenoter visitRecordTypeDenoter(RecordTypeDenoter ast, Void arg) { ast.FT = (FieldTypeDenoter) ast.FT.visit(this); return ast; } @Override - public Object visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Object o) { - ast.T = (TypeDenoter) ast.T.visit(this); + public TypeDenoter visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Void arg) { + ast.T = ast.T.visit(this); ast.FT.visit(this); return ast; } @Override - public Object visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, Object o) { - ast.T = (TypeDenoter) ast.T.visit(this); + public TypeDenoter visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, Void arg) { + ast.T = ast.T.visit(this); return ast; } // Literals, Identifiers and Operators @Override - public Object visitCharacterLiteral(CharacterLiteral CL, Object o) { + public TypeDenoter visitCharacterLiteral(CharacterLiteral CL, Void arg) { return StdEnvironment.charType; } @Override - public Object visitIdentifier(Identifier I, Object o) { - Declaration binding = idTable.retrieve(I.spelling); - if (binding != null) + public Declaration visitIdentifier(Identifier I, Void arg) { + var binding = idTable.retrieve(I.spelling); + if (binding != null) { I.decl = binding; + } return binding; } @Override - public Object visitIntegerLiteral(IntegerLiteral IL, Object o) { + public TypeDenoter visitIntegerLiteral(IntegerLiteral IL, Void arg) { return StdEnvironment.integerType; } @Override - public Object visitOperator(Operator O, Object o) { - Declaration binding = idTable.retrieve(O.spelling); - if (binding != null) + public Declaration visitOperator(Operator O, Void arg) { + var binding = idTable.retrieve(O.spelling); + if (binding != null) { O.decl = binding; + } return binding; } @@ -702,28 +752,29 @@ public final class Checker implements Visitor { // given object. @Override - public Object visitDotVname(DotVname ast, Object o) { + public TypeDenoter visitDotVname(DotVname ast, Void arg) { ast.type = null; - TypeDenoter vType = (TypeDenoter) ast.V.visit(this); + var vType = ast.V.visit(this); ast.variable = ast.V.variable; - if (!(vType instanceof RecordTypeDenoter)) - reporter.reportError("record expected here", "", ast.V.position); - else { + if (!(vType instanceof RecordTypeDenoter)) { + reporter.reportError("record expected here", "", ast.V.getPosition()); + } else { ast.type = checkFieldIdentifier(((RecordTypeDenoter) vType).FT, ast.I); - if (ast.type == StdEnvironment.errorType) - reporter.reportError("no field \"%\" in this record type", ast.I.spelling, ast.I.position); + if (ast.type == StdEnvironment.errorType) { + reporter.reportError("no field \"%\" in this record type", ast.I.spelling, ast.I.getPosition()); + } } return ast.type; } @Override - public Object visitSimpleVname(SimpleVname ast, Object o) { + public TypeDenoter visitSimpleVname(SimpleVname ast, Void arg) { ast.variable = false; ast.type = StdEnvironment.errorType; - Declaration binding = (Declaration) ast.I.visit(this); - if (binding == null) + var binding = ast.I.visit(this); + if (binding == null) { reportUndeclared(ast.I); - else if (binding instanceof ConstDeclaration) { + } else if (binding instanceof ConstDeclaration) { ast.type = ((ConstDeclaration) binding).E.type; ast.variable = false; } else if (binding instanceof VarDeclaration) { @@ -735,22 +786,24 @@ public final class Checker implements Visitor { } else if (binding instanceof VarFormalParameter) { ast.type = ((VarFormalParameter) binding).T; ast.variable = true; - } else - reporter.reportError("\"%\" is not a const or var identifier", ast.I.spelling, ast.I.position); + } else { + reporter.reportError("\"%\" is not a const or var identifier", ast.I.spelling, ast.I.getPosition()); + } return ast.type; } @Override - public Object visitSubscriptVname(SubscriptVname ast, Object o) { - TypeDenoter vType = (TypeDenoter) ast.V.visit(this); + public TypeDenoter visitSubscriptVname(SubscriptVname ast, Void arg) { + var vType = ast.V.visit(this); ast.variable = ast.V.variable; - TypeDenoter eType = (TypeDenoter) ast.E.visit(this); + var eType = ast.E.visit(this); if (vType != StdEnvironment.errorType) { - if (!(vType instanceof ArrayTypeDenoter)) - reporter.reportError("array expected here", "", ast.V.position); - else { - if (!eType.equals(StdEnvironment.integerType)) - reporter.reportError("Integer expression expected here", "", ast.E.position); + if (!(vType instanceof ArrayTypeDenoter)) { + reporter.reportError("array expected here", "", ast.V.getPosition()); + } else { + if (!eType.equals(StdEnvironment.integerType)) { + reporter.reportError("Integer expression expected here", "", ast.E.getPosition()); + } ast.type = ((ArrayTypeDenoter) vType).T; } } @@ -760,7 +813,7 @@ public final class Checker implements Visitor { // Programs @Override - public Object visitProgram(Program ast, Object o) { + public Void visitProgram(Program ast, Void arg) { ast.C.visit(this); return null; } @@ -794,12 +847,12 @@ public final class Checker implements Visitor { // has not been declared. private void reportUndeclared(Terminal leaf) { - reporter.reportError("\"%\" is not declared", leaf.spelling, leaf.position); + reporter.reportError("\"%\" is not declared", leaf.spelling, leaf.getPosition()); } private static TypeDenoter checkFieldIdentifier(FieldTypeDenoter ast, Identifier I) { if (ast instanceof MultipleFieldTypeDenoter) { - MultipleFieldTypeDenoter ft = (MultipleFieldTypeDenoter) ast; + var ft = (MultipleFieldTypeDenoter) ast; if (ft.I.spelling.compareTo(I.spelling) == 0) { I.decl = ast; return ft.T; @@ -807,7 +860,7 @@ public final class Checker implements Visitor { return checkFieldIdentifier(ft.FT, I); } } else if (ast instanceof SingleFieldTypeDenoter) { - SingleFieldTypeDenoter ft = (SingleFieldTypeDenoter) ast; + var ft = (SingleFieldTypeDenoter) ast; if (ft.I.spelling.compareTo(I.spelling) == 0) { I.decl = ast; return ft.T; @@ -821,9 +874,7 @@ public final class Checker implements Visitor { private TypeDeclaration declareStdType(String id, TypeDenoter typedenoter) { - TypeDeclaration binding; - - binding = new TypeDeclaration(new Identifier(id, dummyPos), typedenoter, dummyPos); + var binding = new TypeDeclaration(new Identifier(id, dummyPos), typedenoter, dummyPos); idTable.enter(id, binding); return binding; } @@ -833,13 +884,10 @@ public final class Checker implements Visitor { private ConstDeclaration declareStdConst(String id, TypeDenoter constType) { - IntegerExpression constExpr; - ConstDeclaration binding; - // constExpr used only as a placeholder for constType - constExpr = new IntegerExpression(null, dummyPos); + var constExpr = new IntegerExpression(null, dummyPos); constExpr.type = constType; - binding = new ConstDeclaration(new Identifier(id, dummyPos), constExpr, dummyPos); + var binding = new ConstDeclaration(new Identifier(id, dummyPos), constExpr, dummyPos); idTable.enter(id, binding); return binding; } @@ -849,9 +897,7 @@ public final class Checker implements Visitor { private ProcDeclaration declareStdProc(String id, FormalParameterSequence fps) { - ProcDeclaration binding; - - binding = new ProcDeclaration(new Identifier(id, dummyPos), fps, new EmptyCommand(dummyPos), dummyPos); + var binding = new ProcDeclaration(new Identifier(id, dummyPos), fps, new EmptyCommand(dummyPos), dummyPos); idTable.enter(id, binding); return binding; } @@ -861,9 +907,7 @@ public final class Checker implements Visitor { private FuncDeclaration declareStdFunc(String id, FormalParameterSequence fps, TypeDenoter resultType) { - FuncDeclaration binding; - - binding = new FuncDeclaration(new Identifier(id, dummyPos), fps, resultType, new EmptyExpression(dummyPos), + var binding = new FuncDeclaration(new Identifier(id, dummyPos), fps, resultType, new EmptyExpression(dummyPos), dummyPos); idTable.enter(id, binding); return binding; @@ -875,9 +919,7 @@ public final class Checker implements Visitor { private UnaryOperatorDeclaration declareStdUnaryOp(String op, TypeDenoter argType, TypeDenoter resultType) { - UnaryOperatorDeclaration binding; - - binding = new UnaryOperatorDeclaration(new Operator(op, dummyPos), argType, resultType, dummyPos); + var binding = new UnaryOperatorDeclaration(new Operator(op, dummyPos), argType, resultType, dummyPos); idTable.enter(op, binding); return binding; } @@ -889,9 +931,8 @@ public final class Checker implements Visitor { private BinaryOperatorDeclaration declareStdBinaryOp(String op, TypeDenoter arg1Type, TypeDenoter arg2type, TypeDenoter resultType) { - BinaryOperatorDeclaration binding; - - binding = new BinaryOperatorDeclaration(new Operator(op, dummyPos), arg1Type, arg2type, resultType, dummyPos); + var binding = new BinaryOperatorDeclaration(new Operator(op, dummyPos), arg1Type, arg2type, resultType, + dummyPos); idTable.enter(op, binding); return binding; } diff --git a/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/IdEntry.java b/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/IdEntry.java index fc71b09..e9400f8 100644 --- a/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/IdEntry.java +++ b/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/IdEntry.java @@ -14,7 +14,7 @@ package Triangle.ContextualAnalyzer; -import Triangle.AbstractSyntaxTrees.Declaration; +import Triangle.AbstractSyntaxTrees.Declarations.Declaration; public class IdEntry { diff --git a/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/IdentificationTable.java b/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/IdentificationTable.java index 52853e7..28e8ed9 100644 --- a/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/IdentificationTable.java +++ b/Triangle.Compiler/src/main/java/Triangle/ContextualAnalyzer/IdentificationTable.java @@ -14,7 +14,7 @@ package Triangle.ContextualAnalyzer; -import Triangle.AbstractSyntaxTrees.Declaration; +import Triangle.AbstractSyntaxTrees.Declarations.Declaration; public final class IdentificationTable { @@ -30,7 +30,6 @@ public final class IdentificationTable { // current topmost level. public void openScope() { - level++; } @@ -38,15 +37,12 @@ public final class IdentificationTable { // all entries belonging to that level. public void closeScope() { - - IdEntry entry, local; - // Presumably, idTable.level > 0. - entry = this.latest; + var entry = this.latest; while (entry.level == this.level) { - local = entry; - entry = local.previous; + entry = entry.previous; } + this.level--; this.latest = entry; } @@ -57,25 +53,8 @@ public final class IdentificationTable { // same identifier at the current level. public void enter(String id, Declaration attr) { - - IdEntry entry = this.latest; - boolean present = false, searching = true; - - // Check for duplicate entry ... - while (searching) { - if (entry == null || entry.level < this.level) - searching = false; - else if (entry.id.equals(id)) { - present = true; - searching = false; - } else - entry = entry.previous; - } - - attr.duplicated = present; - // Add new entry ... - entry = new IdEntry(id, attr, this.level, this.latest); - this.latest = entry; + attr.duplicated = retrieve(id) != null; + this.latest = new IdEntry(id, attr, this.level, this.latest); } // Finds an entry for the given identifier in the identification table, @@ -85,24 +64,18 @@ public final class IdentificationTable { // otherwise returns the attribute field of the entry found. public Declaration retrieve(String id) { - - IdEntry entry; - Declaration attr = null; - boolean present = false, searching = true; - - entry = this.latest; - while (searching) { - if (entry == null) - searching = false; - else if (entry.id.equals(id)) { - present = true; - searching = false; - attr = entry.attr; - } else + var entry = this.latest; + while (true) { + if (entry == null) { + break; + } else if (entry.id.equals(id)) { + return entry.attr; + } else { entry = entry.previous; + } } - return attr; + return null; } } diff --git a/Triangle.Compiler/src/main/java/Triangle/StdEnvironment.java b/Triangle.Compiler/src/main/java/Triangle/StdEnvironment.java index c2e4182..b4e009b 100644 --- a/Triangle.Compiler/src/main/java/Triangle/StdEnvironment.java +++ b/Triangle.Compiler/src/main/java/Triangle/StdEnvironment.java @@ -14,13 +14,13 @@ package Triangle; -import Triangle.AbstractSyntaxTrees.BinaryOperatorDeclaration; -import Triangle.AbstractSyntaxTrees.ConstDeclaration; -import Triangle.AbstractSyntaxTrees.FuncDeclaration; -import Triangle.AbstractSyntaxTrees.ProcDeclaration; -import Triangle.AbstractSyntaxTrees.TypeDeclaration; -import Triangle.AbstractSyntaxTrees.TypeDenoter; -import Triangle.AbstractSyntaxTrees.UnaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.BinaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.ConstDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.FuncDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.ProcDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.UnaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.Types.TypeDeclaration; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; public final class StdEnvironment { diff --git a/Triangle.Compiler/src/main/java/Triangle/SyntacticAnalyzer/Parser.java b/Triangle.Compiler/src/main/java/Triangle/SyntacticAnalyzer/Parser.java index ba82d1c..ec57077 100644 --- a/Triangle.Compiler/src/main/java/Triangle/SyntacticAnalyzer/Parser.java +++ b/Triangle.Compiler/src/main/java/Triangle/SyntacticAnalyzer/Parser.java @@ -15,72 +15,72 @@ package Triangle.SyntacticAnalyzer; import Triangle.ErrorReporter; -import Triangle.AbstractSyntaxTrees.ActualParameter; -import Triangle.AbstractSyntaxTrees.ActualParameterSequence; -import Triangle.AbstractSyntaxTrees.ArrayAggregate; -import Triangle.AbstractSyntaxTrees.ArrayExpression; -import Triangle.AbstractSyntaxTrees.ArrayTypeDenoter; -import Triangle.AbstractSyntaxTrees.AssignCommand; -import Triangle.AbstractSyntaxTrees.BinaryExpression; -import Triangle.AbstractSyntaxTrees.CallCommand; -import Triangle.AbstractSyntaxTrees.CallExpression; -import Triangle.AbstractSyntaxTrees.CharacterExpression; -import Triangle.AbstractSyntaxTrees.CharacterLiteral; -import Triangle.AbstractSyntaxTrees.Command; -import Triangle.AbstractSyntaxTrees.ConstActualParameter; -import Triangle.AbstractSyntaxTrees.ConstDeclaration; -import Triangle.AbstractSyntaxTrees.ConstFormalParameter; -import Triangle.AbstractSyntaxTrees.Declaration; -import Triangle.AbstractSyntaxTrees.DotVname; -import Triangle.AbstractSyntaxTrees.EmptyActualParameterSequence; -import Triangle.AbstractSyntaxTrees.EmptyCommand; -import Triangle.AbstractSyntaxTrees.EmptyFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.Expression; -import Triangle.AbstractSyntaxTrees.FieldTypeDenoter; -import Triangle.AbstractSyntaxTrees.FormalParameter; -import Triangle.AbstractSyntaxTrees.FormalParameterSequence; -import Triangle.AbstractSyntaxTrees.FuncActualParameter; -import Triangle.AbstractSyntaxTrees.FuncDeclaration; -import Triangle.AbstractSyntaxTrees.FuncFormalParameter; -import Triangle.AbstractSyntaxTrees.Identifier; -import Triangle.AbstractSyntaxTrees.IfCommand; -import Triangle.AbstractSyntaxTrees.IfExpression; -import Triangle.AbstractSyntaxTrees.IntegerExpression; -import Triangle.AbstractSyntaxTrees.IntegerLiteral; -import Triangle.AbstractSyntaxTrees.LetCommand; -import Triangle.AbstractSyntaxTrees.LetExpression; -import Triangle.AbstractSyntaxTrees.MultipleActualParameterSequence; -import Triangle.AbstractSyntaxTrees.MultipleArrayAggregate; -import Triangle.AbstractSyntaxTrees.MultipleFieldTypeDenoter; -import Triangle.AbstractSyntaxTrees.MultipleFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.MultipleRecordAggregate; -import Triangle.AbstractSyntaxTrees.Operator; -import Triangle.AbstractSyntaxTrees.ProcActualParameter; -import Triangle.AbstractSyntaxTrees.ProcDeclaration; -import Triangle.AbstractSyntaxTrees.ProcFormalParameter; import Triangle.AbstractSyntaxTrees.Program; -import Triangle.AbstractSyntaxTrees.RecordAggregate; -import Triangle.AbstractSyntaxTrees.RecordExpression; -import Triangle.AbstractSyntaxTrees.RecordTypeDenoter; -import Triangle.AbstractSyntaxTrees.SequentialCommand; -import Triangle.AbstractSyntaxTrees.SequentialDeclaration; -import Triangle.AbstractSyntaxTrees.SimpleTypeDenoter; -import Triangle.AbstractSyntaxTrees.SimpleVname; -import Triangle.AbstractSyntaxTrees.SingleActualParameterSequence; -import Triangle.AbstractSyntaxTrees.SingleArrayAggregate; -import Triangle.AbstractSyntaxTrees.SingleFieldTypeDenoter; -import Triangle.AbstractSyntaxTrees.SingleFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.SingleRecordAggregate; -import Triangle.AbstractSyntaxTrees.SubscriptVname; -import Triangle.AbstractSyntaxTrees.TypeDeclaration; -import Triangle.AbstractSyntaxTrees.TypeDenoter; -import Triangle.AbstractSyntaxTrees.UnaryExpression; -import Triangle.AbstractSyntaxTrees.VarActualParameter; -import Triangle.AbstractSyntaxTrees.VarDeclaration; -import Triangle.AbstractSyntaxTrees.VarFormalParameter; -import Triangle.AbstractSyntaxTrees.Vname; -import Triangle.AbstractSyntaxTrees.VnameExpression; -import Triangle.AbstractSyntaxTrees.WhileCommand; +import Triangle.AbstractSyntaxTrees.Actuals.ActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.ActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.ConstActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.EmptyActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.FuncActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.MultipleActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.ProcActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.SingleActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.VarActualParameter; +import Triangle.AbstractSyntaxTrees.Aggregates.ArrayAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.MultipleArrayAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.MultipleRecordAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.RecordAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.SingleArrayAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.SingleRecordAggregate; +import Triangle.AbstractSyntaxTrees.Commands.AssignCommand; +import Triangle.AbstractSyntaxTrees.Commands.CallCommand; +import Triangle.AbstractSyntaxTrees.Commands.Command; +import Triangle.AbstractSyntaxTrees.Commands.EmptyCommand; +import Triangle.AbstractSyntaxTrees.Commands.IfCommand; +import Triangle.AbstractSyntaxTrees.Commands.LetCommand; +import Triangle.AbstractSyntaxTrees.Commands.SequentialCommand; +import Triangle.AbstractSyntaxTrees.Commands.WhileCommand; +import Triangle.AbstractSyntaxTrees.Declarations.ConstDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.Declaration; +import Triangle.AbstractSyntaxTrees.Declarations.FuncDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.ProcDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.SequentialDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.VarDeclaration; +import Triangle.AbstractSyntaxTrees.Expressions.ArrayExpression; +import Triangle.AbstractSyntaxTrees.Expressions.BinaryExpression; +import Triangle.AbstractSyntaxTrees.Expressions.CallExpression; +import Triangle.AbstractSyntaxTrees.Expressions.CharacterExpression; +import Triangle.AbstractSyntaxTrees.Expressions.Expression; +import Triangle.AbstractSyntaxTrees.Expressions.IfExpression; +import Triangle.AbstractSyntaxTrees.Expressions.IntegerExpression; +import Triangle.AbstractSyntaxTrees.Expressions.LetExpression; +import Triangle.AbstractSyntaxTrees.Expressions.RecordExpression; +import Triangle.AbstractSyntaxTrees.Expressions.UnaryExpression; +import Triangle.AbstractSyntaxTrees.Expressions.VnameExpression; +import Triangle.AbstractSyntaxTrees.Formals.ConstFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.EmptyFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.FormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.FormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.FuncFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.MultipleFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.ProcFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.SingleFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.VarFormalParameter; +import Triangle.AbstractSyntaxTrees.Terminals.CharacterLiteral; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral; +import Triangle.AbstractSyntaxTrees.Terminals.Operator; +import Triangle.AbstractSyntaxTrees.Types.ArrayTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.FieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.MultipleFieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.RecordTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.SimpleTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.SingleFieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.TypeDeclaration; +import Triangle.AbstractSyntaxTrees.Types.TypeDenoter; +import Triangle.AbstractSyntaxTrees.Vnames.DotVname; +import Triangle.AbstractSyntaxTrees.Vnames.SimpleVname; +import Triangle.AbstractSyntaxTrees.Vnames.SubscriptVname; +import Triangle.AbstractSyntaxTrees.Vnames.Vname; public class Parser { @@ -543,7 +543,7 @@ public class Parser { Vname parseRestOfVname(Identifier identifierAST) throws SyntaxError { SourcePosition vnamePos = new SourcePosition(); - vnamePos = identifierAST.position; + vnamePos = identifierAST.getPosition(); Vname vAST = new SimpleVname(identifierAST, vnamePos); while (currentToken.kind == Token.DOT || currentToken.kind == Token.LBRACKET) { diff --git a/Triangle.Compiler/src/main/java/Triangle/TreeDrawer/LayoutVisitor.java b/Triangle.Compiler/src/main/java/Triangle/TreeDrawer/LayoutVisitor.java index 158733a..4f7487e 100644 --- a/Triangle.Compiler/src/main/java/Triangle/TreeDrawer/LayoutVisitor.java +++ b/Triangle.Compiler/src/main/java/Triangle/TreeDrawer/LayoutVisitor.java @@ -16,72 +16,91 @@ package Triangle.TreeDrawer; import java.awt.FontMetrics; -import Triangle.AbstractSyntaxTrees.AST; -import Triangle.AbstractSyntaxTrees.AnyTypeDenoter; -import Triangle.AbstractSyntaxTrees.ArrayExpression; -import Triangle.AbstractSyntaxTrees.ArrayTypeDenoter; -import Triangle.AbstractSyntaxTrees.AssignCommand; -import Triangle.AbstractSyntaxTrees.BinaryExpression; -import Triangle.AbstractSyntaxTrees.BinaryOperatorDeclaration; -import Triangle.AbstractSyntaxTrees.BoolTypeDenoter; -import Triangle.AbstractSyntaxTrees.CallCommand; -import Triangle.AbstractSyntaxTrees.CallExpression; -import Triangle.AbstractSyntaxTrees.CharTypeDenoter; -import Triangle.AbstractSyntaxTrees.CharacterExpression; -import Triangle.AbstractSyntaxTrees.CharacterLiteral; -import Triangle.AbstractSyntaxTrees.ConstActualParameter; -import Triangle.AbstractSyntaxTrees.ConstDeclaration; -import Triangle.AbstractSyntaxTrees.ConstFormalParameter; -import Triangle.AbstractSyntaxTrees.DotVname; -import Triangle.AbstractSyntaxTrees.EmptyActualParameterSequence; -import Triangle.AbstractSyntaxTrees.EmptyCommand; -import Triangle.AbstractSyntaxTrees.EmptyExpression; -import Triangle.AbstractSyntaxTrees.EmptyFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.ErrorTypeDenoter; -import Triangle.AbstractSyntaxTrees.FuncActualParameter; -import Triangle.AbstractSyntaxTrees.FuncDeclaration; -import Triangle.AbstractSyntaxTrees.FuncFormalParameter; -import Triangle.AbstractSyntaxTrees.Identifier; -import Triangle.AbstractSyntaxTrees.IfCommand; -import Triangle.AbstractSyntaxTrees.IfExpression; -import Triangle.AbstractSyntaxTrees.IntTypeDenoter; -import Triangle.AbstractSyntaxTrees.IntegerExpression; -import Triangle.AbstractSyntaxTrees.IntegerLiteral; -import Triangle.AbstractSyntaxTrees.LetCommand; -import Triangle.AbstractSyntaxTrees.LetExpression; -import Triangle.AbstractSyntaxTrees.MultipleActualParameterSequence; -import Triangle.AbstractSyntaxTrees.MultipleArrayAggregate; -import Triangle.AbstractSyntaxTrees.MultipleFieldTypeDenoter; -import Triangle.AbstractSyntaxTrees.MultipleFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.MultipleRecordAggregate; -import Triangle.AbstractSyntaxTrees.Operator; -import Triangle.AbstractSyntaxTrees.ProcActualParameter; -import Triangle.AbstractSyntaxTrees.ProcDeclaration; -import Triangle.AbstractSyntaxTrees.ProcFormalParameter; import Triangle.AbstractSyntaxTrees.Program; -import Triangle.AbstractSyntaxTrees.RecordExpression; -import Triangle.AbstractSyntaxTrees.RecordTypeDenoter; -import Triangle.AbstractSyntaxTrees.SequentialCommand; -import Triangle.AbstractSyntaxTrees.SequentialDeclaration; -import Triangle.AbstractSyntaxTrees.SimpleTypeDenoter; -import Triangle.AbstractSyntaxTrees.SimpleVname; -import Triangle.AbstractSyntaxTrees.SingleActualParameterSequence; -import Triangle.AbstractSyntaxTrees.SingleArrayAggregate; -import Triangle.AbstractSyntaxTrees.SingleFieldTypeDenoter; -import Triangle.AbstractSyntaxTrees.SingleFormalParameterSequence; -import Triangle.AbstractSyntaxTrees.SingleRecordAggregate; -import Triangle.AbstractSyntaxTrees.SubscriptVname; -import Triangle.AbstractSyntaxTrees.TypeDeclaration; -import Triangle.AbstractSyntaxTrees.UnaryExpression; -import Triangle.AbstractSyntaxTrees.UnaryOperatorDeclaration; -import Triangle.AbstractSyntaxTrees.VarActualParameter; -import Triangle.AbstractSyntaxTrees.VarDeclaration; -import Triangle.AbstractSyntaxTrees.VarFormalParameter; -import Triangle.AbstractSyntaxTrees.Visitor; -import Triangle.AbstractSyntaxTrees.VnameExpression; -import Triangle.AbstractSyntaxTrees.WhileCommand; - -public class LayoutVisitor implements Visitor { +import Triangle.AbstractSyntaxTrees.Actuals.ConstActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.EmptyActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.FuncActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.MultipleActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.ProcActualParameter; +import Triangle.AbstractSyntaxTrees.Actuals.SingleActualParameterSequence; +import Triangle.AbstractSyntaxTrees.Actuals.VarActualParameter; +import Triangle.AbstractSyntaxTrees.Aggregates.MultipleArrayAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.MultipleRecordAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.SingleArrayAggregate; +import Triangle.AbstractSyntaxTrees.Aggregates.SingleRecordAggregate; +import Triangle.AbstractSyntaxTrees.Commands.AssignCommand; +import Triangle.AbstractSyntaxTrees.Commands.CallCommand; +import Triangle.AbstractSyntaxTrees.Commands.EmptyCommand; +import Triangle.AbstractSyntaxTrees.Commands.IfCommand; +import Triangle.AbstractSyntaxTrees.Commands.LetCommand; +import Triangle.AbstractSyntaxTrees.Commands.SequentialCommand; +import Triangle.AbstractSyntaxTrees.Commands.WhileCommand; +import Triangle.AbstractSyntaxTrees.Declarations.BinaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.ConstDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.FuncDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.ProcDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.SequentialDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.UnaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.Declarations.VarDeclaration; +import Triangle.AbstractSyntaxTrees.Expressions.ArrayExpression; +import Triangle.AbstractSyntaxTrees.Expressions.BinaryExpression; +import Triangle.AbstractSyntaxTrees.Expressions.CallExpression; +import Triangle.AbstractSyntaxTrees.Expressions.CharacterExpression; +import Triangle.AbstractSyntaxTrees.Expressions.EmptyExpression; +import Triangle.AbstractSyntaxTrees.Expressions.IfExpression; +import Triangle.AbstractSyntaxTrees.Expressions.IntegerExpression; +import Triangle.AbstractSyntaxTrees.Expressions.LetExpression; +import Triangle.AbstractSyntaxTrees.Expressions.RecordExpression; +import Triangle.AbstractSyntaxTrees.Expressions.UnaryExpression; +import Triangle.AbstractSyntaxTrees.Expressions.VnameExpression; +import Triangle.AbstractSyntaxTrees.Formals.ConstFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.EmptyFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.FuncFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.MultipleFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.ProcFormalParameter; +import Triangle.AbstractSyntaxTrees.Formals.SingleFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.Formals.VarFormalParameter; +import Triangle.AbstractSyntaxTrees.Terminals.CharacterLiteral; +import Triangle.AbstractSyntaxTrees.Terminals.Identifier; +import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral; +import Triangle.AbstractSyntaxTrees.Terminals.Operator; +import Triangle.AbstractSyntaxTrees.Types.AnyTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.ArrayTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.BoolTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.CharTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.ErrorTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.IntTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.MultipleFieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.RecordTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.SimpleTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.SingleFieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.Types.TypeDeclaration; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.IdentifierVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.LiteralVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.OperatorVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.ProgramVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.RecordAggregateVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor; +import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor; +import Triangle.AbstractSyntaxTrees.Vnames.DotVname; +import Triangle.AbstractSyntaxTrees.Vnames.SimpleVname; +import Triangle.AbstractSyntaxTrees.Vnames.SubscriptVname; + +public class LayoutVisitor implements ActualParameterVisitor, + ActualParameterSequenceVisitor, ArrayAggregateVisitor, + CommandVisitor, DeclarationVisitor, ExpressionVisitor, + FormalParameterVisitor, FormalParameterSequenceVisitor, + IdentifierVisitor, LiteralVisitor, OperatorVisitor, + ProgramVisitor, RecordAggregateVisitor, + TypeDenoterVisitor, VnameVisitor { private final int BORDER = 5; private final int PARENT_SEP = 30; @@ -94,333 +113,427 @@ public class LayoutVisitor implements Visitor { // Commands @Override - public Object visitAssignCommand(AssignCommand ast, Object obj) { - return layoutBinary("AssignCom.", ast.V, ast.E); + public DrawingTree visitAssignCommand(AssignCommand ast, Void obj) { + var d1 = ast.V.visit(this); + var d2 = ast.E.visit(this); + return layoutBinary("AssignCom.", d1, d2); } @Override - public Object visitCallCommand(CallCommand ast, Object obj) { - return layoutBinary("CallCom.", ast.I, ast.APS); + public DrawingTree visitCallCommand(CallCommand ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.APS.visit(this); + return layoutBinary("CallCom.", d1, d2); } @Override - public Object visitEmptyCommand(EmptyCommand ast, Object obj) { + public DrawingTree visitEmptyCommand(EmptyCommand ast, Void obj) { return layoutNullary("EmptyCom."); } @Override - public Object visitIfCommand(IfCommand ast, Object obj) { - return layoutTernary("IfCom.", ast.E, ast.C1, ast.C2); + public DrawingTree visitIfCommand(IfCommand ast, Void obj) { + var d1 = ast.E.visit(this); + var d2 = ast.C1.visit(this); + var d3 = ast.C2.visit(this); + return layoutTernary("IfCom.", d1, d2, d3); } @Override - public Object visitLetCommand(LetCommand ast, Object obj) { - return layoutBinary("LetCom.", ast.D, ast.C); + public DrawingTree visitLetCommand(LetCommand ast, Void obj) { + var d1 = ast.D.visit(this); + var d2 = ast.C.visit(this); + return layoutBinary("LetCom.", d1, d2); } @Override - public Object visitSequentialCommand(SequentialCommand ast, Object obj) { - return layoutBinary("Seq.Com.", ast.C1, ast.C2); + public DrawingTree visitSequentialCommand(SequentialCommand ast, Void obj) { + var d1 = ast.C1.visit(this); + var d2 = ast.C2.visit(this); + return layoutBinary("Seq.Com.", d1, d2); } @Override - public Object visitWhileCommand(WhileCommand ast, Object obj) { - return layoutBinary("WhileCom.", ast.E, ast.C); + public DrawingTree visitWhileCommand(WhileCommand ast, Void obj) { + var d1 = ast.E.visit(this); + var d2 = ast.C.visit(this); + return layoutBinary("WhileCom.", d1, d2); } // Expressions @Override - public Object visitArrayExpression(ArrayExpression ast, Object obj) { - return layoutUnary("ArrayExpr.", ast.AA); + public DrawingTree visitArrayExpression(ArrayExpression ast, Void obj) { + var d1 = ast.AA.visit(this); + return layoutUnary("ArrayExpr.", d1); } @Override - public Object visitBinaryExpression(BinaryExpression ast, Object obj) { - return layoutTernary("Bin.Expr.", ast.E1, ast.O, ast.E2); + public DrawingTree visitBinaryExpression(BinaryExpression ast, Void obj) { + var d1 = ast.E1.visit(this); + var d2 = ast.O.visit(this); + var d3 = ast.E2.visit(this); + return layoutTernary("Bin.Expr.", d1, d2, d3); } @Override - public Object visitCallExpression(CallExpression ast, Object obj) { - return layoutBinary("CallExpr.", ast.I, ast.APS); + public DrawingTree visitCallExpression(CallExpression ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.APS.visit(this); + return layoutBinary("CallExpr.", d1, d2); } @Override - public Object visitCharacterExpression(CharacterExpression ast, Object obj) { - return layoutUnary("Char.Expr.", ast.CL); + public DrawingTree visitCharacterExpression(CharacterExpression ast, Void obj) { + var d1 = ast.CL.visit(this); + return layoutUnary("Char.Expr.", d1); } @Override - public Object visitEmptyExpression(EmptyExpression ast, Object obj) { + public DrawingTree visitEmptyExpression(EmptyExpression ast, Void obj) { return layoutNullary("EmptyExpr."); } @Override - public Object visitIfExpression(IfExpression ast, Object obj) { - return layoutTernary("IfExpr.", ast.E1, ast.E2, ast.E3); + public DrawingTree visitIfExpression(IfExpression ast, Void obj) { + var d1 = ast.E1.visit(this); + var d2 = ast.E2.visit(this); + var d3 = ast.E3.visit(this); + return layoutTernary("IfExpr.", d1, d2, d3); } @Override - public Object visitIntegerExpression(IntegerExpression ast, Object obj) { - return layoutUnary("Int.Expr.", ast.IL); + public DrawingTree visitIntegerExpression(IntegerExpression ast, Void obj) { + var d1 = ast.IL.visit(this); + return layoutUnary("Int.Expr.", d1); } @Override - public Object visitLetExpression(LetExpression ast, Object obj) { - return layoutBinary("LetExpr.", ast.D, ast.E); + public DrawingTree visitLetExpression(LetExpression ast, Void obj) { + var d1 = ast.D.visit(this); + var d2 = ast.E.visit(this); + return layoutBinary("LetExpr.", d1, d2); } @Override - public Object visitRecordExpression(RecordExpression ast, Object obj) { - return layoutUnary("Rec.Expr.", ast.RA); + public DrawingTree visitRecordExpression(RecordExpression ast, Void obj) { + var d1 = ast.RA.visit(this); + return layoutUnary("Rec.Expr.", d1); } @Override - public Object visitUnaryExpression(UnaryExpression ast, Object obj) { - return layoutBinary("UnaryExpr.", ast.O, ast.E); + public DrawingTree visitUnaryExpression(UnaryExpression ast, Void obj) { + var d1 = ast.O.visit(this); + var d2 = ast.E.visit(this); + return layoutBinary("UnaryExpr.", d1, d2); } @Override - public Object visitVnameExpression(VnameExpression ast, Object obj) { - return layoutUnary("VnameExpr.", ast.V); + public DrawingTree visitVnameExpression(VnameExpression ast, Void obj) { + var d1 = ast.V.visit(this); + return layoutUnary("VnameExpr.", d1); } // Declarations @Override - public Object visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, Object obj) { - return layoutQuaternary("Bin.Op.Decl.", ast.O, ast.ARG1, ast.ARG2, ast.RES); + public DrawingTree visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, Void obj) { + var d1 = ast.O.visit(this); + var d2 = ast.ARG1.visit(this); + var d3 = ast.ARG2.visit(this); + var d4 = ast.RES.visit(this); + return layoutQuaternary("Bin.Op.Decl.", d1, d2, d3, d4); } @Override - public Object visitConstDeclaration(ConstDeclaration ast, Object obj) { - return layoutBinary("ConstDecl.", ast.I, ast.E); + public DrawingTree visitConstDeclaration(ConstDeclaration ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.E.visit(this); + return layoutBinary("ConstDecl.", d1, d2); } @Override - public Object visitFuncDeclaration(FuncDeclaration ast, Object obj) { - return layoutQuaternary("FuncDecl.", ast.I, ast.FPS, ast.T, ast.E); + public DrawingTree visitFuncDeclaration(FuncDeclaration ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.FPS.visit(this); + var d3 = ast.T.visit(this); + var d4 = ast.E.visit(this); + return layoutQuaternary("FuncDecl.", d1, d2, d3, d4); } @Override - public Object visitProcDeclaration(ProcDeclaration ast, Object obj) { - return layoutTernary("ProcDecl.", ast.I, ast.FPS, ast.C); + public DrawingTree visitProcDeclaration(ProcDeclaration ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.FPS.visit(this); + var d3 = ast.C.visit(this); + return layoutTernary("ProcDecl.", d1, d2, d3); } @Override - public Object visitSequentialDeclaration(SequentialDeclaration ast, Object obj) { - return layoutBinary("Seq.Decl.", ast.D1, ast.D2); + public DrawingTree visitSequentialDeclaration(SequentialDeclaration ast, Void obj) { + var d1 = ast.D1.visit(this); + var d2 = ast.D2.visit(this); + return layoutBinary("Seq.Decl.", d1, d2); } @Override - public Object visitTypeDeclaration(TypeDeclaration ast, Object obj) { - return layoutBinary("TypeDecl.", ast.I, ast.T); + public DrawingTree visitTypeDeclaration(TypeDeclaration ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.T.visit(this); + return layoutBinary("TypeDecl.", d1, d2); } @Override - public Object visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Object obj) { - return layoutTernary("UnaryOp.Decl.", ast.O, ast.ARG, ast.RES); + public DrawingTree visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Void obj) { + var d1 = ast.O.visit(this); + var d2 = ast.ARG.visit(this); + var d3 = ast.RES.visit(this); + return layoutTernary("UnaryOp.Decl.", d1, d2, d3); } @Override - public Object visitVarDeclaration(VarDeclaration ast, Object obj) { - return layoutBinary("VarDecl.", ast.I, ast.T); + public DrawingTree visitVarDeclaration(VarDeclaration ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.T.visit(this); + return layoutBinary("VarDecl.", d1, d2); } // Array Aggregates @Override - public Object visitMultipleArrayAggregate(MultipleArrayAggregate ast, Object obj) { - return layoutBinary("Mult.ArrayAgg.", ast.E, ast.AA); + public DrawingTree visitMultipleArrayAggregate(MultipleArrayAggregate ast, Void obj) { + var d1 = ast.E.visit(this); + var d2 = ast.AA.visit(this); + return layoutBinary("Mult.ArrayAgg.", d1, d2); } @Override - public Object visitSingleArrayAggregate(SingleArrayAggregate ast, Object obj) { - return layoutUnary("Sing.ArrayAgg.", ast.E); + public DrawingTree visitSingleArrayAggregate(SingleArrayAggregate ast, Void obj) { + var d1 = ast.E.visit(this); + return layoutUnary("Sing.ArrayAgg.", d1); } // Record Aggregates @Override - public Object visitMultipleRecordAggregate(MultipleRecordAggregate ast, Object obj) { - return layoutTernary("Mult.Rec.Agg.", ast.I, ast.E, ast.RA); + public DrawingTree visitMultipleRecordAggregate(MultipleRecordAggregate ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.E.visit(this); + var d3 = ast.RA.visit(this); + return layoutTernary("Mult.Rec.Agg.", d1, d2, d3); } @Override - public Object visitSingleRecordAggregate(SingleRecordAggregate ast, Object obj) { - return layoutBinary("Sing.Rec.Agg.", ast.I, ast.E); + public DrawingTree visitSingleRecordAggregate(SingleRecordAggregate ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.E.visit(this); + return layoutBinary("Sing.Rec.Agg.", d1, d2); } // Formal Parameters @Override - public Object visitConstFormalParameter(ConstFormalParameter ast, Object obj) { - return layoutBinary("ConstF.P.", ast.I, ast.T); + public DrawingTree visitConstFormalParameter(ConstFormalParameter ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.T.visit(this); + return layoutBinary("ConstF.P.", d1, d2); } @Override - public Object visitFuncFormalParameter(FuncFormalParameter ast, Object obj) { - return layoutTernary("FuncF.P.", ast.I, ast.FPS, ast.T); + public DrawingTree visitFuncFormalParameter(FuncFormalParameter ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.FPS.visit(this); + var d3 = ast.T.visit(this); + return layoutTernary("FuncF.P.", d1, d2, d3); } @Override - public Object visitProcFormalParameter(ProcFormalParameter ast, Object obj) { - return layoutBinary("ProcF.P.", ast.I, ast.FPS); + public DrawingTree visitProcFormalParameter(ProcFormalParameter ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.FPS.visit(this); + return layoutBinary("ProcF.P.", d1, d2); } @Override - public Object visitVarFormalParameter(VarFormalParameter ast, Object obj) { - return layoutBinary("VarF.P.", ast.I, ast.T); + public DrawingTree visitVarFormalParameter(VarFormalParameter ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.T.visit(this); + return layoutBinary("VarF.P.", d1, d2); } @Override - public Object visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Object obj) { + public DrawingTree visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Void obj) { return layoutNullary("EmptyF.P.S."); } @Override - public Object visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Object obj) { - return layoutBinary("Mult.F.P.S.", ast.FP, ast.FPS); + public DrawingTree visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Void obj) { + var d1 = ast.FP.visit(this); + var d2 = ast.FPS.visit(this); + return layoutBinary("Mult.F.P.S.", d1, d2); } @Override - public Object visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Object obj) { - return layoutUnary("Sing.F.P.S.", ast.FP); + public DrawingTree visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Void obj) { + var d1 = ast.FP.visit(this); + return layoutUnary("Sing.F.P.S.", d1); } // Actual Parameters @Override - public Object visitConstActualParameter(ConstActualParameter ast, Object obj) { - return layoutUnary("ConstA.P.", ast.E); + public DrawingTree visitConstActualParameter(ConstActualParameter ast, Void obj) { + var d1 = ast.E.visit(this); + return layoutUnary("ConstA.P.", d1); } @Override - public Object visitFuncActualParameter(FuncActualParameter ast, Object obj) { - return layoutUnary("FuncA.P.", ast.I); + public DrawingTree visitFuncActualParameter(FuncActualParameter ast, Void obj) { + var d1 = ast.I.visit(this); + return layoutUnary("FuncA.P.", d1); } @Override - public Object visitProcActualParameter(ProcActualParameter ast, Object obj) { - return layoutUnary("ProcA.P.", ast.I); + public DrawingTree visitProcActualParameter(ProcActualParameter ast, Void obj) { + var d1 = ast.I.visit(this); + return layoutUnary("ProcA.P.", d1); } @Override - public Object visitVarActualParameter(VarActualParameter ast, Object obj) { - return layoutUnary("VarA.P.", ast.V); + public DrawingTree visitVarActualParameter(VarActualParameter ast, Void obj) { + var d1 = ast.V.visit(this); + return layoutUnary("VarA.P.", d1); } @Override - public Object visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, Object obj) { + public DrawingTree visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, Void obj) { return layoutNullary("EmptyA.P.S."); } @Override - public Object visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, Object obj) { - return layoutBinary("Mult.A.P.S.", ast.AP, ast.APS); + public DrawingTree visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, Void obj) { + var d1 = ast.AP.visit(this); + var d2 = ast.APS.visit(this); + return layoutBinary("Mult.A.P.S.", d1, d2); } @Override - public Object visitSingleActualParameterSequence(SingleActualParameterSequence ast, Object obj) { - return layoutUnary("Sing.A.P.S.", ast.AP); + public DrawingTree visitSingleActualParameterSequence(SingleActualParameterSequence ast, Void obj) { + var d1 = ast.AP.visit(this); + return layoutUnary("Sing.A.P.S.", d1); } // Type Denoters @Override - public Object visitAnyTypeDenoter(AnyTypeDenoter ast, Object obj) { + public DrawingTree visitAnyTypeDenoter(AnyTypeDenoter ast, Void obj) { return layoutNullary("any"); } @Override - public Object visitArrayTypeDenoter(ArrayTypeDenoter ast, Object obj) { - return layoutBinary("ArrayTypeD.", ast.IL, ast.T); + public DrawingTree visitArrayTypeDenoter(ArrayTypeDenoter ast, Void obj) { + var d1 = ast.IL.visit(this); + var d2 = ast.T.visit(this); + return layoutBinary("ArrayTypeD.", d1, d2); } @Override - public Object visitBoolTypeDenoter(BoolTypeDenoter ast, Object obj) { + public DrawingTree visitBoolTypeDenoter(BoolTypeDenoter ast, Void obj) { return layoutNullary("bool"); } @Override - public Object visitCharTypeDenoter(CharTypeDenoter ast, Object obj) { + public DrawingTree visitCharTypeDenoter(CharTypeDenoter ast, Void obj) { return layoutNullary("char"); } @Override - public Object visitErrorTypeDenoter(ErrorTypeDenoter ast, Object obj) { + public DrawingTree visitErrorTypeDenoter(ErrorTypeDenoter ast, Void obj) { return layoutNullary("error"); } @Override - public Object visitSimpleTypeDenoter(SimpleTypeDenoter ast, Object obj) { - return layoutUnary("Sim.TypeD.", ast.I); + public DrawingTree visitSimpleTypeDenoter(SimpleTypeDenoter ast, Void obj) { + var d1 = ast.I.visit(this); + return layoutUnary("Sim.TypeD.", d1); } @Override - public Object visitIntTypeDenoter(IntTypeDenoter ast, Object obj) { + public DrawingTree visitIntTypeDenoter(IntTypeDenoter ast, Void obj) { return layoutNullary("int"); } @Override - public Object visitRecordTypeDenoter(RecordTypeDenoter ast, Object obj) { - return layoutUnary("Rec.TypeD.", ast.FT); + public DrawingTree visitRecordTypeDenoter(RecordTypeDenoter ast, Void obj) { + var d1 = ast.FT.visit(this); + return layoutUnary("Rec.TypeD.", d1); } @Override - public Object visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Object obj) { - return layoutTernary("Mult.F.TypeD.", ast.I, ast.T, ast.FT); + public DrawingTree visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.T.visit(this); + var d3 = ast.FT.visit(this); + return layoutTernary("Mult.F.TypeD.", d1, d2, d3); } @Override - public Object visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, Object obj) { - return layoutBinary("Sing.F.TypeD.", ast.I, ast.T); + public DrawingTree visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.T.visit(this); + return layoutBinary("Sing.F.TypeD.", d1, d2); } // Literals, Identifiers and Operators @Override - public Object visitCharacterLiteral(CharacterLiteral ast, Object obj) { + public DrawingTree visitCharacterLiteral(CharacterLiteral ast, Void obj) { return layoutNullary(ast.spelling); } @Override - public Object visitIdentifier(Identifier ast, Object obj) { + public DrawingTree visitIdentifier(Identifier ast, Void obj) { return layoutNullary(ast.spelling); } @Override - public Object visitIntegerLiteral(IntegerLiteral ast, Object obj) { + public DrawingTree visitIntegerLiteral(IntegerLiteral ast, Void obj) { return layoutNullary(ast.spelling); } @Override - public Object visitOperator(Operator ast, Object obj) { + public DrawingTree visitOperator(Operator ast, Void obj) { return layoutNullary(ast.spelling); } // Value-or-variable names @Override - public Object visitDotVname(DotVname ast, Object obj) { - return layoutBinary("DotVname", ast.I, ast.V); + public DrawingTree visitDotVname(DotVname ast, Void obj) { + var d1 = ast.I.visit(this); + var d2 = ast.V.visit(this); + return layoutBinary("DotVname", d1, d2); } @Override - public Object visitSimpleVname(SimpleVname ast, Object obj) { - return layoutUnary("Sim.Vname", ast.I); + public DrawingTree visitSimpleVname(SimpleVname ast, Void obj) { + var d1 = ast.I.visit(this); + return layoutUnary("Sim.Vname", d1); } @Override - public Object visitSubscriptVname(SubscriptVname ast, Object obj) { - return layoutBinary("Sub.Vname", ast.V, ast.E); + public DrawingTree visitSubscriptVname(SubscriptVname ast, Void obj) { + var d1 = ast.V.visit(this); + var d2 = ast.E.visit(this); + return layoutBinary("Sub.Vname", d1, d2); } // Programs @Override - public Object visitProgram(Program ast, Object obj) { - return layoutUnary("Program", ast.C); + public DrawingTree visitProgram(Program ast, Void obj) { + var d1 = ast.C.visit(this); + return layoutUnary("Program", d1); } private DrawingTree layoutCaption(String name) { - int w = fontMetrics.stringWidth(name) + 4; - int h = fontMetrics.getHeight() + 4; + var w = fontMetrics.stringWidth(name) + 4; + var h = fontMetrics.getHeight() + 4; return new DrawingTree(name, w, h); } private DrawingTree layoutNullary(String name) { - DrawingTree dt = layoutCaption(name); + var dt = layoutCaption(name); dt.contour.upper_tail = new Polyline(0, dt.height + 2 * BORDER, null); dt.contour.upper_head = dt.contour.upper_tail; dt.contour.lower_tail = new Polyline(-dt.width - 2 * BORDER, 0, null); @@ -428,48 +541,38 @@ public class LayoutVisitor implements Visitor { return dt; } - private DrawingTree layoutUnary(String name, AST child1) { - DrawingTree dt = layoutCaption(name); - DrawingTree d1 = (DrawingTree) child1.visit(this, null); + private DrawingTree layoutUnary(String name, DrawingTree d1) { + var dt = layoutCaption(name); dt.setChildren(new DrawingTree[] { d1 }); attachParent(dt, join(dt)); return dt; } - private DrawingTree layoutBinary(String name, AST child1, AST child2) { - DrawingTree dt = layoutCaption(name); - DrawingTree d1 = (DrawingTree) child1.visit(this, null); - DrawingTree d2 = (DrawingTree) child2.visit(this, null); + private DrawingTree layoutBinary(String name, DrawingTree d1, DrawingTree d2) { + var dt = layoutCaption(name); dt.setChildren(new DrawingTree[] { d1, d2 }); attachParent(dt, join(dt)); return dt; } - private DrawingTree layoutTernary(String name, AST child1, AST child2, AST child3) { - DrawingTree dt = layoutCaption(name); - DrawingTree d1 = (DrawingTree) child1.visit(this, null); - DrawingTree d2 = (DrawingTree) child2.visit(this, null); - DrawingTree d3 = (DrawingTree) child3.visit(this, null); + private DrawingTree layoutTernary(String name, DrawingTree d1, DrawingTree d2, DrawingTree d3) { + var dt = layoutCaption(name); dt.setChildren(new DrawingTree[] { d1, d2, d3 }); attachParent(dt, join(dt)); return dt; } - private DrawingTree layoutQuaternary(String name, AST child1, AST child2, AST child3, AST child4) { - DrawingTree dt = layoutCaption(name); - DrawingTree d1 = (DrawingTree) child1.visit(this, null); - DrawingTree d2 = (DrawingTree) child2.visit(this, null); - DrawingTree d3 = (DrawingTree) child3.visit(this, null); - DrawingTree d4 = (DrawingTree) child4.visit(this, null); + private DrawingTree layoutQuaternary(String name, DrawingTree d1, DrawingTree d2, DrawingTree d3, DrawingTree d4) { + var dt = layoutCaption(name); dt.setChildren(new DrawingTree[] { d1, d2, d3, d4 }); attachParent(dt, join(dt)); return dt; } private void attachParent(DrawingTree dt, int w) { - int y = PARENT_SEP; - int x2 = (w - dt.width) / 2 - BORDER; - int x1 = x2 + dt.width + 2 * BORDER - w; + var y = PARENT_SEP; + var x2 = (w - dt.width) / 2 - BORDER; + var x1 = x2 + dt.width + 2 * BORDER - w; dt.children[0].offset.y = y + dt.height; dt.children[0].offset.x = x1; @@ -478,13 +581,13 @@ public class LayoutVisitor implements Visitor { } private int join(DrawingTree dt) { - int w, sum; dt.contour = dt.children[0].contour; - sum = w = dt.children[0].width + 2 * BORDER; + var sum = dt.children[0].width + 2 * BORDER; + var w = sum; - for (int i = 1; i < dt.children.length; i++) { - int d = merge(dt.contour, dt.children[i].contour); + for (var i = 1; i < dt.children.length; i++) { + var d = merge(dt.contour, dt.children[i].contour); dt.children[i].offset.x = d + w; dt.children[i].offset.y = 0; w = dt.children[i].width + 2 * BORDER; @@ -494,15 +597,12 @@ public class LayoutVisitor implements Visitor { } private int merge(Polygon c1, Polygon c2) { - int x, y, total, d; - Polyline lower, upper, b; - - x = y = total = 0; - upper = c1.lower_head; - lower = c2.upper_head; + int x = 0, y = 0, total = 0; + var upper = c1.lower_head; + var lower = c2.upper_head; while (lower != null && upper != null) { - d = offset(x, y, lower.dx, lower.dy, upper.dx, upper.dy); + var d = offset(x, y, lower.dx, lower.dy, upper.dx, upper.dy); x += d; total += d; @@ -518,11 +618,11 @@ public class LayoutVisitor implements Visitor { } if (lower != null) { - b = bridge(c1.upper_tail, 0, 0, lower, x, y); + var b = bridge(c1.upper_tail, 0, 0, lower, x, y); c1.upper_tail = (b.link != null) ? c2.upper_tail : b; c1.lower_tail = c2.lower_tail; } else { - b = bridge(c2.lower_tail, x, y, upper, 0, 0); + var b = bridge(c2.lower_tail, x, y, upper, 0, 0); if (b.link == null) { c1.lower_tail = b; } @@ -534,53 +634,45 @@ public class LayoutVisitor implements Visitor { } private int offset(int p1, int p2, int a1, int a2, int b1, int b2) { - int d, s, t; if (b2 <= p2 || p2 + a2 <= 0) { return 0; } - t = b2 * a1 - a2 * b1; + var t = b2 * a1 - a2 * b1; if (t > 0) { if (p2 < 0) { - s = p2 * a1; - d = s / a2 - p1; + var s = p2 * a1; + return Math.max(0, s / a2 - p1); } else if (p2 > 0) { - s = p2 * b1; - d = s / b2 - p1; + var s = p2 * b1; + return Math.max(0, s / b2 - p1); } else { - d = -p1; + return Math.max(0, -p1); } } else if (b2 < p2 + a2) { - s = (b2 - p2) * a1; - d = b1 - (p1 + s / a2); + var s = (b2 - p2) * a1; + return Math.max(0, b1 - (p1 + s / a2)); } else if (b2 > p2 + a2) { - s = (a2 + p2) * b1; - d = s / b2 - (p1 + a1); + var s = (a2 + p2) * b1; + return Math.max(0, s / b2 - (p1 + a1)); } else { - d = b1 - (p1 + a1); - } - - if (d > 0) { - return d; - } else { - return 0; + return Math.max(0, b1 - (p1 + a1)); } } private Polyline bridge(Polyline line1, int x1, int y1, Polyline line2, int x2, int y2) { - int dy, dx, s; - Polyline r; - dy = y2 + line2.dy - y1; + int dx; + var dy = y2 + line2.dy - y1; if (line2.dy == 0) { dx = line2.dx; } else { - s = dy * line2.dx; + var s = dy * line2.dx; dx = s / line2.dy; } - r = new Polyline(dx, dy, line2.link); + var r = new Polyline(dx, dy, line2.link); line1.link = new Polyline(x2 + line2.dx - dx - x1, 0, r); return r;