Switch to generic visitor pattern.
This commit is contained in:
parent
1db90b20a8
commit
55f6b2d105
@ -50,62 +50,18 @@ public class Disassembler {
|
|||||||
* @param r the number of the register.
|
* @param r the number of the register.
|
||||||
* @param rightbracket the character to print after 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);
|
System.out.print(leftbracket);
|
||||||
switch (r) {
|
System.out.print(r.toString());
|
||||||
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(rightbracket);
|
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.
|
* Writes a void n-field of an instruction.
|
||||||
*/
|
*/
|
||||||
@ -142,89 +98,90 @@ public class Disassembler {
|
|||||||
* @param d the displacment of the primitive routine.
|
* @param d the displacment of the primitive routine.
|
||||||
*/
|
*/
|
||||||
private static void writePrimitive(int d) {
|
private static void writePrimitive(int d) {
|
||||||
switch (d) {
|
var primitive = Primitive.values()[d];
|
||||||
case Machine.idDisplacement:
|
switch (primitive) {
|
||||||
|
case ID:
|
||||||
System.out.print("id ");
|
System.out.print("id ");
|
||||||
break;
|
break;
|
||||||
case Machine.notDisplacement:
|
case NOT:
|
||||||
System.out.print("not ");
|
System.out.print("not ");
|
||||||
break;
|
break;
|
||||||
case Machine.andDisplacement:
|
case AND:
|
||||||
System.out.print("and ");
|
System.out.print("and ");
|
||||||
break;
|
break;
|
||||||
case Machine.orDisplacement:
|
case OR:
|
||||||
System.out.print("or ");
|
System.out.print("or ");
|
||||||
break;
|
break;
|
||||||
case Machine.succDisplacement:
|
case SUCC:
|
||||||
System.out.print("succ ");
|
System.out.print("succ ");
|
||||||
break;
|
break;
|
||||||
case Machine.predDisplacement:
|
case PRED:
|
||||||
System.out.print("pred ");
|
System.out.print("pred ");
|
||||||
break;
|
break;
|
||||||
case Machine.negDisplacement:
|
case NEG:
|
||||||
System.out.print("neg ");
|
System.out.print("neg ");
|
||||||
break;
|
break;
|
||||||
case Machine.addDisplacement:
|
case ADD:
|
||||||
System.out.print("add ");
|
System.out.print("add ");
|
||||||
break;
|
break;
|
||||||
case Machine.subDisplacement:
|
case SUB:
|
||||||
System.out.print("sub ");
|
System.out.print("sub ");
|
||||||
break;
|
break;
|
||||||
case Machine.multDisplacement:
|
case MULT:
|
||||||
System.out.print("mult ");
|
System.out.print("mult ");
|
||||||
break;
|
break;
|
||||||
case Machine.divDisplacement:
|
case DIV:
|
||||||
System.out.print("div ");
|
System.out.print("div ");
|
||||||
break;
|
break;
|
||||||
case Machine.modDisplacement:
|
case MOD:
|
||||||
System.out.print("mod ");
|
System.out.print("mod ");
|
||||||
break;
|
break;
|
||||||
case Machine.ltDisplacement:
|
case LT:
|
||||||
System.out.print("lt ");
|
System.out.print("lt ");
|
||||||
break;
|
break;
|
||||||
case Machine.leDisplacement:
|
case LE:
|
||||||
System.out.print("le ");
|
System.out.print("le ");
|
||||||
break;
|
break;
|
||||||
case Machine.geDisplacement:
|
case GE:
|
||||||
System.out.print("ge ");
|
System.out.print("ge ");
|
||||||
break;
|
break;
|
||||||
case Machine.gtDisplacement:
|
case GT:
|
||||||
System.out.print("gt ");
|
System.out.print("gt ");
|
||||||
break;
|
break;
|
||||||
case Machine.eqDisplacement:
|
case EQ:
|
||||||
System.out.print("eq ");
|
System.out.print("eq ");
|
||||||
break;
|
break;
|
||||||
case Machine.neDisplacement:
|
case NE:
|
||||||
System.out.print("ne ");
|
System.out.print("ne ");
|
||||||
break;
|
break;
|
||||||
case Machine.eolDisplacement:
|
case EOL:
|
||||||
System.out.print("eol ");
|
System.out.print("eol ");
|
||||||
break;
|
break;
|
||||||
case Machine.eofDisplacement:
|
case EOF:
|
||||||
System.out.print("eof ");
|
System.out.print("eof ");
|
||||||
break;
|
break;
|
||||||
case Machine.getDisplacement:
|
case GET:
|
||||||
System.out.print("get ");
|
System.out.print("get ");
|
||||||
break;
|
break;
|
||||||
case Machine.putDisplacement:
|
case PUT:
|
||||||
System.out.print("put ");
|
System.out.print("put ");
|
||||||
break;
|
break;
|
||||||
case Machine.geteolDisplacement:
|
case GETEOL:
|
||||||
System.out.print("geteol ");
|
System.out.print("geteol ");
|
||||||
break;
|
break;
|
||||||
case Machine.puteolDisplacement:
|
case PUTEOL:
|
||||||
System.out.print("puteol ");
|
System.out.print("puteol ");
|
||||||
break;
|
break;
|
||||||
case Machine.getintDisplacement:
|
case GETINT:
|
||||||
System.out.print("getint ");
|
System.out.print("getint ");
|
||||||
break;
|
break;
|
||||||
case Machine.putintDisplacement:
|
case PUTINT:
|
||||||
System.out.print("putint ");
|
System.out.print("putint ");
|
||||||
break;
|
break;
|
||||||
case Machine.newDisplacement:
|
case NEW:
|
||||||
System.out.print("new ");
|
System.out.print("new ");
|
||||||
break;
|
break;
|
||||||
case Machine.disposeDisplacement:
|
case DISPOSE:
|
||||||
System.out.print("dispose ");
|
System.out.print("dispose ");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -237,98 +194,98 @@ public class Disassembler {
|
|||||||
*/
|
*/
|
||||||
private static void writeInstruction(Instruction instr) {
|
private static void writeInstruction(Instruction instr) {
|
||||||
|
|
||||||
switch (instr.op) {
|
switch (instr.opCode) {
|
||||||
case Machine.LOADop:
|
case LOAD:
|
||||||
System.out.print("LOAD ");
|
System.out.print("LOAD ");
|
||||||
writeN(instr.n);
|
writeN(instr.length);
|
||||||
writeD(instr.d);
|
writeD(instr.operand);
|
||||||
writeR('[', instr.r, ']');
|
writeR('[', instr.register, ']');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.LOADAop:
|
case LOADA:
|
||||||
System.out.print("LOADA ");
|
System.out.print("LOADA ");
|
||||||
blankN();
|
blankN();
|
||||||
writeD(instr.d);
|
writeD(instr.operand);
|
||||||
writeR('[', instr.r, ']');
|
writeR('[', instr.register, ']');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.LOADIop:
|
case LOADI:
|
||||||
System.out.print("LOADI ");
|
System.out.print("LOADI ");
|
||||||
writeN(instr.n);
|
writeN(instr.length);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.LOADLop:
|
case LOADL:
|
||||||
System.out.print("LOADL ");
|
System.out.print("LOADL ");
|
||||||
blankN();
|
blankN();
|
||||||
writeD(instr.d);
|
writeD(instr.operand);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.STOREop:
|
case STORE:
|
||||||
System.out.print("STORE ");
|
System.out.print("STORE ");
|
||||||
writeN(instr.n);
|
writeN(instr.length);
|
||||||
writeD(instr.d);
|
writeD(instr.operand);
|
||||||
writeR('[', instr.r, ']');
|
writeR('[', instr.register, ']');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.STOREIop:
|
case STOREI:
|
||||||
System.out.print("STOREI");
|
System.out.print("STOREI");
|
||||||
writeN(instr.n);
|
writeN(instr.length);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.CALLop:
|
case CALL:
|
||||||
System.out.print("CALL ");
|
System.out.print("CALL ");
|
||||||
if (instr.r == Machine.PBr) {
|
if (instr.register == Register.PB) {
|
||||||
blankN();
|
blankN();
|
||||||
writePrimitive(instr.d);
|
writePrimitive(instr.operand);
|
||||||
} else {
|
} else {
|
||||||
writeR('(', instr.n, ')');
|
writeR('(', instr.length, ')');
|
||||||
System.out.print(" ");
|
System.out.print(" ");
|
||||||
writeD(instr.d);
|
writeD(instr.operand);
|
||||||
writeR('[', instr.r, ']');
|
writeR('[', instr.register, ']');
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.CALLIop:
|
case CALLI:
|
||||||
System.out.print("CALLI ");
|
System.out.print("CALLI ");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.RETURNop:
|
case RETURN:
|
||||||
System.out.print("RETURN");
|
System.out.print("RETURN");
|
||||||
writeN(instr.n);
|
writeN(instr.length);
|
||||||
writeD(instr.d);
|
writeD(instr.operand);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.PUSHop:
|
case PUSH:
|
||||||
System.out.print("PUSH ");
|
System.out.print("PUSH ");
|
||||||
blankN();
|
blankN();
|
||||||
writeD(instr.d);
|
writeD(instr.operand);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.POPop:
|
case POP:
|
||||||
System.out.print("POP ");
|
System.out.print("POP ");
|
||||||
writeN(instr.n);
|
writeN(instr.length);
|
||||||
writeD(instr.d);
|
writeD(instr.operand);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.JUMPop:
|
case JUMP:
|
||||||
System.out.print("JUMP ");
|
System.out.print("JUMP ");
|
||||||
blankN();
|
blankN();
|
||||||
writeD(instr.d);
|
writeD(instr.operand);
|
||||||
writeR('[', instr.r, ']');
|
writeR('[', instr.register, ']');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.JUMPIop:
|
case JUMPI:
|
||||||
System.out.print("JUMPI ");
|
System.out.print("JUMPI ");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.JUMPIFop:
|
case JUMPIF:
|
||||||
System.out.print("JUMPIF");
|
System.out.print("JUMPIF");
|
||||||
writeN(instr.n);
|
writeN(instr.length);
|
||||||
writeD(instr.d);
|
writeD(instr.operand);
|
||||||
writeR('[', instr.r, ']');
|
writeR('[', instr.register, ']');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Machine.HALTop:
|
case HALT:
|
||||||
System.out.print("HALT ");
|
System.out.print("HALT ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,41 +40,46 @@ public class Interpreter {
|
|||||||
static long accumulator;
|
static long accumulator;
|
||||||
|
|
||||||
static int content(int r) {
|
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,
|
// Returns the current content of register r,
|
||||||
// even if r is one of the pseudo-registers L1..L6.
|
// even if r is one of the pseudo-registers L1..L6.
|
||||||
|
|
||||||
switch (r) {
|
switch (r) {
|
||||||
case Machine.CBr:
|
case CB:
|
||||||
return CB;
|
return CB;
|
||||||
case Machine.CTr:
|
case CT:
|
||||||
return CT;
|
return CT;
|
||||||
case Machine.PBr:
|
case PB:
|
||||||
return Machine.PB;
|
return Machine.PB;
|
||||||
case Machine.PTr:
|
case PT:
|
||||||
return Machine.PT;
|
return Machine.PT;
|
||||||
case Machine.SBr:
|
case SB:
|
||||||
return SB;
|
return SB;
|
||||||
case Machine.STr:
|
case ST:
|
||||||
return ST;
|
return ST;
|
||||||
case Machine.HBr:
|
case HB:
|
||||||
return HB;
|
return HB;
|
||||||
case Machine.HTr:
|
case HT:
|
||||||
return HT;
|
return HT;
|
||||||
case Machine.LBr:
|
case LB:
|
||||||
return LB;
|
return LB;
|
||||||
case Machine.L1r:
|
case L1:
|
||||||
return data[LB];
|
return data[LB];
|
||||||
case Machine.L2r:
|
case L2:
|
||||||
return data[data[LB]];
|
return data[data[LB]];
|
||||||
case Machine.L3r:
|
case L3:
|
||||||
return data[data[data[LB]]];
|
return data[data[data[LB]]];
|
||||||
case Machine.L4r:
|
case L4:
|
||||||
return data[data[data[data[LB]]]];
|
return data[data[data[data[LB]]]];
|
||||||
case Machine.L5r:
|
case L5:
|
||||||
return data[data[data[data[data[LB]]]]];
|
return data[data[data[data[data[LB]]]]];
|
||||||
case Machine.L6r:
|
case L6:
|
||||||
return data[data[data[data[data[data[LB]]]]]];
|
return data[data[data[data[data[data[LB]]]]]];
|
||||||
case Machine.CPr:
|
case CP:
|
||||||
return CP;
|
return CP;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
@ -85,7 +90,6 @@ public class Interpreter {
|
|||||||
|
|
||||||
static void dump() {
|
static void dump() {
|
||||||
// Writes a summary of the machine state.
|
// Writes a summary of the machine state.
|
||||||
int addr, staticLink, dynamicLink, localRegNum;
|
|
||||||
|
|
||||||
System.out.println("");
|
System.out.println("");
|
||||||
System.out.println("State of data store and registers:");
|
System.out.println("State of data store and registers:");
|
||||||
@ -95,7 +99,7 @@ public class Interpreter {
|
|||||||
else {
|
else {
|
||||||
System.out.println(" HB-->");
|
System.out.println(" HB-->");
|
||||||
System.out.println(" |--------|");
|
System.out.println(" |--------|");
|
||||||
for (addr = HB - 1; addr >= HT; addr--) {
|
for (var addr = HB - 1; addr >= HT; addr--) {
|
||||||
System.out.print(addr + ":");
|
System.out.print(addr + ":");
|
||||||
if (addr == HT)
|
if (addr == HT)
|
||||||
System.out.print(" HT-->");
|
System.out.print(" HT-->");
|
||||||
@ -110,41 +114,43 @@ public class Interpreter {
|
|||||||
if (ST == SB)
|
if (ST == SB)
|
||||||
System.out.println(" |--------| (stack is empty)");
|
System.out.println(" |--------| (stack is empty)");
|
||||||
else {
|
else {
|
||||||
dynamicLink = LB;
|
var dynamicLink = LB;
|
||||||
staticLink = LB;
|
var staticLink = LB;
|
||||||
localRegNum = Machine.LBr;
|
var localRegNum = Register.LB;
|
||||||
System.out.println(" ST--> |////////|");
|
System.out.println(" ST--> |////////|");
|
||||||
System.out.println(" |--------|");
|
System.out.println(" |--------|");
|
||||||
for (addr = ST - 1; addr >= SB; addr--) {
|
for (var addr = ST - 1; addr >= SB; addr--) {
|
||||||
System.out.print(addr + ":");
|
System.out.print(addr + ":");
|
||||||
if (addr == SB)
|
if (addr == SB)
|
||||||
System.out.print(" SB-->");
|
System.out.print(" SB-->");
|
||||||
else if (addr == staticLink) {
|
else if (addr == staticLink) {
|
||||||
switch (localRegNum) {
|
switch (localRegNum) {
|
||||||
case Machine.LBr:
|
case LB:
|
||||||
System.out.print(" LB-->");
|
System.out.print(" LB-->");
|
||||||
break;
|
break;
|
||||||
case Machine.L1r:
|
case L1:
|
||||||
System.out.print(" L1-->");
|
System.out.print(" L1-->");
|
||||||
break;
|
break;
|
||||||
case Machine.L2r:
|
case L2:
|
||||||
System.out.print(" L2-->");
|
System.out.print(" L2-->");
|
||||||
break;
|
break;
|
||||||
case Machine.L3r:
|
case L3:
|
||||||
System.out.print(" L3-->");
|
System.out.print(" L3-->");
|
||||||
break;
|
break;
|
||||||
case Machine.L4r:
|
case L4:
|
||||||
System.out.print(" L4-->");
|
System.out.print(" L4-->");
|
||||||
break;
|
break;
|
||||||
case Machine.L5r:
|
case L5:
|
||||||
System.out.print(" L5-->");
|
System.out.print(" L5-->");
|
||||||
break;
|
break;
|
||||||
case Machine.L6r:
|
case L6:
|
||||||
System.out.print(" L6-->");
|
System.out.print(" L6-->");
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
staticLink = data[addr];
|
staticLink = data[addr];
|
||||||
localRegNum = localRegNum + 1;
|
localRegNum = Register.values()[localRegNum.ordinal() + 1];
|
||||||
} else
|
} else
|
||||||
System.out.print(" ");
|
System.out.print(" ");
|
||||||
if ((addr == dynamicLink) && (dynamicLink != SB))
|
if ((addr == dynamicLink) && (dynamicLink != SB))
|
||||||
@ -277,45 +283,46 @@ public class Interpreter {
|
|||||||
int addr, size;
|
int addr, size;
|
||||||
char ch;
|
char ch;
|
||||||
|
|
||||||
switch (primitiveDisplacement) {
|
var primitive = Primitive.values()[primitiveDisplacement];
|
||||||
case Machine.idDisplacement:
|
switch (primitive) {
|
||||||
|
case ID:
|
||||||
break; // nothing to be done
|
break; // nothing to be done
|
||||||
case Machine.notDisplacement:
|
case NOT:
|
||||||
data[ST - 1] = toInt(!isTrue(data[ST - 1]));
|
data[ST - 1] = toInt(!isTrue(data[ST - 1]));
|
||||||
break;
|
break;
|
||||||
case Machine.andDisplacement:
|
case AND:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
data[ST - 1] = toInt(isTrue(data[ST - 1]) & isTrue(data[ST]));
|
data[ST - 1] = toInt(isTrue(data[ST - 1]) & isTrue(data[ST]));
|
||||||
break;
|
break;
|
||||||
case Machine.orDisplacement:
|
case OR:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
data[ST - 1] = toInt(isTrue(data[ST - 1]) | isTrue(data[ST]));
|
data[ST - 1] = toInt(isTrue(data[ST - 1]) | isTrue(data[ST]));
|
||||||
break;
|
break;
|
||||||
case Machine.succDisplacement:
|
case SUCC:
|
||||||
data[ST - 1] = overflowChecked(data[ST - 1] + 1);
|
data[ST - 1] = overflowChecked(data[ST - 1] + 1);
|
||||||
break;
|
break;
|
||||||
case Machine.predDisplacement:
|
case PRED:
|
||||||
data[ST - 1] = overflowChecked(data[ST - 1] - 1);
|
data[ST - 1] = overflowChecked(data[ST - 1] - 1);
|
||||||
break;
|
break;
|
||||||
case Machine.negDisplacement:
|
case NEG:
|
||||||
data[ST - 1] = -data[ST - 1];
|
data[ST - 1] = -data[ST - 1];
|
||||||
break;
|
break;
|
||||||
case Machine.addDisplacement:
|
case ADD:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
accumulator = data[ST - 1];
|
accumulator = data[ST - 1];
|
||||||
data[ST - 1] = overflowChecked(accumulator + data[ST]);
|
data[ST - 1] = overflowChecked(accumulator + data[ST]);
|
||||||
break;
|
break;
|
||||||
case Machine.subDisplacement:
|
case SUB:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
accumulator = data[ST - 1];
|
accumulator = data[ST - 1];
|
||||||
data[ST - 1] = overflowChecked(accumulator - data[ST]);
|
data[ST - 1] = overflowChecked(accumulator - data[ST]);
|
||||||
break;
|
break;
|
||||||
case Machine.multDisplacement:
|
case MULT:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
accumulator = data[ST - 1];
|
accumulator = data[ST - 1];
|
||||||
data[ST - 1] = overflowChecked(accumulator * data[ST]);
|
data[ST - 1] = overflowChecked(accumulator * data[ST]);
|
||||||
break;
|
break;
|
||||||
case Machine.divDisplacement:
|
case DIV:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
accumulator = data[ST - 1];
|
accumulator = data[ST - 1];
|
||||||
if (data[ST] != 0)
|
if (data[ST] != 0)
|
||||||
@ -323,7 +330,7 @@ public class Interpreter {
|
|||||||
else
|
else
|
||||||
status = failedZeroDivide;
|
status = failedZeroDivide;
|
||||||
break;
|
break;
|
||||||
case Machine.modDisplacement:
|
case MOD:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
accumulator = data[ST - 1];
|
accumulator = data[ST - 1];
|
||||||
if (data[ST] != 0)
|
if (data[ST] != 0)
|
||||||
@ -331,41 +338,41 @@ public class Interpreter {
|
|||||||
else
|
else
|
||||||
status = failedZeroDivide;
|
status = failedZeroDivide;
|
||||||
break;
|
break;
|
||||||
case Machine.ltDisplacement:
|
case LT:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
data[ST - 1] = toInt(data[ST - 1] < data[ST]);
|
data[ST - 1] = toInt(data[ST - 1] < data[ST]);
|
||||||
break;
|
break;
|
||||||
case Machine.leDisplacement:
|
case LE:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
data[ST - 1] = toInt(data[ST - 1] <= data[ST]);
|
data[ST - 1] = toInt(data[ST - 1] <= data[ST]);
|
||||||
break;
|
break;
|
||||||
case Machine.geDisplacement:
|
case GE:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
data[ST - 1] = toInt(data[ST - 1] >= data[ST]);
|
data[ST - 1] = toInt(data[ST - 1] >= data[ST]);
|
||||||
break;
|
break;
|
||||||
case Machine.gtDisplacement:
|
case GT:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
data[ST - 1] = toInt(data[ST - 1] > data[ST]);
|
data[ST - 1] = toInt(data[ST - 1] > data[ST]);
|
||||||
break;
|
break;
|
||||||
case Machine.eqDisplacement:
|
case EQ:
|
||||||
size = data[ST - 1]; // size of each comparand
|
size = data[ST - 1]; // size of each comparand
|
||||||
ST = ST - 2 * size;
|
ST = ST - 2 * size;
|
||||||
data[ST - 1] = toInt(equal(size, ST - 1, ST - 1 + size));
|
data[ST - 1] = toInt(equal(size, ST - 1, ST - 1 + size));
|
||||||
break;
|
break;
|
||||||
case Machine.neDisplacement:
|
case NE:
|
||||||
size = data[ST - 1]; // size of each comparand
|
size = data[ST - 1]; // size of each comparand
|
||||||
ST = ST - 2 * size;
|
ST = ST - 2 * size;
|
||||||
data[ST - 1] = toInt(!equal(size, ST - 1, ST - 1 + size));
|
data[ST - 1] = toInt(!equal(size, ST - 1, ST - 1 + size));
|
||||||
break;
|
break;
|
||||||
case Machine.eolDisplacement:
|
case EOL:
|
||||||
data[ST] = toInt(currentChar == '\n');
|
data[ST] = toInt(currentChar == '\n');
|
||||||
ST = ST + 1;
|
ST = ST + 1;
|
||||||
break;
|
break;
|
||||||
case Machine.eofDisplacement:
|
case EOF:
|
||||||
data[ST] = toInt(currentChar == -1);
|
data[ST] = toInt(currentChar == -1);
|
||||||
ST = ST + 1;
|
ST = ST + 1;
|
||||||
break;
|
break;
|
||||||
case Machine.getDisplacement:
|
case GET:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
addr = data[ST];
|
addr = data[ST];
|
||||||
try {
|
try {
|
||||||
@ -375,12 +382,12 @@ public class Interpreter {
|
|||||||
}
|
}
|
||||||
data[addr] = currentChar;
|
data[addr] = currentChar;
|
||||||
break;
|
break;
|
||||||
case Machine.putDisplacement:
|
case PUT:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
ch = (char) data[ST];
|
ch = (char) data[ST];
|
||||||
System.out.print(ch);
|
System.out.print(ch);
|
||||||
break;
|
break;
|
||||||
case Machine.geteolDisplacement:
|
case GETEOL:
|
||||||
try {
|
try {
|
||||||
while ((currentChar = System.in.read()) != '\n')
|
while ((currentChar = System.in.read()) != '\n')
|
||||||
;
|
;
|
||||||
@ -388,10 +395,10 @@ public class Interpreter {
|
|||||||
status = failedIOError;
|
status = failedIOError;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Machine.puteolDisplacement:
|
case PUTEOL:
|
||||||
System.out.println("");
|
System.out.println("");
|
||||||
break;
|
break;
|
||||||
case Machine.getintDisplacement:
|
case GETINT:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
addr = data[ST];
|
addr = data[ST];
|
||||||
try {
|
try {
|
||||||
@ -401,18 +408,18 @@ public class Interpreter {
|
|||||||
}
|
}
|
||||||
data[addr] = (int) accumulator;
|
data[addr] = (int) accumulator;
|
||||||
break;
|
break;
|
||||||
case Machine.putintDisplacement:
|
case PUTINT:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
accumulator = data[ST];
|
accumulator = data[ST];
|
||||||
System.out.print(accumulator);
|
System.out.print(accumulator);
|
||||||
break;
|
break;
|
||||||
case Machine.newDisplacement:
|
case NEW:
|
||||||
size = data[ST - 1];
|
size = data[ST - 1];
|
||||||
checkSpace(size);
|
checkSpace(size);
|
||||||
HT = HT - size;
|
HT = HT - size;
|
||||||
data[ST - 1] = HT;
|
data[ST - 1] = HT;
|
||||||
break;
|
break;
|
||||||
case Machine.disposeDisplacement:
|
case DISPOSE:
|
||||||
ST = ST - 1; // no action taken at present
|
ST = ST - 1; // no action taken at present
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -422,7 +429,6 @@ public class Interpreter {
|
|||||||
// Runs the program in code store.
|
// Runs the program in code store.
|
||||||
|
|
||||||
Instruction currentInstr;
|
Instruction currentInstr;
|
||||||
int op, r, n, d, addr, index;
|
|
||||||
|
|
||||||
// Initialize registers ...
|
// Initialize registers ...
|
||||||
ST = SB;
|
ST = SB;
|
||||||
@ -434,65 +440,67 @@ public class Interpreter {
|
|||||||
// Fetch instruction ...
|
// Fetch instruction ...
|
||||||
currentInstr = Machine.code[CP];
|
currentInstr = Machine.code[CP];
|
||||||
// Decode instruction ...
|
// Decode instruction ...
|
||||||
op = currentInstr.op;
|
var op = currentInstr.opCode;
|
||||||
r = currentInstr.r;
|
var r = currentInstr.register;
|
||||||
n = currentInstr.n;
|
var n = currentInstr.length;
|
||||||
d = currentInstr.d;
|
var d = currentInstr.operand;
|
||||||
|
int addr;
|
||||||
|
|
||||||
// Execute instruction ...
|
// Execute instruction ...
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case Machine.LOADop:
|
case LOAD:
|
||||||
addr = d + content(r);
|
addr = d + content(r);
|
||||||
checkSpace(n);
|
checkSpace(n);
|
||||||
for (index = 0; index < n; index++)
|
for (var index = 0; index < n; index++)
|
||||||
data[ST + index] = data[addr + index];
|
data[ST + index] = data[addr + index];
|
||||||
ST = ST + n;
|
ST = ST + n;
|
||||||
CP = CP + 1;
|
CP = CP + 1;
|
||||||
break;
|
break;
|
||||||
case Machine.LOADAop:
|
case LOADA:
|
||||||
addr = d + content(r);
|
addr = d + content(r);
|
||||||
checkSpace(1);
|
checkSpace(1);
|
||||||
data[ST] = addr;
|
data[ST] = addr;
|
||||||
ST = ST + 1;
|
ST = ST + 1;
|
||||||
CP = CP + 1;
|
CP = CP + 1;
|
||||||
break;
|
break;
|
||||||
case Machine.LOADIop:
|
case LOADI:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
addr = data[ST];
|
addr = data[ST];
|
||||||
checkSpace(n);
|
checkSpace(n);
|
||||||
for (index = 0; index < n; index++)
|
for (var index = 0; index < n; index++)
|
||||||
data[ST + index] = data[addr + index];
|
data[ST + index] = data[addr + index];
|
||||||
ST = ST + n;
|
ST = ST + n;
|
||||||
CP = CP + 1;
|
CP = CP + 1;
|
||||||
break;
|
break;
|
||||||
case Machine.LOADLop:
|
case LOADL:
|
||||||
checkSpace(1);
|
checkSpace(1);
|
||||||
data[ST] = d;
|
data[ST] = d;
|
||||||
ST = ST + 1;
|
ST = ST + 1;
|
||||||
CP = CP + 1;
|
CP = CP + 1;
|
||||||
break;
|
break;
|
||||||
case Machine.STOREop:
|
case STORE:
|
||||||
addr = d + content(r);
|
addr = d + content(r);
|
||||||
ST = ST - n;
|
ST = ST - n;
|
||||||
for (index = 0; index < n; index++)
|
for (var index = 0; index < n; index++)
|
||||||
data[addr + index] = data[ST + index];
|
data[addr + index] = data[ST + index];
|
||||||
CP = CP + 1;
|
CP = CP + 1;
|
||||||
break;
|
break;
|
||||||
case Machine.STOREIop:
|
case STOREI:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
addr = data[ST];
|
addr = data[ST];
|
||||||
ST = ST - n;
|
ST = ST - n;
|
||||||
for (index = 0; index < n; index++)
|
for (var index = 0; index < n; index++)
|
||||||
data[addr + index] = data[ST + index];
|
data[addr + index] = data[ST + index];
|
||||||
CP = CP + 1;
|
CP = CP + 1;
|
||||||
break;
|
break;
|
||||||
case Machine.CALLop:
|
case CALL:
|
||||||
addr = d + content(r);
|
addr = d + content(r);
|
||||||
if (addr >= Machine.PB) {
|
if (addr >= Machine.PB) {
|
||||||
callPrimitive(addr - Machine.PB);
|
callPrimitive(addr - Machine.PB);
|
||||||
CP = CP + 1;
|
CP = CP + 1;
|
||||||
} else {
|
} else {
|
||||||
checkSpace(3);
|
checkSpace(3);
|
||||||
if ((0 <= n) && (n <= 15))
|
if (0 <= n && n <= 15)
|
||||||
data[ST] = content(n); // static link
|
data[ST] = content(n); // static link
|
||||||
else
|
else
|
||||||
status = failedInvalidInstruction;
|
status = failedInvalidInstruction;
|
||||||
@ -503,7 +511,7 @@ public class Interpreter {
|
|||||||
CP = addr;
|
CP = addr;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Machine.CALLIop:
|
case CALLI:
|
||||||
ST = ST - 2;
|
ST = ST - 2;
|
||||||
addr = data[ST + 1];
|
addr = data[ST + 1];
|
||||||
if (addr >= Machine.PB) {
|
if (addr >= Machine.PB) {
|
||||||
@ -518,43 +526,43 @@ public class Interpreter {
|
|||||||
CP = addr;
|
CP = addr;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Machine.RETURNop:
|
case RETURN:
|
||||||
addr = LB - d;
|
addr = LB - d;
|
||||||
CP = data[LB + 2];
|
CP = data[LB + 2];
|
||||||
LB = data[LB + 1];
|
LB = data[LB + 1];
|
||||||
ST = ST - n;
|
ST = ST - n;
|
||||||
for (index = 0; index < n; index++)
|
for (var index = 0; index < n; index++)
|
||||||
data[addr + index] = data[ST + index];
|
data[addr + index] = data[ST + index];
|
||||||
ST = addr + n;
|
ST = addr + n;
|
||||||
break;
|
break;
|
||||||
case Machine.PUSHop:
|
case PUSH:
|
||||||
checkSpace(d);
|
checkSpace(d);
|
||||||
ST = ST + d;
|
ST = ST + d;
|
||||||
CP = CP + 1;
|
CP = CP + 1;
|
||||||
break;
|
break;
|
||||||
case Machine.POPop:
|
case POP:
|
||||||
addr = ST - n - d;
|
addr = ST - n - d;
|
||||||
ST = ST - n;
|
ST = ST - n;
|
||||||
for (index = 0; index < n; index++)
|
for (var index = 0; index < n; index++)
|
||||||
data[addr + index] = data[ST + index];
|
data[addr + index] = data[ST + index];
|
||||||
ST = addr + n;
|
ST = addr + n;
|
||||||
CP = CP + 1;
|
CP = CP + 1;
|
||||||
break;
|
break;
|
||||||
case Machine.JUMPop:
|
case JUMP:
|
||||||
CP = d + content(r);
|
CP = d + content(r);
|
||||||
break;
|
break;
|
||||||
case Machine.JUMPIop:
|
case JUMPI:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
CP = data[ST];
|
CP = data[ST];
|
||||||
break;
|
break;
|
||||||
case Machine.JUMPIFop:
|
case JUMPIF:
|
||||||
ST = ST - 1;
|
ST = ST - 1;
|
||||||
if (data[ST] == n)
|
if (data[ST] == n)
|
||||||
CP = d + content(r);
|
CP = d + content(r);
|
||||||
else
|
else
|
||||||
CP = CP + 1;
|
CP = CP + 1;
|
||||||
break;
|
break;
|
||||||
case Machine.HALTop:
|
case HALT:
|
||||||
status = halted;
|
status = halted;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -21,13 +21,6 @@ import java.io.IOException;
|
|||||||
|
|
||||||
public class Instruction {
|
public class Instruction {
|
||||||
|
|
||||||
public Instruction() {
|
|
||||||
op = 0;
|
|
||||||
r = 0;
|
|
||||||
n = 0;
|
|
||||||
d = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Java has no type synonyms, so the following representations are
|
// Java has no type synonyms, so the following representations are
|
||||||
// assumed:
|
// assumed:
|
||||||
//
|
//
|
||||||
@ -37,26 +30,36 @@ public class Instruction {
|
|||||||
// Operand = -32767..+32767; {16 bits signed}
|
// Operand = -32767..+32767; {16 bits signed}
|
||||||
|
|
||||||
// Represents TAM instructions.
|
// Represents TAM instructions.
|
||||||
public int op; // OpCode
|
final OpCode opCode;
|
||||||
public int r; // RegisterNumber
|
final Register register;
|
||||||
public int n; // Length
|
final int length;
|
||||||
public int d; // Operand
|
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 {
|
public void write(DataOutputStream output) throws IOException {
|
||||||
output.writeInt(op);
|
output.writeInt(opCode.ordinal());
|
||||||
output.writeInt(r);
|
output.writeInt(register.ordinal());
|
||||||
output.writeInt(n);
|
output.writeInt(length);
|
||||||
output.writeInt(d);
|
output.writeInt(operand);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Instruction read(DataInputStream input) throws IOException {
|
public static Instruction read(DataInputStream input) throws IOException {
|
||||||
Instruction inst = new Instruction();
|
|
||||||
try {
|
try {
|
||||||
inst.op = input.readInt();
|
var opCode = OpCode.values()[input.readInt()];
|
||||||
inst.r = input.readInt();
|
var register = Register.values()[input.readInt()];
|
||||||
inst.n = input.readInt();
|
var length = input.readInt();
|
||||||
inst.d = input.readInt();
|
var operand = input.readInt();
|
||||||
return inst;
|
return new Instruction(opCode, register, length, operand);
|
||||||
} catch (EOFException s) {
|
} catch (EOFException s) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -31,10 +31,6 @@ public final class Machine {
|
|||||||
|
|
||||||
// INSTRUCTIONS
|
// 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
|
// CODE STORE
|
||||||
|
|
||||||
public static Instruction[] code = new Instruction[1024];
|
public static Instruction[] code = new Instruction[1024];
|
||||||
@ -46,9 +42,6 @@ public final class Machine {
|
|||||||
|
|
||||||
// REGISTER NUMBERS
|
// 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
|
// DATA REPRESENTATION
|
||||||
|
|
||||||
public final static int booleanSize = 1, characterSize = 1, integerSize = 1, addressSize = 1,
|
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;
|
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;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
@ -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
|
||||||
|
}
|
@ -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
|
||||||
|
}
|
@ -14,12 +14,14 @@
|
|||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees;
|
||||||
|
|
||||||
import Triangle.CodeGenerator.RuntimeEntity;
|
import Triangle.CodeGenerator.Entities.RuntimeEntity;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
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;
|
this.position = position;
|
||||||
entity = null;
|
entity = null;
|
||||||
}
|
}
|
||||||
@ -28,13 +30,5 @@ public abstract class AST {
|
|||||||
return position;
|
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;
|
public RuntimeEntity entity;
|
||||||
}
|
}
|
@ -12,13 +12,21 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public abstract class ActualParameter extends AST {
|
public abstract class ActualParameter extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public ActualParameter(SourcePosition position) {
|
public ActualParameter(SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> visitor, TArg arg);
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,13 +12,21 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public abstract class ActualParameterSequence extends AST {
|
public abstract class ActualParameterSequence extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public ActualParameterSequence(SourcePosition position) {
|
public ActualParameterSequence(SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract <TArg, TResult> TResult visit(ActualParameterSequenceVisitor<TArg, TResult> v, TArg arg);
|
||||||
|
|
||||||
|
public <TResult> TResult visit(ActualParameterSequenceVisitor<Void, TResult> v) {
|
||||||
|
return visit(v, null);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class ConstActualParameter extends ActualParameter {
|
public class ConstActualParameter extends ActualParameter {
|
||||||
@ -23,10 +25,9 @@ public class ConstActualParameter extends ActualParameter {
|
|||||||
E = eAST;
|
E = eAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitConstActualParameter(this, arg);
|
||||||
return v.visitConstActualParameter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class EmptyActualParameterSequence extends ActualParameterSequence {
|
public class EmptyActualParameterSequence extends ActualParameterSequence {
|
||||||
@ -22,8 +23,7 @@ public class EmptyActualParameterSequence extends ActualParameterSequence {
|
|||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ActualParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitEmptyActualParameterSequence(this, arg);
|
||||||
return v.visitEmptyActualParameterSequence(this, o);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class FuncActualParameter extends ActualParameter {
|
public class FuncActualParameter extends ActualParameter {
|
||||||
@ -23,10 +25,9 @@ public class FuncActualParameter extends ActualParameter {
|
|||||||
I = iAST;
|
I = iAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitFuncActualParameter(this, arg);
|
||||||
return v.visitFuncActualParameter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class MultipleActualParameterSequence extends ActualParameterSequence {
|
public class MultipleActualParameterSequence extends ActualParameterSequence {
|
||||||
@ -25,11 +26,10 @@ public class MultipleActualParameterSequence extends ActualParameterSequence {
|
|||||||
APS = apsAST;
|
APS = apsAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ActualParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitMultipleActualParameterSequence(this, arg);
|
||||||
return v.visitMultipleActualParameterSequence(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ActualParameter AP;
|
public final ActualParameter AP;
|
||||||
public ActualParameterSequence APS;
|
public final ActualParameterSequence APS;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class ProcActualParameter extends ActualParameter {
|
public class ProcActualParameter extends ActualParameter {
|
||||||
@ -23,10 +25,9 @@ public class ProcActualParameter extends ActualParameter {
|
|||||||
I = iAST;
|
I = iAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitProcActualParameter(this, arg);
|
||||||
return v.visitProcActualParameter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterSequenceVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class SingleActualParameterSequence extends ActualParameterSequence {
|
public class SingleActualParameterSequence extends ActualParameterSequence {
|
||||||
@ -23,10 +24,9 @@ public class SingleActualParameterSequence extends ActualParameterSequence {
|
|||||||
AP = apAST;
|
AP = apAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ActualParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitSingleActualParameterSequence(this, arg);
|
||||||
return v.visitSingleActualParameterSequence(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ActualParameter AP;
|
public final ActualParameter AP;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Actuals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ActualParameterVisitor;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Vnames.Vname;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class VarActualParameter extends ActualParameter {
|
public class VarActualParameter extends ActualParameter {
|
||||||
@ -23,10 +25,9 @@ public class VarActualParameter extends ActualParameter {
|
|||||||
V = vAST;
|
V = vAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ActualParameterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitVarActualParameter(this, arg);
|
||||||
return v.visitVarActualParameter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vname V;
|
public final Vname V;
|
||||||
}
|
}
|
@ -12,11 +12,13 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Aggregates;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public abstract class ArrayAggregate extends AST {
|
public abstract class ArrayAggregate extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public ArrayAggregate(SourcePosition position) {
|
public ArrayAggregate(SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
@ -24,4 +26,10 @@ public abstract class ArrayAggregate extends AST {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int elemCount;
|
public int elemCount;
|
||||||
|
|
||||||
|
public abstract <TArg, TResult> TResult visit(ArrayAggregateVisitor<TArg, TResult> visitor, TArg arg);
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(ArrayAggregateVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Aggregates;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class MultipleArrayAggregate extends ArrayAggregate {
|
public class MultipleArrayAggregate extends ArrayAggregate {
|
||||||
@ -24,11 +26,10 @@ public class MultipleArrayAggregate extends ArrayAggregate {
|
|||||||
AA = aaAST;
|
AA = aaAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ArrayAggregateVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitMultipleArrayAggregate(this, arg);
|
||||||
return v.visitMultipleArrayAggregate(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
public ArrayAggregate AA;
|
public final ArrayAggregate AA;
|
||||||
}
|
}
|
@ -12,26 +12,27 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class MultipleRecordAggregate extends RecordAggregate {
|
public class MultipleRecordAggregate extends RecordAggregate {
|
||||||
|
|
||||||
public MultipleRecordAggregate(Identifier iAST, Expression eAST, RecordAggregate raAST,
|
public MultipleRecordAggregate(Identifier iAST, Expression eAST, RecordAggregate raAST, SourcePosition position) {
|
||||||
SourcePosition position) {
|
|
||||||
super(position);
|
super(position);
|
||||||
I = iAST;
|
I = iAST;
|
||||||
E = eAST;
|
E = eAST;
|
||||||
RA = raAST;
|
RA = raAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(RecordAggregateVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitMultipleRecordAggregate(this, arg);
|
||||||
return v.visitMultipleRecordAggregate(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
public RecordAggregate RA;
|
public final RecordAggregate RA;
|
||||||
}
|
}
|
@ -12,11 +12,14 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public abstract class RecordAggregate extends AST {
|
public abstract class RecordAggregate extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public RecordAggregate(SourcePosition position) {
|
public RecordAggregate(SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
@ -24,4 +27,10 @@ public abstract class RecordAggregate extends AST {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public FieldTypeDenoter type;
|
public FieldTypeDenoter type;
|
||||||
|
|
||||||
|
public abstract <TArg, TResult> TResult visit(RecordAggregateVisitor<TArg, TResult> visitor, TArg arg);
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(RecordAggregateVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Aggregates;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ArrayAggregateVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class SingleArrayAggregate extends ArrayAggregate {
|
public class SingleArrayAggregate extends ArrayAggregate {
|
||||||
@ -23,10 +25,9 @@ public class SingleArrayAggregate extends ArrayAggregate {
|
|||||||
E = eAST;
|
E = eAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ArrayAggregateVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitSingleArrayAggregate(this, arg);
|
||||||
return v.visitSingleArrayAggregate(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class SingleRecordAggregate extends RecordAggregate {
|
public class SingleRecordAggregate extends RecordAggregate {
|
||||||
@ -24,11 +27,10 @@ public class SingleRecordAggregate extends RecordAggregate {
|
|||||||
E = eAST;
|
E = eAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(RecordAggregateVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitSingleRecordAggregate(this, arg);
|
||||||
return v.visitSingleRecordAggregate(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class AssignCommand extends Command {
|
public class AssignCommand extends Command {
|
||||||
@ -24,11 +27,10 @@ public class AssignCommand extends Command {
|
|||||||
E = eAST;
|
E = eAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitAssignCommand(this, arg);
|
||||||
return v.visitAssignCommand(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vname V;
|
public final Vname V;
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class CallCommand extends Command {
|
public class CallCommand extends Command {
|
||||||
@ -24,11 +27,10 @@ public class CallCommand extends Command {
|
|||||||
APS = apsAST;
|
APS = apsAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitCallCommand(this, arg);
|
||||||
return v.visitCallCommand(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public ActualParameterSequence APS;
|
public final ActualParameterSequence APS;
|
||||||
}
|
}
|
@ -12,13 +12,21 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Commands;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public abstract class Command extends AST {
|
public abstract class Command extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public Command(SourcePosition position) {
|
public Command(SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> visitor, TArg arg);
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Commands;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class EmptyCommand extends Command {
|
public class EmptyCommand extends Command {
|
||||||
@ -22,8 +23,7 @@ public class EmptyCommand extends Command {
|
|||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitEmptyCommand(this, arg);
|
||||||
return v.visitEmptyCommand(this, o);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Commands;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class IfCommand extends Command {
|
public class IfCommand extends Command {
|
||||||
@ -25,11 +27,10 @@ public class IfCommand extends Command {
|
|||||||
C2 = c2AST;
|
C2 = c2AST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitIfCommand(this, arg);
|
||||||
return v.visitIfCommand(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
public Command C1, C2;
|
public final Command C1, C2;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Commands;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Declarations.Declaration;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class LetCommand extends Command {
|
public class LetCommand extends Command {
|
||||||
@ -24,11 +26,10 @@ public class LetCommand extends Command {
|
|||||||
C = cAST;
|
C = cAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitLetCommand(this, arg);
|
||||||
return v.visitLetCommand(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Declaration D;
|
public final Declaration D;
|
||||||
public Command C;
|
public final Command C;
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Commands;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class SequentialCommand extends Command {
|
public class SequentialCommand extends Command {
|
||||||
@ -24,10 +25,9 @@ public class SequentialCommand extends Command {
|
|||||||
C2 = c2AST;
|
C2 = c2AST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitSequentialCommand(this, arg);
|
||||||
return v.visitSequentialCommand(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Command C1, C2;
|
public final Command C1, C2;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Commands;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.CommandVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class WhileCommand extends Command {
|
public class WhileCommand extends Command {
|
||||||
@ -24,11 +26,10 @@ public class WhileCommand extends Command {
|
|||||||
C = cAST;
|
C = cAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(CommandVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitWhileCommand(this, arg);
|
||||||
return v.visitWhileCommand(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
public Command C;
|
public final Command C;
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class BinaryOperatorDeclaration extends Declaration {
|
public class BinaryOperatorDeclaration extends Declaration {
|
||||||
@ -27,11 +30,10 @@ public class BinaryOperatorDeclaration extends Declaration {
|
|||||||
RES = resultAST;
|
RES = resultAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitBinaryOperatorDeclaration(this, arg);
|
||||||
return v.visitBinaryOperatorDeclaration(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Operator O;
|
public final Operator O;
|
||||||
public TypeDenoter ARG1, ARG2, RES;
|
public final TypeDenoter ARG1, ARG2, RES;
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class ConstDeclaration extends Declaration {
|
public class ConstDeclaration extends Declaration {
|
||||||
@ -24,11 +27,10 @@ public class ConstDeclaration extends Declaration {
|
|||||||
E = eAST;
|
E = eAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitConstDeclaration(this, arg);
|
||||||
return v.visitConstDeclaration(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
}
|
}
|
@ -12,11 +12,13 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Declarations;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public abstract class Declaration extends AST {
|
public abstract class Declaration extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public Declaration(SourcePosition position) {
|
public Declaration(SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
@ -24,4 +26,10 @@ public abstract class Declaration extends AST {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean duplicated;
|
public boolean duplicated;
|
||||||
|
|
||||||
|
public abstract <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> visitor, TArg arg);
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,8 +12,13 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class FuncDeclaration extends Declaration {
|
public class FuncDeclaration extends Declaration {
|
||||||
@ -27,13 +32,12 @@ public class FuncDeclaration extends Declaration {
|
|||||||
E = eAST;
|
E = eAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitFuncDeclaration(this, arg);
|
||||||
return v.visitFuncDeclaration(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public FormalParameterSequence FPS;
|
public final FormalParameterSequence FPS;
|
||||||
public TypeDenoter T;
|
public TypeDenoter T;
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
}
|
}
|
@ -12,8 +12,12 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class ProcDeclaration extends Declaration {
|
public class ProcDeclaration extends Declaration {
|
||||||
@ -25,12 +29,11 @@ public class ProcDeclaration extends Declaration {
|
|||||||
C = cAST;
|
C = cAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitProcDeclaration(this, arg);
|
||||||
return v.visitProcDeclaration(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public FormalParameterSequence FPS;
|
public final FormalParameterSequence FPS;
|
||||||
public Command C;
|
public final Command C;
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Declarations;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class SequentialDeclaration extends Declaration {
|
public class SequentialDeclaration extends Declaration {
|
||||||
@ -24,10 +25,9 @@ public class SequentialDeclaration extends Declaration {
|
|||||||
D2 = d2AST;
|
D2 = d2AST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitSequentialDeclaration(this, arg);
|
||||||
return v.visitSequentialDeclaration(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Declaration D1, D2;
|
public final Declaration D1, D2;
|
||||||
}
|
}
|
@ -12,25 +12,26 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class UnaryOperatorDeclaration extends Declaration {
|
public class UnaryOperatorDeclaration extends Declaration {
|
||||||
|
|
||||||
public UnaryOperatorDeclaration(Operator oAST, TypeDenoter argAST, TypeDenoter resultAST,
|
public UnaryOperatorDeclaration(Operator oAST, TypeDenoter argAST, TypeDenoter resultAST, SourcePosition position) {
|
||||||
SourcePosition position) {
|
|
||||||
super(position);
|
super(position);
|
||||||
O = oAST;
|
O = oAST;
|
||||||
ARG = argAST;
|
ARG = argAST;
|
||||||
RES = resultAST;
|
RES = resultAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitUnaryOperatorDeclaration(this, arg);
|
||||||
return v.visitUnaryOperatorDeclaration(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Operator O;
|
public final Operator O;
|
||||||
public TypeDenoter ARG, RES;
|
public final TypeDenoter ARG, RES;
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class VarDeclaration extends Declaration {
|
public class VarDeclaration extends Declaration {
|
||||||
@ -24,11 +27,10 @@ public class VarDeclaration extends Declaration {
|
|||||||
T = tAST;
|
T = tAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitVarDeclaration(this, arg);
|
||||||
return v.visitVarDeclaration(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public TypeDenoter T;
|
public TypeDenoter T;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Aggregates.ArrayAggregate;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class ArrayExpression extends Expression {
|
public class ArrayExpression extends Expression {
|
||||||
@ -23,10 +25,9 @@ public class ArrayExpression extends Expression {
|
|||||||
AA = aaAST;
|
AA = aaAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitArrayExpression(this, arg);
|
||||||
return v.visitArrayExpression(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayAggregate AA;
|
public final ArrayAggregate AA;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Operator;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class BinaryExpression extends Expression {
|
public class BinaryExpression extends Expression {
|
||||||
@ -25,11 +27,10 @@ public class BinaryExpression extends Expression {
|
|||||||
E2 = e2AST;
|
E2 = e2AST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitBinaryExpression(this, arg);
|
||||||
return v.visitBinaryExpression(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression E1, E2;
|
public final Expression E1, E2;
|
||||||
public Operator O;
|
public final Operator O;
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class CallExpression extends Expression {
|
public class CallExpression extends Expression {
|
||||||
@ -24,11 +27,10 @@ public class CallExpression extends Expression {
|
|||||||
APS = apsAST;
|
APS = apsAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitCallExpression(this, arg);
|
||||||
return v.visitCallExpression(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public ActualParameterSequence APS;
|
public final ActualParameterSequence APS;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.CharacterLiteral;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class CharacterExpression extends Expression {
|
public class CharacterExpression extends Expression {
|
||||||
@ -23,10 +25,9 @@ public class CharacterExpression extends Expression {
|
|||||||
CL = clAST;
|
CL = clAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitCharacterExpression(this, arg);
|
||||||
return v.visitCharacterExpression(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public CharacterLiteral CL;
|
public final CharacterLiteral CL;
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class EmptyExpression extends Expression {
|
public class EmptyExpression extends Expression {
|
||||||
@ -22,8 +23,7 @@ public class EmptyExpression extends Expression {
|
|||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitEmptyExpression(this, arg);
|
||||||
return v.visitEmptyExpression(this, o);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,11 +12,14 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public abstract class Expression extends AST {
|
public abstract class Expression extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public Expression(SourcePosition position) {
|
public Expression(SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
@ -24,4 +27,10 @@ public abstract class Expression extends AST {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TypeDenoter type;
|
public TypeDenoter type;
|
||||||
|
|
||||||
|
public abstract <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> visitor, TArg arg);
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class IfExpression extends Expression {
|
public class IfExpression extends Expression {
|
||||||
@ -25,10 +26,9 @@ public class IfExpression extends Expression {
|
|||||||
E3 = e3AST;
|
E3 = e3AST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitIfExpression(this, arg);
|
||||||
return v.visitIfExpression(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression E1, E2, E3;
|
public final Expression E1, E2, E3;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class IntegerExpression extends Expression {
|
public class IntegerExpression extends Expression {
|
||||||
@ -23,10 +25,9 @@ public class IntegerExpression extends Expression {
|
|||||||
IL = ilAST;
|
IL = ilAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitIntegerExpression(this, arg);
|
||||||
return v.visitIntegerExpression(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IntegerLiteral IL;
|
public final IntegerLiteral IL;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Declarations.Declaration;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class LetExpression extends Expression {
|
public class LetExpression extends Expression {
|
||||||
@ -24,11 +26,10 @@ public class LetExpression extends Expression {
|
|||||||
E = eAST;
|
E = eAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitLetExpression(this, arg);
|
||||||
return v.visitLetExpression(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Declaration D;
|
public final Declaration D;
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Aggregates.RecordAggregate;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class RecordExpression extends Expression {
|
public class RecordExpression extends Expression {
|
||||||
@ -23,10 +25,9 @@ public class RecordExpression extends Expression {
|
|||||||
RA = raAST;
|
RA = raAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitRecordExpression(this, arg);
|
||||||
return v.visitRecordExpression(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public RecordAggregate RA;
|
public final RecordAggregate RA;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Operator;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class UnaryExpression extends Expression {
|
public class UnaryExpression extends Expression {
|
||||||
@ -24,11 +26,10 @@ public class UnaryExpression extends Expression {
|
|||||||
E = eAST;
|
E = eAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitUnaryExpression(this, arg);
|
||||||
return v.visitUnaryExpression(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
public Operator O;
|
public final Operator O;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Expressions;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ExpressionVisitor;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Vnames.Vname;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class VnameExpression extends Expression {
|
public class VnameExpression extends Expression {
|
||||||
@ -23,10 +25,9 @@ public class VnameExpression extends Expression {
|
|||||||
V = vAST;
|
V = vAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(ExpressionVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitVnameExpression(this, arg);
|
||||||
return v.visitVnameExpression(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vname V;
|
public final Vname V;
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class ConstFormalParameter extends FormalParameter {
|
public class ConstFormalParameter extends FormalParameter {
|
||||||
@ -24,20 +27,20 @@ public class ConstFormalParameter extends FormalParameter {
|
|||||||
T = tAST;
|
T = tAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitConstFormalParameter(this, arg);
|
||||||
return v.visitConstFormalParameter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
|
||||||
public TypeDenoter T;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object fpAST) {
|
public boolean equals(Object fpAST) {
|
||||||
if (fpAST instanceof ConstFormalParameter) {
|
if (fpAST instanceof ConstFormalParameter) {
|
||||||
ConstFormalParameter cfpAST = (ConstFormalParameter) fpAST;
|
var cfpAST = (ConstFormalParameter) fpAST;
|
||||||
return T.equals(cfpAST.T);
|
return T.equals(cfpAST.T);
|
||||||
} else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final Identifier I;
|
||||||
|
public TypeDenoter T;
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Formals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class EmptyFormalParameterSequence extends FormalParameterSequence {
|
public class EmptyFormalParameterSequence extends FormalParameterSequence {
|
||||||
@ -22,9 +23,8 @@ public class EmptyFormalParameterSequence extends FormalParameterSequence {
|
|||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(FormalParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitEmptyFormalParameterSequence(this, arg);
|
||||||
return v.visitEmptyFormalParameterSequence(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Formals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Declarations.Declaration;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public abstract class FormalParameter extends Declaration {
|
public abstract class FormalParameter extends Declaration {
|
||||||
@ -25,4 +27,9 @@ public abstract class FormalParameter extends Declaration {
|
|||||||
@Override
|
@Override
|
||||||
public abstract boolean equals(Object fpAST);
|
public abstract boolean equals(Object fpAST);
|
||||||
|
|
||||||
|
public abstract <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> visitor, TArg arg);
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,11 +12,13 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Formals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public abstract class FormalParameterSequence extends AST {
|
public abstract class FormalParameterSequence extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public FormalParameterSequence(SourcePosition position) {
|
public FormalParameterSequence(SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
@ -24,4 +26,10 @@ public abstract class FormalParameterSequence extends AST {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public abstract boolean equals(Object fpsAST);
|
public abstract boolean equals(Object fpsAST);
|
||||||
|
|
||||||
|
public abstract <TArg, TResult> TResult visit(FormalParameterSequenceVisitor<TArg, TResult> visitor, TArg arg);
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(FormalParameterSequenceVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class FuncFormalParameter extends FormalParameter {
|
public class FuncFormalParameter extends FormalParameter {
|
||||||
@ -26,9 +29,8 @@ public class FuncFormalParameter extends FormalParameter {
|
|||||||
T = tAST;
|
T = tAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitFuncFormalParameter(this, arg);
|
||||||
return v.visitFuncFormalParameter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -40,7 +42,7 @@ public class FuncFormalParameter extends FormalParameter {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public FormalParameterSequence FPS;
|
public final FormalParameterSequence FPS;
|
||||||
public TypeDenoter T;
|
public TypeDenoter T;
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Formals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class MultipleFormalParameterSequence extends FormalParameterSequence {
|
public class MultipleFormalParameterSequence extends FormalParameterSequence {
|
||||||
@ -25,9 +26,8 @@ public class MultipleFormalParameterSequence extends FormalParameterSequence {
|
|||||||
FPS = fpsAST;
|
FPS = fpsAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(FormalParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitMultipleFormalParameterSequence(this, arg);
|
||||||
return v.visitMultipleFormalParameterSequence(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -35,10 +35,11 @@ public class MultipleFormalParameterSequence extends FormalParameterSequence {
|
|||||||
if (fpsAST instanceof MultipleFormalParameterSequence) {
|
if (fpsAST instanceof MultipleFormalParameterSequence) {
|
||||||
MultipleFormalParameterSequence mfpsAST = (MultipleFormalParameterSequence) fpsAST;
|
MultipleFormalParameterSequence mfpsAST = (MultipleFormalParameterSequence) fpsAST;
|
||||||
return FP.equals(mfpsAST.FP) && FPS.equals(mfpsAST.FPS);
|
return FP.equals(mfpsAST.FP) && FPS.equals(mfpsAST.FPS);
|
||||||
} else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public FormalParameter FP;
|
public final FormalParameter FP;
|
||||||
public FormalParameterSequence FPS;
|
public final FormalParameterSequence FPS;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Formals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.DeclarationVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class ProcFormalParameter extends FormalParameter {
|
public class ProcFormalParameter extends FormalParameter {
|
||||||
@ -24,20 +26,20 @@ public class ProcFormalParameter extends FormalParameter {
|
|||||||
FPS = fpsAST;
|
FPS = fpsAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitProcFormalParameter(this, arg);
|
||||||
return v.visitProcFormalParameter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
|
||||||
public FormalParameterSequence FPS;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object fpAST) {
|
public boolean equals(Object fpAST) {
|
||||||
if (fpAST instanceof ProcFormalParameter) {
|
if (fpAST instanceof ProcFormalParameter) {
|
||||||
ProcFormalParameter pfpAST = (ProcFormalParameter) fpAST;
|
ProcFormalParameter pfpAST = (ProcFormalParameter) fpAST;
|
||||||
return FPS.equals(pfpAST.FPS);
|
return FPS.equals(pfpAST.FPS);
|
||||||
} else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final Identifier I;
|
||||||
|
public final FormalParameterSequence FPS;
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Formals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.FormalParameterSequenceVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class SingleFormalParameterSequence extends FormalParameterSequence {
|
public class SingleFormalParameterSequence extends FormalParameterSequence {
|
||||||
@ -23,9 +24,8 @@ public class SingleFormalParameterSequence extends FormalParameterSequence {
|
|||||||
FP = fpAST;
|
FP = fpAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(FormalParameterSequenceVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitSingleFormalParameterSequence(this, arg);
|
||||||
return v.visitSingleFormalParameterSequence(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -33,9 +33,10 @@ public class SingleFormalParameterSequence extends FormalParameterSequence {
|
|||||||
if (fpsAST instanceof SingleFormalParameterSequence) {
|
if (fpsAST instanceof SingleFormalParameterSequence) {
|
||||||
SingleFormalParameterSequence sfpsAST = (SingleFormalParameterSequence) fpsAST;
|
SingleFormalParameterSequence sfpsAST = (SingleFormalParameterSequence) fpsAST;
|
||||||
return FP.equals(sfpsAST.FP);
|
return FP.equals(sfpsAST.FP);
|
||||||
} else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public FormalParameter FP;
|
public final FormalParameter FP;
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class VarFormalParameter extends FormalParameter {
|
public class VarFormalParameter extends FormalParameter {
|
||||||
@ -24,20 +27,20 @@ public class VarFormalParameter extends FormalParameter {
|
|||||||
T = tAST;
|
T = tAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitVarFormalParameter(this, arg);
|
||||||
return v.visitVarFormalParameter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
|
||||||
public TypeDenoter T;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object fpAST) {
|
public boolean equals(Object fpAST) {
|
||||||
if (fpAST instanceof VarFormalParameter) {
|
if (fpAST instanceof VarFormalParameter) {
|
||||||
VarFormalParameter vfpAST = (VarFormalParameter) fpAST;
|
VarFormalParameter vfpAST = (VarFormalParameter) fpAST;
|
||||||
return T.equals(vfpAST.T);
|
return T.equals(vfpAST.T);
|
||||||
} else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final Identifier I;
|
||||||
|
public TypeDenoter T;
|
||||||
}
|
}
|
@ -14,19 +14,24 @@
|
|||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Commands.Command;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.ProgramVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class Program extends AST {
|
public class Program extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public Program(Command cAST, SourcePosition position) {
|
public Program(Command cAST, SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
C = cAST;
|
C = cAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public Command C;
|
||||||
public Object visit(Visitor v, Object o) {
|
|
||||||
return v.visitProgram(this, o);
|
public <TArg, TResult> TResult visit(ProgramVisitor<TArg, TResult> visitor, TArg arg) {
|
||||||
|
return visitor.visitProgram(this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Command C;
|
public <TResult> TResult visit(ProgramVisitor<Void, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Terminals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.LiteralVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class CharacterLiteral extends Terminal {
|
public class CharacterLiteral extends Terminal {
|
||||||
@ -22,9 +23,15 @@ public class CharacterLiteral extends Terminal {
|
|||||||
super(spelling, position);
|
super(spelling, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(LiteralVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitCharacterLiteral(this, arg);
|
||||||
return v.visitCharacterLiteral(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(LiteralVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValue() {
|
||||||
|
return spelling.charAt(1);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class Identifier extends Terminal {
|
public class Identifier extends Terminal {
|
||||||
@ -24,11 +27,14 @@ public class Identifier extends Terminal {
|
|||||||
decl = null;
|
decl = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public TypeDenoter type;
|
||||||
public Object visit(Visitor v, Object o) {
|
public AbstractSyntaxTree decl; // Either a Declaration or a FieldTypeDenoter
|
||||||
return v.visitIdentifier(this, o);
|
|
||||||
|
public <TArg, TResult> TResult visit(IdentifierVisitor<TArg, TResult> visitor, TArg arg) {
|
||||||
|
return visitor.visitIdentifier(this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TypeDenoter type;
|
public <TArg, TResult> TResult visit(IdentifierVisitor<TArg, TResult> visitor) {
|
||||||
public AST decl; // Either a Declaration or a FieldTypeDenoter
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Terminals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.LiteralVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class IntegerLiteral extends Terminal {
|
public class IntegerLiteral extends Terminal {
|
||||||
@ -22,9 +23,15 @@ public class IntegerLiteral extends Terminal {
|
|||||||
super(spelling, position);
|
super(spelling, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(LiteralVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitIntegerLiteral(this, arg);
|
||||||
return v.visitIntegerLiteral(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(LiteralVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getValue() {
|
||||||
|
return Integer.parseInt(spelling);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Terminals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Declarations.Declaration;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.OperatorVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class Operator extends Terminal {
|
public class Operator extends Terminal {
|
||||||
@ -23,10 +25,13 @@ public class Operator extends Terminal {
|
|||||||
decl = null;
|
decl = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public Declaration decl;
|
||||||
public Object visit(Visitor v, Object o) {
|
|
||||||
return v.visitOperator(this, o);
|
public <TArg, TResult> TResult visit(OperatorVisitor<TArg, TResult> v, TArg arg) {
|
||||||
|
return v.visitOperator(this, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Declaration decl;
|
public <TArg, TResult> TResult visit(OperatorVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
@ -12,11 +12,12 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Terminals;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
abstract public class Terminal extends AST {
|
public abstract class Terminal extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public Terminal(String spelling, SourcePosition position) {
|
public Terminal(String spelling, SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class AnyTypeDenoter extends TypeDenoter {
|
public class AnyTypeDenoter extends TypeDenoter {
|
||||||
@ -22,9 +23,8 @@ public class AnyTypeDenoter extends TypeDenoter {
|
|||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitAnyTypeDenoter(this, arg);
|
||||||
return v.visitAnyTypeDenoter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class ArrayTypeDenoter extends TypeDenoter {
|
public class ArrayTypeDenoter extends TypeDenoter {
|
||||||
@ -24,22 +26,22 @@ public class ArrayTypeDenoter extends TypeDenoter {
|
|||||||
T = tAST;
|
T = tAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitArrayTypeDenoter(this, arg);
|
||||||
return v.visitArrayTypeDenoter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (obj != null && obj instanceof ErrorTypeDenoter)
|
if (obj != null && obj instanceof ErrorTypeDenoter) {
|
||||||
return true;
|
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
|
return this.IL.spelling.compareTo(((ArrayTypeDenoter) obj).IL.spelling) == 0
|
||||||
&& this.T.equals(((ArrayTypeDenoter) obj).T);
|
&& this.T.equals(((ArrayTypeDenoter) obj).T);
|
||||||
else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IntegerLiteral IL;
|
public final IntegerLiteral IL;
|
||||||
public TypeDenoter T;
|
public TypeDenoter T;
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class BoolTypeDenoter extends TypeDenoter {
|
public class BoolTypeDenoter extends TypeDenoter {
|
||||||
@ -22,16 +23,16 @@ public class BoolTypeDenoter extends TypeDenoter {
|
|||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitBoolTypeDenoter(this, arg);
|
||||||
return v.visitBoolTypeDenoter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if ((obj != null) && (obj instanceof ErrorTypeDenoter))
|
if ((obj != null) && (obj instanceof ErrorTypeDenoter)) {
|
||||||
return true;
|
return true;
|
||||||
else
|
} else {
|
||||||
return ((obj != null) && (obj instanceof BoolTypeDenoter));
|
return ((obj != null) && (obj instanceof BoolTypeDenoter));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class CharTypeDenoter extends TypeDenoter {
|
public class CharTypeDenoter extends TypeDenoter {
|
||||||
@ -22,16 +23,16 @@ public class CharTypeDenoter extends TypeDenoter {
|
|||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitCharTypeDenoter(this, arg);
|
||||||
return v.visitCharTypeDenoter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (obj != null && obj instanceof ErrorTypeDenoter)
|
if (obj != null && obj instanceof ErrorTypeDenoter) {
|
||||||
return true;
|
return true;
|
||||||
else
|
} else {
|
||||||
return (obj != null && obj instanceof CharTypeDenoter);
|
return (obj != null && obj instanceof CharTypeDenoter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class ErrorTypeDenoter extends TypeDenoter {
|
public class ErrorTypeDenoter extends TypeDenoter {
|
||||||
@ -22,9 +23,8 @@ public class ErrorTypeDenoter extends TypeDenoter {
|
|||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitErrorTypeDenoter(this, arg);
|
||||||
return v.visitErrorTypeDenoter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -12,7 +12,7 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
@ -21,7 +21,4 @@ public abstract class FieldTypeDenoter extends TypeDenoter {
|
|||||||
public FieldTypeDenoter(SourcePosition position) {
|
public FieldTypeDenoter(SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public abstract boolean equals(Object obj);
|
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class IntTypeDenoter extends TypeDenoter {
|
public class IntTypeDenoter extends TypeDenoter {
|
||||||
@ -22,16 +23,16 @@ public class IntTypeDenoter extends TypeDenoter {
|
|||||||
super(position);
|
super(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitIntTypeDenoter(this, arg);
|
||||||
return v.visitIntTypeDenoter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (obj != null && obj instanceof ErrorTypeDenoter)
|
if (obj != null && obj instanceof ErrorTypeDenoter) {
|
||||||
return true;
|
return true;
|
||||||
else
|
} else {
|
||||||
return (obj != null && obj instanceof IntTypeDenoter);
|
return (obj != null && obj instanceof IntTypeDenoter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class MultipleFieldTypeDenoter extends FieldTypeDenoter {
|
public class MultipleFieldTypeDenoter extends FieldTypeDenoter {
|
||||||
@ -26,9 +28,8 @@ public class MultipleFieldTypeDenoter extends FieldTypeDenoter {
|
|||||||
FT = ftAST;
|
FT = ftAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitMultipleFieldTypeDenoter(this, arg);
|
||||||
return v.visitMultipleFieldTypeDenoter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -36,11 +37,12 @@ public class MultipleFieldTypeDenoter extends FieldTypeDenoter {
|
|||||||
if (obj != null && obj instanceof MultipleFieldTypeDenoter) {
|
if (obj != null && obj instanceof MultipleFieldTypeDenoter) {
|
||||||
MultipleFieldTypeDenoter ft = (MultipleFieldTypeDenoter) obj;
|
MultipleFieldTypeDenoter ft = (MultipleFieldTypeDenoter) obj;
|
||||||
return (this.I.spelling.compareTo(ft.I.spelling) == 0) && this.T.equals(ft.T) && this.FT.equals(ft.FT);
|
return (this.I.spelling.compareTo(ft.I.spelling) == 0) && this.T.equals(ft.T) && this.FT.equals(ft.FT);
|
||||||
} else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public TypeDenoter T;
|
public TypeDenoter T;
|
||||||
public FieldTypeDenoter FT;
|
public FieldTypeDenoter FT;
|
||||||
}
|
}
|
@ -12,8 +12,9 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class RecordTypeDenoter extends TypeDenoter {
|
public class RecordTypeDenoter extends TypeDenoter {
|
||||||
@ -23,19 +24,19 @@ public class RecordTypeDenoter extends TypeDenoter {
|
|||||||
FT = ftAST;
|
FT = ftAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitRecordTypeDenoter(this, arg);
|
||||||
return v.visitRecordTypeDenoter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (obj != null && obj instanceof ErrorTypeDenoter)
|
if (obj != null && obj instanceof ErrorTypeDenoter) {
|
||||||
return true;
|
return true;
|
||||||
else if (obj != null && obj instanceof RecordTypeDenoter)
|
} else if (obj != null && obj instanceof RecordTypeDenoter) {
|
||||||
return this.FT.equals(((RecordTypeDenoter) obj).FT);
|
return this.FT.equals(((RecordTypeDenoter) obj).FT);
|
||||||
else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public FieldTypeDenoter FT;
|
public FieldTypeDenoter FT;
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class SimpleTypeDenoter extends TypeDenoter {
|
public class SimpleTypeDenoter extends TypeDenoter {
|
||||||
@ -23,9 +25,8 @@ public class SimpleTypeDenoter extends TypeDenoter {
|
|||||||
I = iAST;
|
I = iAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitSimpleTypeDenoter(this, arg);
|
||||||
return v.visitSimpleTypeDenoter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -33,5 +34,5 @@ public class SimpleTypeDenoter extends TypeDenoter {
|
|||||||
return false; // should not happen
|
return false; // should not happen
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class SingleFieldTypeDenoter extends FieldTypeDenoter {
|
public class SingleFieldTypeDenoter extends FieldTypeDenoter {
|
||||||
@ -24,9 +26,8 @@ public class SingleFieldTypeDenoter extends FieldTypeDenoter {
|
|||||||
T = tAST;
|
T = tAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitSingleFieldTypeDenoter(this, arg);
|
||||||
return v.visitSingleFieldTypeDenoter(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -34,10 +35,11 @@ public class SingleFieldTypeDenoter extends FieldTypeDenoter {
|
|||||||
if (obj != null && obj instanceof SingleFieldTypeDenoter) {
|
if (obj != null && obj instanceof SingleFieldTypeDenoter) {
|
||||||
SingleFieldTypeDenoter ft = (SingleFieldTypeDenoter) obj;
|
SingleFieldTypeDenoter ft = (SingleFieldTypeDenoter) obj;
|
||||||
return (this.I.spelling.compareTo(ft.I.spelling) == 0) && this.T.equals(ft.T);
|
return (this.I.spelling.compareTo(ft.I.spelling) == 0) && this.T.equals(ft.T);
|
||||||
} else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public TypeDenoter T;
|
public TypeDenoter T;
|
||||||
}
|
}
|
@ -12,8 +12,11 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class TypeDeclaration extends Declaration {
|
public class TypeDeclaration extends Declaration {
|
||||||
@ -24,11 +27,10 @@ public class TypeDeclaration extends Declaration {
|
|||||||
T = tAST;
|
T = tAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(DeclarationVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitTypeDeclaration(this, arg);
|
||||||
return v.visitTypeDeclaration(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public TypeDenoter T;
|
public TypeDenoter T;
|
||||||
}
|
}
|
@ -12,11 +12,13 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Types;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.AbstractSyntaxTree;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.TypeDenoterVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public abstract class TypeDenoter extends AST {
|
public abstract class TypeDenoter extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public TypeDenoter(SourcePosition position) {
|
public TypeDenoter(SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
@ -25,4 +27,9 @@ public abstract class TypeDenoter extends AST {
|
|||||||
@Override
|
@Override
|
||||||
public abstract boolean equals(Object obj);
|
public abstract boolean equals(Object obj);
|
||||||
|
|
||||||
|
public abstract <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> visitor, TArg arg);
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(TypeDenoterVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, 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);
|
|
||||||
|
|
||||||
}
|
|
@ -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<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitSingleActualParameterSequence(SingleActualParameterSequence ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -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<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitConstActualParameter(ConstActualParameter ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitFuncActualParameter(FuncActualParameter ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitProcActualParameter(ProcActualParameter ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitVarActualParameter(VarActualParameter ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Aggregates.MultipleArrayAggregate;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Aggregates.SingleArrayAggregate;
|
||||||
|
|
||||||
|
public interface ArrayAggregateVisitor<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitMultipleArrayAggregate(MultipleArrayAggregate ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitSingleArrayAggregate(SingleArrayAggregate ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -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<TArg, TResult> {
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
@ -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<TArg, TResult> extends FormalParameterVisitor<TArg, TResult> {
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
@ -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<TArg, TResult> {
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Types.MultipleFieldTypeDenoter;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Types.SingleFieldTypeDenoter;
|
||||||
|
|
||||||
|
public interface FieldTypeDenoterVisitor<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -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<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -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<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitConstFormalParameter(ConstFormalParameter ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitFuncFormalParameter(FuncFormalParameter ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitProcFormalParameter(ProcFormalParameter ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitVarFormalParameter(VarFormalParameter ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||||
|
|
||||||
|
public interface IdentifierVisitor<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitIdentifier(Identifier ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.CharacterLiteral;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.IntegerLiteral;
|
||||||
|
|
||||||
|
public interface LiteralVisitor<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitCharacterLiteral(CharacterLiteral ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitIntegerLiteral(IntegerLiteral ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Operator;
|
||||||
|
|
||||||
|
public interface OperatorVisitor<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitOperator(Operator ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Program;
|
||||||
|
|
||||||
|
public interface ProgramVisitor<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitProgram(Program ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package Triangle.AbstractSyntaxTrees.Visitors;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Aggregates.MultipleRecordAggregate;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Aggregates.SingleRecordAggregate;
|
||||||
|
|
||||||
|
public interface RecordAggregateVisitor<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitMultipleRecordAggregate(MultipleRecordAggregate ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitSingleRecordAggregate(SingleRecordAggregate ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -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<TArg, TResult> extends FieldTypeDenoterVisitor<TArg, TResult> {
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
@ -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<TArg, TResult> {
|
||||||
|
|
||||||
|
TResult visitDotVname(DotVname ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitSimpleVname(SimpleVname ast, TArg arg);
|
||||||
|
|
||||||
|
TResult visitSubscriptVname(SubscriptVname ast, TArg arg);
|
||||||
|
|
||||||
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Vnames;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class DotVname extends Vname {
|
public class DotVname extends Vname {
|
||||||
@ -24,11 +26,10 @@ public class DotVname extends Vname {
|
|||||||
I = iAST;
|
I = iAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(VnameVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitDotVname(this, arg);
|
||||||
return v.visitDotVname(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
public Vname V;
|
public final Vname V;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Vnames;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Terminals.Identifier;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class SimpleVname extends Vname {
|
public class SimpleVname extends Vname {
|
||||||
@ -23,10 +25,9 @@ public class SimpleVname extends Vname {
|
|||||||
I = iAST;
|
I = iAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(VnameVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitSimpleVname(this, arg);
|
||||||
return v.visitSimpleVname(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Identifier I;
|
public final Identifier I;
|
||||||
}
|
}
|
@ -12,8 +12,10 @@
|
|||||||
* of the authors.
|
* of the authors.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package Triangle.AbstractSyntaxTrees;
|
package Triangle.AbstractSyntaxTrees.Vnames;
|
||||||
|
|
||||||
|
import Triangle.AbstractSyntaxTrees.Expressions.Expression;
|
||||||
|
import Triangle.AbstractSyntaxTrees.Visitors.VnameVisitor;
|
||||||
import Triangle.SyntacticAnalyzer.SourcePosition;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public class SubscriptVname extends Vname {
|
public class SubscriptVname extends Vname {
|
||||||
@ -24,11 +26,10 @@ public class SubscriptVname extends Vname {
|
|||||||
E = eAST;
|
E = eAST;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public <TArg, TResult> TResult visit(VnameVisitor<TArg, TResult> v, TArg arg) {
|
||||||
public Object visit(Visitor v, Object o) {
|
return v.visitSubscriptVname(this, arg);
|
||||||
return v.visitSubscriptVname(this, o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Expression E;
|
public final Expression E;
|
||||||
public Vname V;
|
public final Vname V;
|
||||||
}
|
}
|
@ -12,11 +12,14 @@
|
|||||||
* of the authors.
|
* 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;
|
import Triangle.SyntacticAnalyzer.SourcePosition;
|
||||||
|
|
||||||
public abstract class Vname extends AST {
|
public abstract class Vname extends AbstractSyntaxTree {
|
||||||
|
|
||||||
public Vname(SourcePosition position) {
|
public Vname(SourcePosition position) {
|
||||||
super(position);
|
super(position);
|
||||||
@ -27,4 +30,10 @@ public abstract class Vname extends AST {
|
|||||||
public boolean variable, indexed;
|
public boolean variable, indexed;
|
||||||
public int offset;
|
public int offset;
|
||||||
public TypeDenoter type;
|
public TypeDenoter type;
|
||||||
|
|
||||||
|
public abstract <TArg, TResult> TResult visit(VnameVisitor<TArg, TResult> visitor, TArg arg);
|
||||||
|
|
||||||
|
public <TArg, TResult> TResult visit(VnameVisitor<TArg, TResult> visitor) {
|
||||||
|
return visit(visitor, null);
|
||||||
|
}
|
||||||
}
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user