parent
d81805bc2e
commit
baf478a7a7
@ -0,0 +1,18 @@ |
|||||||
|
{ |
||||||
|
"cSpell.words": [ |
||||||
|
"actuals", |
||||||
|
"Analyser", |
||||||
|
"Denoter", |
||||||
|
"DENOTERS", |
||||||
|
"Deryck", |
||||||
|
"geteol", |
||||||
|
"getint", |
||||||
|
"maxint", |
||||||
|
"notgreater", |
||||||
|
"notless", |
||||||
|
"puteol", |
||||||
|
"putint", |
||||||
|
"Vname" |
||||||
|
], |
||||||
|
"java.configuration.updateBuildConfiguration": "automatic" |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
<groupId>triangle.tools</groupId> |
||||||
|
<artifactId>triangle-disassembler</artifactId> |
||||||
|
<version>2.1</version> |
||||||
|
<parent> |
||||||
|
<groupId>triangle.tools</groupId> |
||||||
|
<artifactId>triangle-tools</artifactId> |
||||||
|
<version>2.1</version> |
||||||
|
<relativePath>../</relativePath> |
||||||
|
</parent> |
||||||
|
<dependencies> |
||||||
|
<dependency> |
||||||
|
<groupId>triangle.tools</groupId> |
||||||
|
<artifactId>triangle-abstractmachine</artifactId> |
||||||
|
<version>2.1</version> |
||||||
|
</dependency> |
||||||
|
</dependencies> |
||||||
|
</project> |
@ -0,0 +1,398 @@ |
|||||||
|
/* |
||||||
|
* @(#)Disassembler.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.AbstractMachine; |
||||||
|
|
||||||
|
import java.io.DataInputStream; |
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.FileNotFoundException; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* Disassembles the TAM code in the given file, and displays the |
||||||
|
* instructions on standard output. |
||||||
|
* |
||||||
|
* For example: |
||||||
|
* |
||||||
|
* <pre> |
||||||
|
* java TAM.Disassembler obj.tam |
||||||
|
* </pre> |
||||||
|
* |
||||||
|
* <p> |
||||||
|
* Copyright 1991 David A. Watt, University of Glasgow<br> |
||||||
|
* Copyright 1998 Deryck F. Brown, The Robert Gordon University<br> |
||||||
|
* </p> |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
public class Disassembler { |
||||||
|
|
||||||
|
static String objectName; |
||||||
|
|
||||||
|
static int CT; |
||||||
|
|
||||||
|
/** |
||||||
|
* Writes the r-field of an instruction in the form "l<I>reg</I>r", where |
||||||
|
* l and r are the bracket characters to use. |
||||||
|
* |
||||||
|
* @param leftbracket the character to print before the register. |
||||||
|
* @param r the number of the register. |
||||||
|
* @param rightbracket the character to print after the register. |
||||||
|
*/ |
||||||
|
private static void writeR(char leftbracket, int r, char rightbracket) { |
||||||
|
|
||||||
|
System.out.print(leftbracket); |
||||||
|
switch (r) { |
||||||
|
case Machine.CBr: |
||||||
|
System.out.print("CB"); |
||||||
|
break; |
||||||
|
case Machine.CTr: |
||||||
|
System.out.print("CT"); |
||||||
|
break; |
||||||
|
case Machine.PBr: |
||||||
|
System.out.print("PB"); |
||||||
|
break; |
||||||
|
case Machine.PTr: |
||||||
|
System.out.print("PT"); |
||||||
|
break; |
||||||
|
case Machine.SBr: |
||||||
|
System.out.print("SB"); |
||||||
|
break; |
||||||
|
case Machine.STr: |
||||||
|
System.out.print("ST"); |
||||||
|
break; |
||||||
|
case Machine.HBr: |
||||||
|
System.out.print("HB"); |
||||||
|
break; |
||||||
|
case Machine.HTr: |
||||||
|
System.out.print("HT"); |
||||||
|
break; |
||||||
|
case Machine.LBr: |
||||||
|
System.out.print("LB"); |
||||||
|
break; |
||||||
|
case Machine.L1r: |
||||||
|
System.out.print("L1"); |
||||||
|
break; |
||||||
|
case Machine.L2r: |
||||||
|
System.out.print("L2"); |
||||||
|
break; |
||||||
|
case Machine.L3r: |
||||||
|
System.out.print("L3"); |
||||||
|
break; |
||||||
|
case Machine.L4r: |
||||||
|
System.out.print("L4"); |
||||||
|
break; |
||||||
|
case Machine.L5r: |
||||||
|
System.out.print("L5"); |
||||||
|
break; |
||||||
|
case Machine.L6r: |
||||||
|
System.out.print("L6"); |
||||||
|
break; |
||||||
|
case Machine.CPr: |
||||||
|
System.out.print("CP"); |
||||||
|
break; |
||||||
|
} |
||||||
|
System.out.print(rightbracket); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Writes a void n-field of an instruction. |
||||||
|
*/ |
||||||
|
private static void blankN() { |
||||||
|
System.out.print(" "); |
||||||
|
} |
||||||
|
|
||||||
|
// Writes the n-field of an instruction.
|
||||||
|
/** |
||||||
|
* Writes the n-field of an instruction in the form "(n)". |
||||||
|
* |
||||||
|
* @param n the integer to write. |
||||||
|
*/ |
||||||
|
private static void writeN(int n) { |
||||||
|
System.out.print("(" + n + ") "); |
||||||
|
if (n < 10) |
||||||
|
System.out.print(" "); |
||||||
|
else if (n < 100) |
||||||
|
System.out.print(" "); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Writes the d-field of an instruction. |
||||||
|
* |
||||||
|
* @param d the integer to write. |
||||||
|
*/ |
||||||
|
private static void writeD(int d) { |
||||||
|
System.out.print(d); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Writes the name of primitive routine with relative address d. |
||||||
|
* |
||||||
|
* @param d the displacment of the primitive routine. |
||||||
|
*/ |
||||||
|
private static void writePrimitive(int d) { |
||||||
|
switch (d) { |
||||||
|
case Machine.idDisplacement: |
||||||
|
System.out.print("id "); |
||||||
|
break; |
||||||
|
case Machine.notDisplacement: |
||||||
|
System.out.print("not "); |
||||||
|
break; |
||||||
|
case Machine.andDisplacement: |
||||||
|
System.out.print("and "); |
||||||
|
break; |
||||||
|
case Machine.orDisplacement: |
||||||
|
System.out.print("or "); |
||||||
|
break; |
||||||
|
case Machine.succDisplacement: |
||||||
|
System.out.print("succ "); |
||||||
|
break; |
||||||
|
case Machine.predDisplacement: |
||||||
|
System.out.print("pred "); |
||||||
|
break; |
||||||
|
case Machine.negDisplacement: |
||||||
|
System.out.print("neg "); |
||||||
|
break; |
||||||
|
case Machine.addDisplacement: |
||||||
|
System.out.print("add "); |
||||||
|
break; |
||||||
|
case Machine.subDisplacement: |
||||||
|
System.out.print("sub "); |
||||||
|
break; |
||||||
|
case Machine.multDisplacement: |
||||||
|
System.out.print("mult "); |
||||||
|
break; |
||||||
|
case Machine.divDisplacement: |
||||||
|
System.out.print("div "); |
||||||
|
break; |
||||||
|
case Machine.modDisplacement: |
||||||
|
System.out.print("mod "); |
||||||
|
break; |
||||||
|
case Machine.ltDisplacement: |
||||||
|
System.out.print("lt "); |
||||||
|
break; |
||||||
|
case Machine.leDisplacement: |
||||||
|
System.out.print("le "); |
||||||
|
break; |
||||||
|
case Machine.geDisplacement: |
||||||
|
System.out.print("ge "); |
||||||
|
break; |
||||||
|
case Machine.gtDisplacement: |
||||||
|
System.out.print("gt "); |
||||||
|
break; |
||||||
|
case Machine.eqDisplacement: |
||||||
|
System.out.print("eq "); |
||||||
|
break; |
||||||
|
case Machine.neDisplacement: |
||||||
|
System.out.print("ne "); |
||||||
|
break; |
||||||
|
case Machine.eolDisplacement: |
||||||
|
System.out.print("eol "); |
||||||
|
break; |
||||||
|
case Machine.eofDisplacement: |
||||||
|
System.out.print("eof "); |
||||||
|
break; |
||||||
|
case Machine.getDisplacement: |
||||||
|
System.out.print("get "); |
||||||
|
break; |
||||||
|
case Machine.putDisplacement: |
||||||
|
System.out.print("put "); |
||||||
|
break; |
||||||
|
case Machine.geteolDisplacement: |
||||||
|
System.out.print("geteol "); |
||||||
|
break; |
||||||
|
case Machine.puteolDisplacement: |
||||||
|
System.out.print("puteol "); |
||||||
|
break; |
||||||
|
case Machine.getintDisplacement: |
||||||
|
System.out.print("getint "); |
||||||
|
break; |
||||||
|
case Machine.putintDisplacement: |
||||||
|
System.out.print("putint "); |
||||||
|
break; |
||||||
|
case Machine.newDisplacement: |
||||||
|
System.out.print("new "); |
||||||
|
break; |
||||||
|
case Machine.disposeDisplacement: |
||||||
|
System.out.print("dispose "); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Writes the given instruction in assembly-code format. |
||||||
|
* |
||||||
|
* @param instr the instruction to display. |
||||||
|
*/ |
||||||
|
private static void writeInstruction(Instruction instr) { |
||||||
|
|
||||||
|
switch (instr.op) { |
||||||
|
case Machine.LOADop: |
||||||
|
System.out.print("LOAD "); |
||||||
|
writeN(instr.n); |
||||||
|
writeD(instr.d); |
||||||
|
writeR('[', instr.r, ']'); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.LOADAop: |
||||||
|
System.out.print("LOADA "); |
||||||
|
blankN(); |
||||||
|
writeD(instr.d); |
||||||
|
writeR('[', instr.r, ']'); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.LOADIop: |
||||||
|
System.out.print("LOADI "); |
||||||
|
writeN(instr.n); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.LOADLop: |
||||||
|
System.out.print("LOADL "); |
||||||
|
blankN(); |
||||||
|
writeD(instr.d); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.STOREop: |
||||||
|
System.out.print("STORE "); |
||||||
|
writeN(instr.n); |
||||||
|
writeD(instr.d); |
||||||
|
writeR('[', instr.r, ']'); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.STOREIop: |
||||||
|
System.out.print("STOREI"); |
||||||
|
writeN(instr.n); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.CALLop: |
||||||
|
System.out.print("CALL "); |
||||||
|
if (instr.r == Machine.PBr) { |
||||||
|
blankN(); |
||||||
|
writePrimitive(instr.d); |
||||||
|
} else { |
||||||
|
writeR('(', instr.n, ')'); |
||||||
|
System.out.print(" "); |
||||||
|
writeD(instr.d); |
||||||
|
writeR('[', instr.r, ']'); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.CALLIop: |
||||||
|
System.out.print("CALLI "); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.RETURNop: |
||||||
|
System.out.print("RETURN"); |
||||||
|
writeN(instr.n); |
||||||
|
writeD(instr.d); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.PUSHop: |
||||||
|
System.out.print("PUSH "); |
||||||
|
blankN(); |
||||||
|
writeD(instr.d); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.POPop: |
||||||
|
System.out.print("POP "); |
||||||
|
writeN(instr.n); |
||||||
|
writeD(instr.d); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.JUMPop: |
||||||
|
System.out.print("JUMP "); |
||||||
|
blankN(); |
||||||
|
writeD(instr.d); |
||||||
|
writeR('[', instr.r, ']'); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.JUMPIop: |
||||||
|
System.out.print("JUMPI "); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.JUMPIFop: |
||||||
|
System.out.print("JUMPIF"); |
||||||
|
writeN(instr.n); |
||||||
|
writeD(instr.d); |
||||||
|
writeR('[', instr.r, ']'); |
||||||
|
break; |
||||||
|
|
||||||
|
case Machine.HALTop: |
||||||
|
System.out.print("HALT "); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Writes all instructions of the program in code store. |
||||||
|
*/ |
||||||
|
private static void disassembleProgram() { |
||||||
|
for (int addr = Machine.CB; addr < CT; addr++) { |
||||||
|
System.out.print(addr + ": "); |
||||||
|
writeInstruction(Machine.code[addr]); |
||||||
|
System.out.println(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// LOADING
|
||||||
|
|
||||||
|
/** |
||||||
|
* Loads the TAM object program into code store from the named file. |
||||||
|
* |
||||||
|
* @param objectName the name of the file containing the program. |
||||||
|
*/ |
||||||
|
static void loadObjectProgram(String objectName) { |
||||||
|
|
||||||
|
FileInputStream objectFile = null; |
||||||
|
DataInputStream objectStream = null; |
||||||
|
|
||||||
|
int addr; |
||||||
|
boolean finished = false; |
||||||
|
|
||||||
|
try { |
||||||
|
objectFile = new FileInputStream(objectName); |
||||||
|
objectStream = new DataInputStream(objectFile); |
||||||
|
|
||||||
|
addr = Machine.CB; |
||||||
|
while (!finished) { |
||||||
|
Machine.code[addr] = Instruction.read(objectStream); |
||||||
|
if (Machine.code[addr] == null) |
||||||
|
finished = true; |
||||||
|
else |
||||||
|
addr = addr + 1; |
||||||
|
} |
||||||
|
CT = addr; |
||||||
|
objectFile.close(); |
||||||
|
} catch (FileNotFoundException s) { |
||||||
|
CT = Machine.CB; |
||||||
|
System.err.println("Error opening object file: " + s); |
||||||
|
} catch (IOException s) { |
||||||
|
CT = Machine.CB; |
||||||
|
System.err.println("Error reading object file: " + s); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// DISASSEMBLE
|
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
System.out.println("********** TAM Disassembler (Sun Version 2.1) **********"); |
||||||
|
|
||||||
|
if (args.length == 1) |
||||||
|
objectName = args[0]; |
||||||
|
else |
||||||
|
objectName = "obj.tam"; |
||||||
|
|
||||||
|
loadObjectProgram(objectName); |
||||||
|
disassembleProgram(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
<groupId>triangle.tools</groupId> |
||||||
|
<artifactId>triangle-interpreter</artifactId> |
||||||
|
<version>2.1</version> |
||||||
|
<parent> |
||||||
|
<groupId>triangle.tools</groupId> |
||||||
|
<artifactId>triangle-tools</artifactId> |
||||||
|
<version>2.1</version> |
||||||
|
<relativePath>../</relativePath> |
||||||
|
</parent> |
||||||
|
<dependencies> |
||||||
|
<dependency> |
||||||
|
<groupId>triangle.tools</groupId> |
||||||
|
<artifactId>triangle-abstractmachine</artifactId> |
||||||
|
<version>2.1</version> |
||||||
|
</dependency> |
||||||
|
</dependencies> |
||||||
|
</project> |
@ -0,0 +1,620 @@ |
|||||||
|
/* |
||||||
|
* @(#)Interpreter.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.AbstractMachine; |
||||||
|
|
||||||
|
import java.io.DataInputStream; |
||||||
|
import java.io.FileInputStream; |
||||||
|
import java.io.FileNotFoundException; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class Interpreter { |
||||||
|
|
||||||
|
static String objectName; |
||||||
|
|
||||||
|
// DATA STORE
|
||||||
|
|
||||||
|
static int[] data = new int[1024]; |
||||||
|
|
||||||
|
// DATA STORE REGISTERS AND OTHER REGISTERS
|
||||||
|
|
||||||
|
final static int CB = 0, |
||||||
|
SB = 0, |
||||||
|
HB = 1024; // = upper bound of data array + 1
|
||||||
|
|
||||||
|
static int CT, CP, ST, HT, LB, status; |
||||||
|
|
||||||
|
// status values
|
||||||
|
final static int running = 0, halted = 1, failedDataStoreFull = 2, failedInvalidCodeAddress = 3, |
||||||
|
failedInvalidInstruction = 4, failedOverflow = 5, failedZeroDivide = 6, |
||||||
|
failedIOError = 7; |
||||||
|
|
||||||
|
static long accumulator; |
||||||
|
|
||||||
|
static int content(int r) { |
||||||
|
// Returns the current content of register r,
|
||||||
|
// even if r is one of the pseudo-registers L1..L6.
|
||||||
|
|
||||||
|
switch (r) { |
||||||
|
case Machine.CBr: |
||||||
|
return CB; |
||||||
|
case Machine.CTr: |
||||||
|
return CT; |
||||||
|
case Machine.PBr: |
||||||
|
return Machine.PB; |
||||||
|
case Machine.PTr: |
||||||
|
return Machine.PT; |
||||||
|
case Machine.SBr: |
||||||
|
return SB; |
||||||
|
case Machine.STr: |
||||||
|
return ST; |
||||||
|
case Machine.HBr: |
||||||
|
return HB; |
||||||
|
case Machine.HTr: |
||||||
|
return HT; |
||||||
|
case Machine.LBr: |
||||||
|
return LB; |
||||||
|
case Machine.L1r: |
||||||
|
return data[LB]; |
||||||
|
case Machine.L2r: |
||||||
|
return data[data[LB]]; |
||||||
|
case Machine.L3r: |
||||||
|
return data[data[data[LB]]]; |
||||||
|
case Machine.L4r: |
||||||
|
return data[data[data[data[LB]]]]; |
||||||
|
case Machine.L5r: |
||||||
|
return data[data[data[data[data[LB]]]]]; |
||||||
|
case Machine.L6r: |
||||||
|
return data[data[data[data[data[data[LB]]]]]]; |
||||||
|
case Machine.CPr: |
||||||
|
return CP; |
||||||
|
default: |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// PROGRAM STATUS
|
||||||
|
|
||||||
|
static void dump() { |
||||||
|
// Writes a summary of the machine state.
|
||||||
|
int addr, staticLink, dynamicLink, |
||||||
|
localRegNum; |
||||||
|
|
||||||
|
System.out.println(""); |
||||||
|
System.out.println("State of data store and registers:"); |
||||||
|
System.out.println(""); |
||||||
|
if (HT == HB) |
||||||
|
System.out.println(" |--------| (heap is empty)"); |
||||||
|
else { |
||||||
|
System.out.println(" HB-->"); |
||||||
|
System.out.println(" |--------|"); |
||||||
|
for (addr = HB - 1; addr >= HT; addr--) { |
||||||
|
System.out.print(addr + ":"); |
||||||
|
if (addr == HT) |
||||||
|
System.out.print(" HT-->"); |
||||||
|
else |
||||||
|
System.out.print(" "); |
||||||
|
System.out.println("|" + data[addr] + "|"); |
||||||
|
} |
||||||
|
System.out.println(" |--------|"); |
||||||
|
} |
||||||
|
System.out.println(" |////////|"); |
||||||
|
System.out.println(" |////////|"); |
||||||
|
if (ST == SB) |
||||||
|
System.out.println(" |--------| (stack is empty)"); |
||||||
|
else { |
||||||
|
dynamicLink = LB; |
||||||
|
staticLink = LB; |
||||||
|
localRegNum = Machine.LBr; |
||||||
|
System.out.println(" ST--> |////////|"); |
||||||
|
System.out.println(" |--------|"); |
||||||
|
for (addr = ST - 1; addr >= SB; addr--) { |
||||||
|
System.out.print(addr + ":"); |
||||||
|
if (addr == SB) |
||||||
|
System.out.print(" SB-->"); |
||||||
|
else if (addr == staticLink) { |
||||||
|
switch (localRegNum) { |
||||||
|
case Machine.LBr: |
||||||
|
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; |
||||||
|
} |
||||||
|
staticLink = data[addr]; |
||||||
|
localRegNum = localRegNum + 1; |
||||||
|
} else |
||||||
|
System.out.print(" "); |
||||||
|
if ((addr == dynamicLink) && (dynamicLink != SB)) |
||||||
|
System.out.print("|SL=" + data[addr] + "|"); |
||||||
|
else if ((addr == dynamicLink + 1) && (dynamicLink != SB)) |
||||||
|
System.out.print("|DL=" + data[addr] + "|"); |
||||||
|
else if ((addr == dynamicLink + 2) && (dynamicLink != SB)) |
||||||
|
System.out.print("|RA=" + data[addr] + "|"); |
||||||
|
else |
||||||
|
System.out.print("|" + data[addr] + "|"); |
||||||
|
System.out.println(""); |
||||||
|
if (addr == dynamicLink) { |
||||||
|
System.out.println(" |--------|"); |
||||||
|
dynamicLink = data[addr + 1]; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
System.out.println(""); |
||||||
|
} |
||||||
|
|
||||||
|
static void showStatus() { |
||||||
|
// Writes an indication of whether and why the program has terminated.
|
||||||
|
System.out.println(""); |
||||||
|
switch (status) { |
||||||
|
case running: |
||||||
|
System.out.println("Program is running."); |
||||||
|
break; |
||||||
|
case halted: |
||||||
|
System.out.println("Program has halted normally."); |
||||||
|
break; |
||||||
|
case failedDataStoreFull: |
||||||
|
System.out.println("Program has failed due to exhaustion of Data Store."); |
||||||
|
break; |
||||||
|
case failedInvalidCodeAddress: |
||||||
|
System.out.println("Program has failed due to an invalid code address."); |
||||||
|
break; |
||||||
|
case failedInvalidInstruction: |
||||||
|
System.out.println("Program has failed due to an invalid instruction."); |
||||||
|
break; |
||||||
|
case failedOverflow: |
||||||
|
System.out.println("Program has failed due to overflow."); |
||||||
|
break; |
||||||
|
case failedZeroDivide: |
||||||
|
System.out.println("Program has failed due to division by zero."); |
||||||
|
break; |
||||||
|
case failedIOError: |
||||||
|
System.out.println("Program has failed due to an IO error."); |
||||||
|
break; |
||||||
|
} |
||||||
|
if (status != halted) |
||||||
|
dump(); |
||||||
|
} |
||||||
|
|
||||||
|
// INTERPRETATION
|
||||||
|
|
||||||
|
static void checkSpace(int spaceNeeded) { |
||||||
|
// Signals failure if there is not enough space to expand the stack or
|
||||||
|
// heap by spaceNeeded.
|
||||||
|
|
||||||
|
if (HT - ST < spaceNeeded) |
||||||
|
status = failedDataStoreFull; |
||||||
|
} |
||||||
|
|
||||||
|
static boolean isTrue(int datum) { |
||||||
|
// Tests whether the given datum represents true.
|
||||||
|
return (datum == Machine.trueRep); |
||||||
|
} |
||||||
|
|
||||||
|
static boolean equal(int size, int addr1, int addr2) { |
||||||
|
// Tests whether two multi-word objects are equal, given their common
|
||||||
|
// size and their base addresses.
|
||||||
|
|
||||||
|
boolean eq; |
||||||
|
int index; |
||||||
|
|
||||||
|
eq = true; |
||||||
|
index = 0; |
||||||
|
while (eq && (index < size)) |
||||||
|
if (data[addr1 + index] == data[addr2 + index]) |
||||||
|
index = index + 1; |
||||||
|
else |
||||||
|
eq = false; |
||||||
|
return eq; |
||||||
|
} |
||||||
|
|
||||||
|
static int overflowChecked(long datum) { |
||||||
|
// Signals failure if the datum is too large to fit into a single word,
|
||||||
|
// otherwise returns the datum as a single word.
|
||||||
|
|
||||||
|
if ((-Machine.maxintRep <= datum) && (datum <= Machine.maxintRep)) |
||||||
|
return (int) datum; |
||||||
|
else { |
||||||
|
status = failedOverflow; |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static int toInt(boolean b) { |
||||||
|
return b ? Machine.trueRep : Machine.falseRep; |
||||||
|
} |
||||||
|
|
||||||
|
static int currentChar; |
||||||
|
|
||||||
|
static int readInt() throws java.io.IOException { |
||||||
|
int temp = 0; |
||||||
|
int sign = 1; |
||||||
|
|
||||||
|
do { |
||||||
|
currentChar = System.in.read(); |
||||||
|
} while (Character.isWhitespace((char) currentChar)); |
||||||
|
|
||||||
|
if ((currentChar == '-') || (currentChar == '+')) |
||||||
|
do { |
||||||
|
sign = (currentChar == '-') ? -1 : 1; |
||||||
|
currentChar = System.in.read(); |
||||||
|
} while ((currentChar == '-') || currentChar == '+'); |
||||||
|
|
||||||
|
if (Character.isDigit((char) currentChar)) |
||||||
|
do { |
||||||
|
temp = temp * 10 + (currentChar - '0'); |
||||||
|
currentChar = System.in.read(); |
||||||
|
} while (Character.isDigit((char) currentChar)); |
||||||
|
|
||||||
|
return sign * temp; |
||||||
|
} |
||||||
|
|
||||||
|
static void callPrimitive(int primitiveDisplacement) { |
||||||
|
// Invokes the given primitive routine.
|
||||||
|
|
||||||
|
int addr, size; |
||||||
|
char ch; |
||||||
|
|
||||||
|
switch (primitiveDisplacement) { |
||||||
|
case Machine.idDisplacement: |
||||||
|
break; // nothing to be done
|
||||||
|
case Machine.notDisplacement: |
||||||
|
data[ST - 1] = toInt(!isTrue(data[ST - 1])); |
||||||
|
break; |
||||||
|
case Machine.andDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
data[ST - 1] = toInt(isTrue(data[ST - 1]) & isTrue(data[ST])); |
||||||
|
break; |
||||||
|
case Machine.orDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
data[ST - 1] = toInt(isTrue(data[ST - 1]) | isTrue(data[ST])); |
||||||
|
break; |
||||||
|
case Machine.succDisplacement: |
||||||
|
data[ST - 1] = overflowChecked(data[ST - 1] + 1); |
||||||
|
break; |
||||||
|
case Machine.predDisplacement: |
||||||
|
data[ST - 1] = overflowChecked(data[ST - 1] - 1); |
||||||
|
break; |
||||||
|
case Machine.negDisplacement: |
||||||
|
data[ST - 1] = -data[ST - 1]; |
||||||
|
break; |
||||||
|
case Machine.addDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
accumulator = data[ST - 1]; |
||||||
|
data[ST - 1] = overflowChecked(accumulator + data[ST]); |
||||||
|
break; |
||||||
|
case Machine.subDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
accumulator = data[ST - 1]; |
||||||
|
data[ST - 1] = overflowChecked(accumulator - data[ST]); |
||||||
|
break; |
||||||
|
case Machine.multDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
accumulator = data[ST - 1]; |
||||||
|
data[ST - 1] = overflowChecked(accumulator * data[ST]); |
||||||
|
break; |
||||||
|
case Machine.divDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
accumulator = data[ST - 1]; |
||||||
|
if (data[ST] != 0) |
||||||
|
data[ST - 1] = (int) (accumulator / data[ST]); |
||||||
|
else |
||||||
|
status = failedZeroDivide; |
||||||
|
break; |
||||||
|
case Machine.modDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
accumulator = data[ST - 1]; |
||||||
|
if (data[ST] != 0) |
||||||
|
data[ST - 1] = (int) (accumulator % data[ST]); |
||||||
|
else |
||||||
|
status = failedZeroDivide; |
||||||
|
break; |
||||||
|
case Machine.ltDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
data[ST - 1] = toInt(data[ST - 1] < data[ST]); |
||||||
|
break; |
||||||
|
case Machine.leDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
data[ST - 1] = toInt(data[ST - 1] <= data[ST]); |
||||||
|
break; |
||||||
|
case Machine.geDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
data[ST - 1] = toInt(data[ST - 1] >= data[ST]); |
||||||
|
break; |
||||||
|
case Machine.gtDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
data[ST - 1] = toInt(data[ST - 1] > data[ST]); |
||||||
|
break; |
||||||
|
case Machine.eqDisplacement: |
||||||
|
size = data[ST - 1]; // size of each comparand
|
||||||
|
ST = ST - 2 * size; |
||||||
|
data[ST - 1] = toInt(equal(size, ST - 1, ST - 1 + size)); |
||||||
|
break; |
||||||
|
case Machine.neDisplacement: |
||||||
|
size = data[ST - 1]; // size of each comparand
|
||||||
|
ST = ST - 2 * size; |
||||||
|
data[ST - 1] = toInt(!equal(size, ST - 1, ST - 1 + size)); |
||||||
|
break; |
||||||
|
case Machine.eolDisplacement: |
||||||
|
data[ST] = toInt(currentChar == '\n'); |
||||||
|
ST = ST + 1; |
||||||
|
break; |
||||||
|
case Machine.eofDisplacement: |
||||||
|
data[ST] = toInt(currentChar == -1); |
||||||
|
ST = ST + 1; |
||||||
|
break; |
||||||
|
case Machine.getDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
addr = data[ST]; |
||||||
|
try { |
||||||
|
currentChar = System.in.read(); |
||||||
|
} catch (java.io.IOException s) { |
||||||
|
status = failedIOError; |
||||||
|
} |
||||||
|
data[addr] = (int) currentChar; |
||||||
|
break; |
||||||
|
case Machine.putDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
ch = (char) data[ST]; |
||||||
|
System.out.print(ch); |
||||||
|
break; |
||||||
|
case Machine.geteolDisplacement: |
||||||
|
try { |
||||||
|
while ((currentChar = System.in.read()) != '\n') |
||||||
|
; |
||||||
|
} catch (java.io.IOException s) { |
||||||
|
status = failedIOError; |
||||||
|
} |
||||||
|
break; |
||||||
|
case Machine.puteolDisplacement: |
||||||
|
System.out.println(""); |
||||||
|
break; |
||||||
|
case Machine.getintDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
addr = data[ST]; |
||||||
|
try { |
||||||
|
accumulator = readInt(); |
||||||
|
} catch (java.io.IOException s) { |
||||||
|
status = failedIOError; |
||||||
|
} |
||||||
|
data[addr] = (int) accumulator; |
||||||
|
break; |
||||||
|
case Machine.putintDisplacement: |
||||||
|
ST = ST - 1; |
||||||
|
accumulator = data[ST]; |
||||||
|
System.out.print(accumulator); |
||||||
|
break; |
||||||
|
case Machine.newDisplacement: |
||||||
|
size = data[ST - 1]; |
||||||
|
checkSpace(size); |
||||||
|
HT = HT - size; |
||||||
|
data[ST - 1] = HT; |
||||||
|
break; |
||||||
|
case Machine.disposeDisplacement: |
||||||
|
ST = ST - 1; // no action taken at present
|
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static void interpretProgram() { |
||||||
|
// Runs the program in code store.
|
||||||
|
|
||||||
|
Instruction currentInstr; |
||||||
|
int op, r, n, d, addr, index; |
||||||
|
|
||||||
|
// Initialize registers ...
|
||||||
|
ST = SB; |
||||||
|
HT = HB; |
||||||
|
LB = SB; |
||||||
|
CP = CB; |
||||||
|
status = running; |
||||||
|
do { |
||||||
|
// Fetch instruction ...
|
||||||
|
currentInstr = Machine.code[CP]; |
||||||
|
// Decode instruction ...
|
||||||
|
op = currentInstr.op; |
||||||
|
r = currentInstr.r; |
||||||
|
n = currentInstr.n; |
||||||
|
d = currentInstr.d; |
||||||
|
// Execute instruction ...
|
||||||
|
switch (op) { |
||||||
|
case Machine.LOADop: |
||||||
|
addr = d + content(r); |
||||||
|
checkSpace(n); |
||||||
|
for (index = 0; index < n; index++) |
||||||
|
data[ST + index] = data[addr + index]; |
||||||
|
ST = ST + n; |
||||||
|
CP = CP + 1; |
||||||
|
break; |
||||||
|
case Machine.LOADAop: |
||||||
|
addr = d + content(r); |
||||||
|
checkSpace(1); |
||||||
|
data[ST] = addr; |
||||||
|
ST = ST + 1; |
||||||
|
CP = CP + 1; |
||||||
|
break; |
||||||
|
case Machine.LOADIop: |
||||||
|
ST = ST - 1; |
||||||
|
addr = data[ST]; |
||||||
|
checkSpace(n); |
||||||
|
for (index = 0; index < n; index++) |
||||||
|
data[ST + index] = data[addr + index]; |
||||||
|
ST = ST + n; |
||||||
|
CP = CP + 1; |
||||||
|
break; |
||||||
|
case Machine.LOADLop: |
||||||
|
checkSpace(1); |
||||||
|
data[ST] = d; |
||||||
|
ST = ST + 1; |
||||||
|
CP = CP + 1; |
||||||
|
break; |
||||||
|
case Machine.STOREop: |
||||||
|
addr = d + content(r); |
||||||
|
ST = ST - n; |
||||||
|
for (index = 0; index < n; index++) |
||||||
|
data[addr + index] = data[ST + index]; |
||||||
|
CP = CP + 1; |
||||||
|
break; |
||||||
|
case Machine.STOREIop: |
||||||
|
ST = ST - 1; |
||||||
|
addr = data[ST]; |
||||||
|
ST = ST - n; |
||||||
|
for (index = 0; index < n; index++) |
||||||
|
data[addr + index] = data[ST + index]; |
||||||
|
CP = CP + 1; |
||||||
|
break; |
||||||
|
case Machine.CALLop: |
||||||
|
addr = d + content(r); |
||||||
|
if (addr >= Machine.PB) { |
||||||
|
callPrimitive(addr - Machine.PB); |
||||||
|
CP = CP + 1; |
||||||
|
} else { |
||||||
|
checkSpace(3); |
||||||
|
if ((0 <= n) && (n <= 15)) |
||||||
|
data[ST] = content(n); // static link
|
||||||
|
else |
||||||
|
status = failedInvalidInstruction; |
||||||
|
data[ST + 1] = LB; // dynamic link
|
||||||
|
data[ST + 2] = CP + 1; // return address
|
||||||
|
LB = ST; |
||||||
|
ST = ST + 3; |
||||||
|
CP = addr; |
||||||
|
} |
||||||
|
break; |
||||||
|
case Machine.CALLIop: |
||||||
|
ST = ST - 2; |
||||||
|
addr = data[ST + 1]; |
||||||
|
if (addr >= Machine.PB) { |
||||||
|
callPrimitive(addr - Machine.PB); |
||||||
|
CP = CP + 1; |
||||||
|
} else { |
||||||
|
// data[ST] = static link already
|
||||||
|
data[ST + 1] = LB; // dynamic link
|
||||||
|
data[ST + 2] = CP + 1; // return address
|
||||||
|
LB = ST; |
||||||
|
ST = ST + 3; |
||||||
|
CP = addr; |
||||||
|
} |
||||||
|
break; |
||||||
|
case Machine.RETURNop: |
||||||
|
addr = LB - d; |
||||||
|
CP = data[LB + 2]; |
||||||
|
LB = data[LB + 1]; |
||||||
|
ST = ST - n; |
||||||
|
for (index = 0; index < n; index++) |
||||||
|
data[addr + index] = data[ST + index]; |
||||||
|
ST = addr + n; |
||||||
|
break; |
||||||
|
case Machine.PUSHop: |
||||||
|
checkSpace(d); |
||||||
|
ST = ST + d; |
||||||
|
CP = CP + 1; |
||||||
|
break; |
||||||
|
case Machine.POPop: |
||||||
|
addr = ST - n - d; |
||||||
|
ST = ST - n; |
||||||
|
for (index = 0; index < n; index++) |
||||||
|
data[addr + index] = data[ST + index]; |
||||||
|
ST = addr + n; |
||||||
|
CP = CP + 1; |
||||||
|
break; |
||||||
|
case Machine.JUMPop: |
||||||
|
CP = d + content(r); |
||||||
|
break; |
||||||
|
case Machine.JUMPIop: |
||||||
|
ST = ST - 1; |
||||||
|
CP = data[ST]; |
||||||
|
break; |
||||||
|
case Machine.JUMPIFop: |
||||||
|
ST = ST - 1; |
||||||
|
if (data[ST] == n) |
||||||
|
CP = d + content(r); |
||||||
|
else |
||||||
|
CP = CP + 1; |
||||||
|
break; |
||||||
|
case Machine.HALTop: |
||||||
|
status = halted; |
||||||
|
break; |
||||||
|
} |
||||||
|
if ((CP < CB) || (CP >= CT)) |
||||||
|
status = failedInvalidCodeAddress; |
||||||
|
} while (status == running); |
||||||
|
} |
||||||
|
|
||||||
|
// LOADING
|
||||||
|
|
||||||
|
static void loadObjectProgram(String objectName) { |
||||||
|
// Loads the TAM object program into code store from the named file.
|
||||||
|
|
||||||
|
FileInputStream objectFile = null; |
||||||
|
DataInputStream objectStream = null; |
||||||
|
|
||||||
|
int addr; |
||||||
|
boolean finished = false; |
||||||
|
|
||||||
|
try { |
||||||
|
objectFile = new FileInputStream(objectName); |
||||||
|
objectStream = new DataInputStream(objectFile); |
||||||
|
|
||||||
|
addr = Machine.CB; |
||||||
|
while (!finished) { |
||||||
|
Machine.code[addr] = Instruction.read(objectStream); |
||||||
|
if (Machine.code[addr] == null) |
||||||
|
finished = true; |
||||||
|
else |
||||||
|
addr = addr + 1; |
||||||
|
} |
||||||
|
CT = addr; |
||||||
|
objectFile.close(); |
||||||
|
} catch (FileNotFoundException s) { |
||||||
|
CT = CB; |
||||||
|
System.err.println("Error opening object file: " + s); |
||||||
|
} catch (IOException s) { |
||||||
|
CT = CB; |
||||||
|
System.err.println("Error reading object file: " + s); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// RUNNING
|
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
System.out.println("********** TAM Interpreter (Java Version 2.1) **********"); |
||||||
|
|
||||||
|
if (args.length == 1) |
||||||
|
objectName = args[0]; |
||||||
|
else |
||||||
|
objectName = "obj.tam"; |
||||||
|
|
||||||
|
loadObjectProgram(objectName); |
||||||
|
if (CT != CB) { |
||||||
|
interpretProgram(); |
||||||
|
showStatus(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
<groupId>triangle.tools</groupId> |
||||||
|
<artifactId>triangle-abstractmachine</artifactId> |
||||||
|
<version>2.1</version> |
||||||
|
<packaging>jar</packaging> |
||||||
|
<parent> |
||||||
|
<groupId>triangle.tools</groupId> |
||||||
|
<artifactId>triangle-tools</artifactId> |
||||||
|
<version>2.1</version> |
||||||
|
<relativePath>../</relativePath> |
||||||
|
</parent> |
||||||
|
</project> |
@ -0,0 +1,64 @@ |
|||||||
|
/* |
||||||
|
* @(#)Instruction.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.AbstractMachine; |
||||||
|
|
||||||
|
import java.io.DataInputStream; |
||||||
|
import java.io.DataOutputStream; |
||||||
|
import java.io.EOFException; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class Instruction { |
||||||
|
|
||||||
|
public Instruction() { |
||||||
|
op = 0; |
||||||
|
r = 0; |
||||||
|
n = 0; |
||||||
|
d = 0; |
||||||
|
} |
||||||
|
|
||||||
|
// Java has no type synonyms, so the following representations are
|
||||||
|
// assumed:
|
||||||
|
//
|
||||||
|
// type
|
||||||
|
// OpCode = 0..15; {4 bits unsigned}
|
||||||
|
// Length = 0..255; {8 bits unsigned}
|
||||||
|
// Operand = -32767..+32767; {16 bits signed}
|
||||||
|
|
||||||
|
// Represents TAM instructions.
|
||||||
|
public int op; // OpCode
|
||||||
|
public int r; // RegisterNumber
|
||||||
|
public int n; // Length
|
||||||
|
public int d; // Operand
|
||||||
|
|
||||||
|
public void write(DataOutputStream output) throws IOException { |
||||||
|
output.writeInt(op); |
||||||
|
output.writeInt(r); |
||||||
|
output.writeInt(n); |
||||||
|
output.writeInt(d); |
||||||
|
} |
||||||
|
|
||||||
|
public static Instruction read(DataInputStream input) throws IOException { |
||||||
|
Instruction inst = new Instruction(); |
||||||
|
try { |
||||||
|
inst.op = input.readInt(); |
||||||
|
inst.r = input.readInt(); |
||||||
|
inst.n = input.readInt(); |
||||||
|
inst.d = input.readInt(); |
||||||
|
return inst; |
||||||
|
} catch (EOFException s) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,125 @@ |
|||||||
|
/* |
||||||
|
* @(#)Machine.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.AbstractMachine; |
||||||
|
|
||||||
|
public final class Machine { |
||||||
|
|
||||||
|
public final static int maxRoutineLevel = 7; |
||||||
|
|
||||||
|
// WORDS AND ADDRESSES
|
||||||
|
|
||||||
|
// Java has no type synonyms, so the following representations are
|
||||||
|
// assumed:
|
||||||
|
//
|
||||||
|
// type
|
||||||
|
// Word = -32767..+32767; {16 bits signed}
|
||||||
|
// DoubleWord = -2147483648..+2147483647; {32 bits signed}
|
||||||
|
// CodeAddress = 0..+32767; {15 bits unsigned}
|
||||||
|
// DataAddress = 0..+32767; {15 bits unsigned}
|
||||||
|
|
||||||
|
// INSTRUCTIONS
|
||||||
|
|
||||||
|
// Operation codes
|
||||||
|
public final static int LOADop = 0, |
||||||
|
LOADAop = 1, |
||||||
|
LOADIop = 2, |
||||||
|
LOADLop = 3, |
||||||
|
STOREop = 4, |
||||||
|
STOREIop = 5, |
||||||
|
CALLop = 6, |
||||||
|
CALLIop = 7, |
||||||
|
RETURNop = 8, |
||||||
|
PUSHop = 10, |
||||||
|
POPop = 11, |
||||||
|
JUMPop = 12, |
||||||
|
JUMPIop = 13, |
||||||
|
JUMPIFop = 14, |
||||||
|
HALTop = 15; |
||||||
|
|
||||||
|
// CODE STORE
|
||||||
|
|
||||||
|
public static Instruction[] code = new Instruction[1024]; |
||||||
|
|
||||||
|
// CODE STORE REGISTERS
|
||||||
|
|
||||||
|
public final static int CB = 0, |
||||||
|
PB = 1024, // = upper bound of code array + 1
|
||||||
|
PT = 1052; // = PB + 28
|
||||||
|
|
||||||
|
// REGISTER NUMBERS
|
||||||
|
|
||||||
|
public final static int CBr = 0, |
||||||
|
CTr = 1, |
||||||
|
PBr = 2, |
||||||
|
PTr = 3, |
||||||
|
SBr = 4, |
||||||
|
STr = 5, |
||||||
|
HBr = 6, |
||||||
|
HTr = 7, |
||||||
|
LBr = 8, |
||||||
|
L1r = LBr + 1, |
||||||
|
L2r = LBr + 2, |
||||||
|
L3r = LBr + 3, |
||||||
|
L4r = LBr + 4, |
||||||
|
L5r = LBr + 5, |
||||||
|
L6r = LBr + 6, |
||||||
|
CPr = 15; |
||||||
|
|
||||||
|
// DATA REPRESENTATION
|
||||||
|
|
||||||
|
public final static int booleanSize = 1, |
||||||
|
characterSize = 1, |
||||||
|
integerSize = 1, |
||||||
|
addressSize = 1, |
||||||
|
closureSize = 2 * addressSize, |
||||||
|
|
||||||
|
linkDataSize = 3 * addressSize, |
||||||
|
|
||||||
|
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,2 @@ |
|||||||
|
c:\Java\Repos\Triangle-Tools\Triangle.AbstractMachine\src\main\java\Triangle\AbstractMachine\Machine.java |
||||||
|
c:\Java\Repos\Triangle-Tools\Triangle.AbstractMachine\src\main\java\Triangle\AbstractMachine\Instruction.java |
@ -0,0 +1,17 @@ |
|||||||
|
# Editor configuration, see http://editorconfig.org |
||||||
|
root = true |
||||||
|
|
||||||
|
[*] |
||||||
|
charset = utf-8 |
||||||
|
indent_style = space |
||||||
|
indent_size = 2 |
||||||
|
insert_final_newline = true |
||||||
|
trim_trailing_whitespace = true |
||||||
|
max_line_length = 80 |
||||||
|
|
||||||
|
[*.sh] |
||||||
|
end_of_line = lf |
||||||
|
|
||||||
|
[*.java] |
||||||
|
indent_size = 4 |
||||||
|
max_line_length = 120 |
@ -0,0 +1,20 @@ |
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
<groupId>triangle.tools</groupId> |
||||||
|
<artifactId>triangle-compiler</artifactId> |
||||||
|
<version>2.1</version> |
||||||
|
<parent> |
||||||
|
<groupId>triangle.tools</groupId> |
||||||
|
<artifactId>triangle-tools</artifactId> |
||||||
|
<version>2.1</version> |
||||||
|
<relativePath>../</relativePath> |
||||||
|
</parent> |
||||||
|
<dependencies> |
||||||
|
<dependency> |
||||||
|
<groupId>triangle.tools</groupId> |
||||||
|
<artifactId>triangle-abstractmachine</artifactId> |
||||||
|
<version>2.1</version> |
||||||
|
</dependency> |
||||||
|
</dependencies> |
||||||
|
</project> |
@ -0,0 +1,35 @@ |
|||||||
|
/* |
||||||
|
* @(#)AST.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; |
||||||
|
|
||||||
|
import Triangle.CodeGenerator.RuntimeEntity; |
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class AST { |
||||||
|
|
||||||
|
public AST(SourcePosition thePosition) { |
||||||
|
position = thePosition; |
||||||
|
entity = null; |
||||||
|
} |
||||||
|
|
||||||
|
public SourcePosition getPosition() { |
||||||
|
return position; |
||||||
|
} |
||||||
|
|
||||||
|
public abstract Object visit(Visitor v, Object o); |
||||||
|
|
||||||
|
public SourcePosition position; |
||||||
|
public RuntimeEntity entity; |
||||||
|
} |
@ -0,0 +1,24 @@ |
|||||||
|
/* |
||||||
|
* @(#)ActualParameter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class ActualParameter extends AST { |
||||||
|
|
||||||
|
public ActualParameter(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,24 @@ |
|||||||
|
/* |
||||||
|
* @(#)ActualParameterSequence.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class ActualParameterSequence extends AST { |
||||||
|
|
||||||
|
public ActualParameterSequence(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
/* |
||||||
|
* @(#)AnyTypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class AnyTypeDenoter extends TypeDenoter { |
||||||
|
|
||||||
|
public AnyTypeDenoter(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitAnyTypeDenoter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object obj) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
/* |
||||||
|
* @(#)ArrayAggregate.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class ArrayAggregate extends AST { |
||||||
|
|
||||||
|
public ArrayAggregate(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
elemCount = 0; |
||||||
|
} |
||||||
|
|
||||||
|
public int elemCount; |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
/* |
||||||
|
* @(#)ArrayExpression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class ArrayExpression extends Expression { |
||||||
|
|
||||||
|
public ArrayExpression(ArrayAggregate aaAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
AA = aaAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitArrayExpression(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public ArrayAggregate AA; |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
/* |
||||||
|
* @(#)ArrayTypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class ArrayTypeDenoter extends TypeDenoter { |
||||||
|
|
||||||
|
public ArrayTypeDenoter(IntegerLiteral ilAST, TypeDenoter tAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
IL = ilAST; |
||||||
|
T = tAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitArrayTypeDenoter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object obj) { |
||||||
|
if (obj != null && obj instanceof ErrorTypeDenoter) |
||||||
|
return true; |
||||||
|
else if (obj != null && obj instanceof ArrayTypeDenoter) |
||||||
|
return this.IL.spelling.compareTo(((ArrayTypeDenoter) obj).IL.spelling) == 0 && |
||||||
|
this.T.equals(((ArrayTypeDenoter) obj).T); |
||||||
|
else |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public IntegerLiteral IL; |
||||||
|
public TypeDenoter T; |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
/* |
||||||
|
* @(#)AssignCommand.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class AssignCommand extends Command { |
||||||
|
|
||||||
|
public AssignCommand(Vname vAST, Expression eAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
V = vAST; |
||||||
|
E = eAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitAssignCommand(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Vname V; |
||||||
|
public Expression E; |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
/* |
||||||
|
* @(#)BinaryExpression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class BinaryExpression extends Expression { |
||||||
|
|
||||||
|
public BinaryExpression(Expression e1AST, Operator oAST, Expression e2AST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
O = oAST; |
||||||
|
E1 = e1AST; |
||||||
|
E2 = e2AST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitBinaryExpression(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Expression E1, E2; |
||||||
|
public Operator O; |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
/* |
||||||
|
* @(#)BinaryOperatorDeclaration.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class BinaryOperatorDeclaration extends Declaration { |
||||||
|
|
||||||
|
public BinaryOperatorDeclaration(Operator oAST, TypeDenoter arg1AST, |
||||||
|
TypeDenoter arg2AST, TypeDenoter resultAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
O = oAST; |
||||||
|
ARG1 = arg1AST; |
||||||
|
ARG2 = arg2AST; |
||||||
|
RES = resultAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitBinaryOperatorDeclaration(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Operator O; |
||||||
|
public TypeDenoter ARG1, ARG2, RES; |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
/* |
||||||
|
* @(#)BoolTypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class BoolTypeDenoter extends TypeDenoter { |
||||||
|
|
||||||
|
public BoolTypeDenoter(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitBoolTypeDenoter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object obj) { |
||||||
|
if ((obj != null) && (obj instanceof ErrorTypeDenoter)) |
||||||
|
return true; |
||||||
|
else |
||||||
|
return ((obj != null) && (obj instanceof BoolTypeDenoter)); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* @(#)CallCommand.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class CallCommand extends Command { |
||||||
|
|
||||||
|
public CallCommand(Identifier iAST, ActualParameterSequence apsAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
APS = apsAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitCallCommand(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public ActualParameterSequence APS; |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* @(#)CallExpression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class CallExpression extends Expression { |
||||||
|
|
||||||
|
public CallExpression(Identifier iAST, ActualParameterSequence apsAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
APS = apsAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitCallExpression(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public ActualParameterSequence APS; |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
/* |
||||||
|
* @(#)CharTypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class CharTypeDenoter extends TypeDenoter { |
||||||
|
|
||||||
|
public CharTypeDenoter(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitCharTypeDenoter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object obj) { |
||||||
|
if (obj != null && obj instanceof ErrorTypeDenoter) |
||||||
|
return true; |
||||||
|
else |
||||||
|
return (obj != null && obj instanceof CharTypeDenoter); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)CharacterExpression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class CharacterExpression extends Expression { |
||||||
|
|
||||||
|
public CharacterExpression(CharacterLiteral clAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
CL = clAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitCharacterExpression(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public CharacterLiteral CL; |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
/* |
||||||
|
* @(#)CharacterLiteral.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class CharacterLiteral extends Terminal { |
||||||
|
|
||||||
|
public CharacterLiteral(String theSpelling, SourcePosition thePosition) { |
||||||
|
super(theSpelling, thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitCharacterLiteral(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,24 @@ |
|||||||
|
/* |
||||||
|
* @(#)Command.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class Command extends AST { |
||||||
|
|
||||||
|
public Command(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)ConstActualParameter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class ConstActualParameter extends ActualParameter { |
||||||
|
|
||||||
|
public ConstActualParameter(Expression eAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
E = eAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitConstActualParameter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Expression E; |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* @(#)ConstDeclaration.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class ConstDeclaration extends Declaration { |
||||||
|
|
||||||
|
public ConstDeclaration(Identifier iAST, Expression eAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
E = eAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitConstDeclaration(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public Expression E; |
||||||
|
} |
@ -0,0 +1,42 @@ |
|||||||
|
/* |
||||||
|
* @(#)ConstFormalParameter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class ConstFormalParameter extends FormalParameter { |
||||||
|
|
||||||
|
public ConstFormalParameter(Identifier iAST, TypeDenoter tAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
T = tAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitConstFormalParameter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public TypeDenoter T; |
||||||
|
|
||||||
|
public boolean equals(Object fpAST) { |
||||||
|
if (fpAST instanceof ConstFormalParameter) { |
||||||
|
ConstFormalParameter cfpAST = (ConstFormalParameter) fpAST; |
||||||
|
return T.equals(cfpAST.T); |
||||||
|
} else |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
/* |
||||||
|
* @(#)Declaration.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class Declaration extends AST { |
||||||
|
|
||||||
|
public Declaration(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
duplicated = false; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean duplicated; |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
/* |
||||||
|
* @(#)DotVname.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class DotVname extends Vname { |
||||||
|
|
||||||
|
public DotVname(Vname vAST, Identifier iAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
V = vAST; |
||||||
|
I = iAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitDotVname(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public Vname V; |
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
/* |
||||||
|
* @(#)EmptyActualParameterSequence.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class EmptyActualParameterSequence extends ActualParameterSequence { |
||||||
|
|
||||||
|
public EmptyActualParameterSequence(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitEmptyActualParameterSequence(this, o); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
/* |
||||||
|
* @(#)EmptyCommand.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class EmptyCommand extends Command { |
||||||
|
|
||||||
|
public EmptyCommand(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitEmptyCommand(this, o); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,28 @@ |
|||||||
|
/* |
||||||
|
* @(#)EmptyExpression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class EmptyExpression extends Expression { |
||||||
|
|
||||||
|
public EmptyExpression(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitEmptyExpression(this, o); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
/* |
||||||
|
* @(#)EmptyFormalParameterSequence.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class EmptyFormalParameterSequence extends FormalParameterSequence { |
||||||
|
|
||||||
|
public EmptyFormalParameterSequence(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitEmptyFormalParameterSequence(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object fpsAST) { |
||||||
|
return (fpsAST instanceof EmptyFormalParameterSequence); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
/* |
||||||
|
* @(#)ErrorTypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class ErrorTypeDenoter extends TypeDenoter { |
||||||
|
|
||||||
|
public ErrorTypeDenoter(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitErrorTypeDenoter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object obj) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
/* |
||||||
|
* @(#)Expression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class Expression extends AST { |
||||||
|
|
||||||
|
public Expression(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
type = null; |
||||||
|
} |
||||||
|
|
||||||
|
public TypeDenoter type; |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
/* |
||||||
|
* @(#)FieldTypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class FieldTypeDenoter extends TypeDenoter { |
||||||
|
|
||||||
|
public FieldTypeDenoter(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public abstract boolean equals(Object obj); |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
/* |
||||||
|
* @(#)FormalParameter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class FormalParameter extends Declaration { |
||||||
|
|
||||||
|
public FormalParameter(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public abstract boolean equals(Object fpAST); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
/* |
||||||
|
* @(#)FormalParameterSequence.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class FormalParameterSequence extends AST { |
||||||
|
|
||||||
|
public FormalParameterSequence(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public abstract boolean equals(Object fpsAST); |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)FuncActualParameter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class FuncActualParameter extends ActualParameter { |
||||||
|
|
||||||
|
public FuncActualParameter(Identifier iAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitFuncActualParameter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
/* |
||||||
|
* @(#)FuncDeclaration.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class FuncDeclaration extends Declaration { |
||||||
|
|
||||||
|
public FuncDeclaration(Identifier iAST, FormalParameterSequence fpsAST, |
||||||
|
TypeDenoter tAST, Expression eAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
FPS = fpsAST; |
||||||
|
T = tAST; |
||||||
|
E = eAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitFuncDeclaration(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public FormalParameterSequence FPS; |
||||||
|
public TypeDenoter T; |
||||||
|
public Expression E; |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
/* |
||||||
|
* @(#)FuncFormalParameter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class FuncFormalParameter extends FormalParameter { |
||||||
|
|
||||||
|
public FuncFormalParameter(Identifier iAST, FormalParameterSequence fpsAST, |
||||||
|
TypeDenoter tAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
FPS = fpsAST; |
||||||
|
T = tAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitFuncFormalParameter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object fpAST) { |
||||||
|
if (fpAST instanceof FuncFormalParameter) { |
||||||
|
FuncFormalParameter ffpAST = (FuncFormalParameter) fpAST; |
||||||
|
return FPS.equals(ffpAST.FPS) && T.equals(ffpAST.T); |
||||||
|
} else |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public FormalParameterSequence FPS; |
||||||
|
public TypeDenoter T; |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
/* |
||||||
|
* @(#)Identifier.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class Identifier extends Terminal { |
||||||
|
|
||||||
|
public Identifier(String theSpelling, SourcePosition thePosition) { |
||||||
|
super(theSpelling, thePosition); |
||||||
|
type = null; |
||||||
|
decl = null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitIdentifier(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public TypeDenoter type; |
||||||
|
public AST decl; // Either a Declaration or a FieldTypeDenoter
|
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
/* |
||||||
|
* @(#)IfCommand.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class IfCommand extends Command { |
||||||
|
|
||||||
|
public IfCommand(Expression eAST, Command c1AST, Command c2AST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
E = eAST; |
||||||
|
C1 = c1AST; |
||||||
|
C2 = c2AST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitIfCommand(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Expression E; |
||||||
|
public Command C1, C2; |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* @(#)IfExpression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class IfExpression extends Expression { |
||||||
|
|
||||||
|
public IfExpression(Expression e1AST, Expression e2AST, Expression e3AST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
E1 = e1AST; |
||||||
|
E2 = e2AST; |
||||||
|
E3 = e3AST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitIfExpression(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Expression E1, E2, E3; |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
/* |
||||||
|
* @(#)IntTypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class IntTypeDenoter extends TypeDenoter { |
||||||
|
|
||||||
|
public IntTypeDenoter(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitIntTypeDenoter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object obj) { |
||||||
|
if (obj != null && obj instanceof ErrorTypeDenoter) |
||||||
|
return true; |
||||||
|
else |
||||||
|
return (obj != null && obj instanceof IntTypeDenoter); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)IntegerExpression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class IntegerExpression extends Expression { |
||||||
|
|
||||||
|
public IntegerExpression(IntegerLiteral ilAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
IL = ilAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitIntegerExpression(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public IntegerLiteral IL; |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
/* |
||||||
|
* @(#)IntegerLiteral.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class IntegerLiteral extends Terminal { |
||||||
|
|
||||||
|
public IntegerLiteral(String theSpelling, SourcePosition thePosition) { |
||||||
|
super(theSpelling, thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitIntegerLiteral(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
/* |
||||||
|
* @(#)LetCommand.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class LetCommand extends Command { |
||||||
|
|
||||||
|
public LetCommand(Declaration dAST, Command cAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
D = dAST; |
||||||
|
C = cAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitLetCommand(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Declaration D; |
||||||
|
public Command C; |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
/* |
||||||
|
* @(#)LetExpression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class LetExpression extends Expression { |
||||||
|
|
||||||
|
public LetExpression(Declaration dAST, Expression eAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
D = dAST; |
||||||
|
E = eAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitLetExpression(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Declaration D; |
||||||
|
public Expression E; |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* @(#)MultipleActualParameterSequence.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class MultipleActualParameterSequence extends ActualParameterSequence { |
||||||
|
|
||||||
|
public MultipleActualParameterSequence(ActualParameter apAST, ActualParameterSequence apsAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
AP = apAST; |
||||||
|
APS = apsAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitMultipleActualParameterSequence(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public ActualParameter AP; |
||||||
|
public ActualParameterSequence APS; |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* @(#)MultipleArrayAggregate.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class MultipleArrayAggregate extends ArrayAggregate { |
||||||
|
|
||||||
|
public MultipleArrayAggregate(Expression eAST, ArrayAggregate aaAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
E = eAST; |
||||||
|
AA = aaAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitMultipleArrayAggregate(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Expression E; |
||||||
|
public ArrayAggregate AA; |
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
/* |
||||||
|
* @(#)MultipleFieldTypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class MultipleFieldTypeDenoter extends FieldTypeDenoter { |
||||||
|
|
||||||
|
public MultipleFieldTypeDenoter(Identifier iAST, TypeDenoter tAST, FieldTypeDenoter ftAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
T = tAST; |
||||||
|
FT = ftAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitMultipleFieldTypeDenoter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object obj) { |
||||||
|
if (obj != null && obj instanceof MultipleFieldTypeDenoter) { |
||||||
|
MultipleFieldTypeDenoter ft = (MultipleFieldTypeDenoter) obj; |
||||||
|
return (this.I.spelling.compareTo(ft.I.spelling) == 0) && |
||||||
|
this.T.equals(ft.T) && |
||||||
|
this.FT.equals(ft.FT); |
||||||
|
} else |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public TypeDenoter T; |
||||||
|
public FieldTypeDenoter FT; |
||||||
|
} |
@ -0,0 +1,42 @@ |
|||||||
|
/* |
||||||
|
* @(#)MultipleFormalParameterSequence.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class MultipleFormalParameterSequence extends FormalParameterSequence { |
||||||
|
|
||||||
|
public MultipleFormalParameterSequence(FormalParameter fpAST, FormalParameterSequence fpsAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
FP = fpAST; |
||||||
|
FPS = fpsAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitMultipleFormalParameterSequence(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object fpsAST) { |
||||||
|
if (fpsAST instanceof MultipleFormalParameterSequence) { |
||||||
|
MultipleFormalParameterSequence mfpsAST = (MultipleFormalParameterSequence) fpsAST; |
||||||
|
return FP.equals(mfpsAST.FP) && FPS.equals(mfpsAST.FPS); |
||||||
|
} else |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public FormalParameter FP; |
||||||
|
public FormalParameterSequence FPS; |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
/* |
||||||
|
* @(#)MultipleRecordAggregate.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class MultipleRecordAggregate extends RecordAggregate { |
||||||
|
|
||||||
|
public MultipleRecordAggregate(Identifier iAST, Expression eAST, RecordAggregate raAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
E = eAST; |
||||||
|
RA = raAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitMultipleRecordAggregate(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public Expression E; |
||||||
|
public RecordAggregate RA; |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)Operator.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class Operator extends Terminal { |
||||||
|
|
||||||
|
public Operator(String theSpelling, SourcePosition thePosition) { |
||||||
|
super(theSpelling, thePosition); |
||||||
|
decl = null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitOperator(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Declaration decl; |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)ProcActualParameter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class ProcActualParameter extends ActualParameter { |
||||||
|
|
||||||
|
public ProcActualParameter(Identifier iAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitProcActualParameter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
/* |
||||||
|
* @(#)ProcDeclaration.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class ProcDeclaration extends Declaration { |
||||||
|
|
||||||
|
public ProcDeclaration(Identifier iAST, FormalParameterSequence fpsAST, |
||||||
|
Command cAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
FPS = fpsAST; |
||||||
|
C = cAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitProcDeclaration(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public FormalParameterSequence FPS; |
||||||
|
public Command C; |
||||||
|
} |
@ -0,0 +1,42 @@ |
|||||||
|
/* |
||||||
|
* @(#)ProcFormalParameter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class ProcFormalParameter extends FormalParameter { |
||||||
|
|
||||||
|
public ProcFormalParameter(Identifier iAST, FormalParameterSequence fpsAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
FPS = fpsAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitProcFormalParameter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public FormalParameterSequence FPS; |
||||||
|
|
||||||
|
public boolean equals(Object fpAST) { |
||||||
|
if (fpAST instanceof ProcFormalParameter) { |
||||||
|
ProcFormalParameter pfpAST = (ProcFormalParameter) fpAST; |
||||||
|
return FPS.equals(pfpAST.FPS); |
||||||
|
} else |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)Program.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class Program extends AST { |
||||||
|
|
||||||
|
public Program(Command cAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
C = cAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitProgram(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Command C; |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
/* |
||||||
|
* @(#)RecordAggregate.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class RecordAggregate extends AST { |
||||||
|
|
||||||
|
public RecordAggregate(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
type = null; |
||||||
|
} |
||||||
|
|
||||||
|
public FieldTypeDenoter type; |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)RecordExpression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class RecordExpression extends Expression { |
||||||
|
|
||||||
|
public RecordExpression(RecordAggregate raAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
RA = raAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitRecordExpression(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public RecordAggregate RA; |
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
/* |
||||||
|
* @(#)RecordTypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class RecordTypeDenoter extends TypeDenoter { |
||||||
|
|
||||||
|
public RecordTypeDenoter(FieldTypeDenoter ftAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
FT = ftAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitRecordTypeDenoter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object obj) { |
||||||
|
if (obj != null && obj instanceof ErrorTypeDenoter) |
||||||
|
return true; |
||||||
|
else if (obj != null && obj instanceof RecordTypeDenoter) |
||||||
|
return this.FT.equals(((RecordTypeDenoter) obj).FT); |
||||||
|
else |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public FieldTypeDenoter FT; |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
/* |
||||||
|
* @(#)SequentialCommand.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class SequentialCommand extends Command { |
||||||
|
|
||||||
|
public SequentialCommand(Command c1AST, Command c2AST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
C1 = c1AST; |
||||||
|
C2 = c2AST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitSequentialCommand(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Command C1, C2; |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
/* |
||||||
|
* @(#)SequentialDeclaration.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class SequentialDeclaration extends Declaration { |
||||||
|
|
||||||
|
public SequentialDeclaration(Declaration d1AST, Declaration d2AST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
D1 = d1AST; |
||||||
|
D2 = d2AST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitSequentialDeclaration(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Declaration D1, D2; |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
/* |
||||||
|
* @(#)SimpleTypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class SimpleTypeDenoter extends TypeDenoter { |
||||||
|
|
||||||
|
public SimpleTypeDenoter(Identifier iAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitSimpleTypeDenoter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object obj) { |
||||||
|
return false; // should not happen
|
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)SimpleVname.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class SimpleVname extends Vname { |
||||||
|
|
||||||
|
public SimpleVname(Identifier iAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitSimpleVname(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
/* |
||||||
|
* @(#)SingleActualParameterSequence.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class SingleActualParameterSequence extends ActualParameterSequence { |
||||||
|
|
||||||
|
public SingleActualParameterSequence(ActualParameter apAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
AP = apAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitSingleActualParameterSequence(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public ActualParameter AP; |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
/* |
||||||
|
* @(#)SingleArrayAggregate.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class SingleArrayAggregate extends ArrayAggregate { |
||||||
|
|
||||||
|
public SingleArrayAggregate(Expression eAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
E = eAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitSingleArrayAggregate(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Expression E; |
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
/* |
||||||
|
* @(#)SingleFieldTypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class SingleFieldTypeDenoter extends FieldTypeDenoter { |
||||||
|
|
||||||
|
public SingleFieldTypeDenoter(Identifier iAST, TypeDenoter tAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
T = tAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitSingleFieldTypeDenoter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object obj) { |
||||||
|
if (obj != null && obj instanceof SingleFieldTypeDenoter) { |
||||||
|
SingleFieldTypeDenoter ft = (SingleFieldTypeDenoter) obj; |
||||||
|
return (this.I.spelling.compareTo(ft.I.spelling) == 0) && |
||||||
|
this.T.equals(ft.T); |
||||||
|
} else |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public TypeDenoter T; |
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
/* |
||||||
|
* @(#)SingleFormalParameterSequence.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class SingleFormalParameterSequence extends FormalParameterSequence { |
||||||
|
|
||||||
|
public SingleFormalParameterSequence(FormalParameter fpAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
FP = fpAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitSingleFormalParameterSequence(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean equals(Object fpsAST) { |
||||||
|
if (fpsAST instanceof SingleFormalParameterSequence) { |
||||||
|
SingleFormalParameterSequence sfpsAST = (SingleFormalParameterSequence) fpsAST; |
||||||
|
return FP.equals(sfpsAST.FP); |
||||||
|
} else |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public FormalParameter FP; |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* @(#)SingleRecordAggregate.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class SingleRecordAggregate extends RecordAggregate { |
||||||
|
|
||||||
|
public SingleRecordAggregate(Identifier iAST, Expression eAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
E = eAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitSingleRecordAggregate(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public Expression E; |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
/* |
||||||
|
* @(#)SubscriptVname.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class SubscriptVname extends Vname { |
||||||
|
|
||||||
|
public SubscriptVname(Vname vAST, Expression eAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
V = vAST; |
||||||
|
E = eAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitSubscriptVname(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Expression E; |
||||||
|
public Vname V; |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
/* |
||||||
|
* @(#)Terminal.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
abstract public class Terminal extends AST { |
||||||
|
|
||||||
|
public Terminal(String theSpelling, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
spelling = theSpelling; |
||||||
|
} |
||||||
|
|
||||||
|
public String spelling; |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* @(#)TypeDeclaration.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class TypeDeclaration extends Declaration { |
||||||
|
|
||||||
|
public TypeDeclaration(Identifier iAST, TypeDenoter tAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
T = tAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitTypeDeclaration(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public TypeDenoter T; |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
/* |
||||||
|
* @(#)TypeDenoter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class TypeDenoter extends AST { |
||||||
|
|
||||||
|
public TypeDenoter(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
} |
||||||
|
|
||||||
|
public abstract boolean equals(Object obj); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* @(#)UnaryExpression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class UnaryExpression extends Expression { |
||||||
|
|
||||||
|
public UnaryExpression(Operator oAST, Expression eAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
O = oAST; |
||||||
|
E = eAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitUnaryExpression(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Expression E; |
||||||
|
public Operator O; |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
/* |
||||||
|
* @(#)UnaryOperatorDeclaration.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class UnaryOperatorDeclaration extends Declaration { |
||||||
|
|
||||||
|
public UnaryOperatorDeclaration(Operator oAST, TypeDenoter argAST, |
||||||
|
TypeDenoter resultAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
O = oAST; |
||||||
|
ARG = argAST; |
||||||
|
RES = resultAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitUnaryOperatorDeclaration(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Operator O; |
||||||
|
public TypeDenoter ARG, RES; |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)VarActualParameter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class VarActualParameter extends ActualParameter { |
||||||
|
|
||||||
|
public VarActualParameter(Vname vAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
V = vAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitVarActualParameter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Vname V; |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/* |
||||||
|
* @(#)VarDeclaration.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class VarDeclaration extends Declaration { |
||||||
|
|
||||||
|
public VarDeclaration(Identifier iAST, TypeDenoter tAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
T = tAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitVarDeclaration(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public TypeDenoter T; |
||||||
|
} |
@ -0,0 +1,42 @@ |
|||||||
|
/* |
||||||
|
* @(#)ValFormalParameter.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class VarFormalParameter extends FormalParameter { |
||||||
|
|
||||||
|
public VarFormalParameter(Identifier iAST, TypeDenoter tAST, |
||||||
|
SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
I = iAST; |
||||||
|
T = tAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitVarFormalParameter(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Identifier I; |
||||||
|
public TypeDenoter T; |
||||||
|
|
||||||
|
public boolean equals(Object fpAST) { |
||||||
|
if (fpAST instanceof VarFormalParameter) { |
||||||
|
VarFormalParameter vfpAST = (VarFormalParameter) fpAST; |
||||||
|
return T.equals(vfpAST.T); |
||||||
|
} else |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,154 @@ |
|||||||
|
/* |
||||||
|
* @(#)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
|
||||||
|
public abstract Object visitAssignCommand(AssignCommand ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitCallCommand(CallCommand ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitEmptyCommand(EmptyCommand ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitIfCommand(IfCommand ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitLetCommand(LetCommand ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitSequentialCommand(SequentialCommand ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitWhileCommand(WhileCommand ast, Object o); |
||||||
|
|
||||||
|
// Expressions
|
||||||
|
public abstract Object visitArrayExpression(ArrayExpression ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitBinaryExpression(BinaryExpression ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitCallExpression(CallExpression ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitCharacterExpression(CharacterExpression ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitEmptyExpression(EmptyExpression ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitIfExpression(IfExpression ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitIntegerExpression(IntegerExpression ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitLetExpression(LetExpression ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitRecordExpression(RecordExpression ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitUnaryExpression(UnaryExpression ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitVnameExpression(VnameExpression ast, Object o); |
||||||
|
|
||||||
|
// Declarations
|
||||||
|
public abstract Object visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitConstDeclaration(ConstDeclaration ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitFuncDeclaration(FuncDeclaration ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitProcDeclaration(ProcDeclaration ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitSequentialDeclaration(SequentialDeclaration ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitTypeDeclaration(TypeDeclaration ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitVarDeclaration(VarDeclaration ast, Object o); |
||||||
|
|
||||||
|
// Array Aggregates
|
||||||
|
public abstract Object visitMultipleArrayAggregate(MultipleArrayAggregate ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitSingleArrayAggregate(SingleArrayAggregate ast, Object o); |
||||||
|
|
||||||
|
// Record Aggregates
|
||||||
|
public abstract Object visitMultipleRecordAggregate(MultipleRecordAggregate ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitSingleRecordAggregate(SingleRecordAggregate ast, Object o); |
||||||
|
|
||||||
|
// Formal Parameters
|
||||||
|
public abstract Object visitConstFormalParameter(ConstFormalParameter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitFuncFormalParameter(FuncFormalParameter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitProcFormalParameter(ProcFormalParameter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitVarFormalParameter(VarFormalParameter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Object o); |
||||||
|
|
||||||
|
// Actual Parameters
|
||||||
|
public abstract Object visitConstActualParameter(ConstActualParameter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitFuncActualParameter(FuncActualParameter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitProcActualParameter(ProcActualParameter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitVarActualParameter(VarActualParameter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitSingleActualParameterSequence(SingleActualParameterSequence ast, Object o); |
||||||
|
|
||||||
|
// Type Denoters
|
||||||
|
public abstract Object visitAnyTypeDenoter(AnyTypeDenoter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitArrayTypeDenoter(ArrayTypeDenoter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitBoolTypeDenoter(BoolTypeDenoter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitCharTypeDenoter(CharTypeDenoter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitErrorTypeDenoter(ErrorTypeDenoter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitSimpleTypeDenoter(SimpleTypeDenoter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitIntTypeDenoter(IntTypeDenoter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitRecordTypeDenoter(RecordTypeDenoter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, Object o); |
||||||
|
|
||||||
|
// Literals, Identifiers and Operators
|
||||||
|
public abstract Object visitCharacterLiteral(CharacterLiteral ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitIdentifier(Identifier ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitIntegerLiteral(IntegerLiteral ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitOperator(Operator ast, Object o); |
||||||
|
|
||||||
|
// Value-or-variable names
|
||||||
|
public abstract Object visitDotVname(DotVname ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitSimpleVname(SimpleVname ast, Object o); |
||||||
|
|
||||||
|
public abstract Object visitSubscriptVname(SubscriptVname ast, Object o); |
||||||
|
|
||||||
|
// Programs
|
||||||
|
public abstract Object visitProgram(Program ast, Object o); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
/* |
||||||
|
* @(#)Vname.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public abstract class Vname extends AST { |
||||||
|
|
||||||
|
public Vname(SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
variable = false; |
||||||
|
type = null; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean variable, indexed; |
||||||
|
public int offset; |
||||||
|
public TypeDenoter type; |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)VnameExpression.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class VnameExpression extends Expression { |
||||||
|
|
||||||
|
public VnameExpression(Vname vAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
V = vAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitVnameExpression(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Vname V; |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
/* |
||||||
|
* @(#)WhileCommand.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; |
||||||
|
|
||||||
|
import Triangle.SyntacticAnalyzer.SourcePosition; |
||||||
|
|
||||||
|
public class WhileCommand extends Command { |
||||||
|
|
||||||
|
public WhileCommand(Expression eAST, Command cAST, SourcePosition thePosition) { |
||||||
|
super(thePosition); |
||||||
|
E = eAST; |
||||||
|
C = cAST; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visit(Visitor v, Object o) { |
||||||
|
return v.visitWhileCommand(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Expression E; |
||||||
|
public Command C; |
||||||
|
} |
@ -0,0 +1,983 @@ |
|||||||
|
/* |
||||||
|
* @(#)Encoder.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
import java.io.DataOutputStream; |
||||||
|
import java.io.FileNotFoundException; |
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
import Triangle.ErrorReporter; |
||||||
|
import Triangle.StdEnvironment; |
||||||
|
import Triangle.AbstractMachine.Instruction; |
||||||
|
import Triangle.AbstractMachine.Machine; |
||||||
|
import Triangle.AbstractSyntaxTrees.AST; |
||||||
|
import Triangle.AbstractSyntaxTrees.AnyTypeDenoter; |
||||||
|
import Triangle.AbstractSyntaxTrees.ArrayExpression; |
||||||
|
import Triangle.AbstractSyntaxTrees.ArrayTypeDenoter; |
||||||
|
import Triangle.AbstractSyntaxTrees.AssignCommand; |
||||||
|
import Triangle.AbstractSyntaxTrees.BinaryExpression; |
||||||
|
import Triangle.AbstractSyntaxTrees.BinaryOperatorDeclaration; |
||||||
|
import Triangle.AbstractSyntaxTrees.BoolTypeDenoter; |
||||||
|
import Triangle.AbstractSyntaxTrees.CallCommand; |
||||||
|
import Triangle.AbstractSyntaxTrees.CallExpression; |
||||||
|
import Triangle.AbstractSyntaxTrees.CharTypeDenoter; |
||||||
|
import Triangle.AbstractSyntaxTrees.CharacterExpression; |
||||||
|
import Triangle.AbstractSyntaxTrees.CharacterLiteral; |
||||||
|
import Triangle.AbstractSyntaxTrees.ConstActualParameter; |
||||||
|
import Triangle.AbstractSyntaxTrees.ConstDeclaration; |
||||||
|
import Triangle.AbstractSyntaxTrees.ConstFormalParameter; |
||||||
|
import Triangle.AbstractSyntaxTrees.Declaration; |
||||||
|
import Triangle.AbstractSyntaxTrees.DotVname; |
||||||
|
import Triangle.AbstractSyntaxTrees.EmptyActualParameterSequence; |
||||||
|
import Triangle.AbstractSyntaxTrees.EmptyCommand; |
||||||
|
import Triangle.AbstractSyntaxTrees.EmptyExpression; |
||||||
|
import Triangle.AbstractSyntaxTrees.EmptyFormalParameterSequence; |
||||||
|
import Triangle.AbstractSyntaxTrees.ErrorTypeDenoter; |
||||||
|
import Triangle.AbstractSyntaxTrees.FuncActualParameter; |
||||||
|
import Triangle.AbstractSyntaxTrees.FuncDeclaration; |
||||||
|
import Triangle.AbstractSyntaxTrees.FuncFormalParameter; |
||||||
|
import Triangle.AbstractSyntaxTrees.Identifier; |
||||||
|
import Triangle.AbstractSyntaxTrees.IfCommand; |
||||||
|
import Triangle.AbstractSyntaxTrees.IfExpression; |
||||||
|
import Triangle.AbstractSyntaxTrees.IntTypeDenoter; |
||||||
|
import Triangle.AbstractSyntaxTrees.IntegerExpression; |
||||||
|
import Triangle.AbstractSyntaxTrees.IntegerLiteral; |
||||||
|
import Triangle.AbstractSyntaxTrees.LetCommand; |
||||||
|
import Triangle.AbstractSyntaxTrees.LetExpression; |
||||||
|
import Triangle.AbstractSyntaxTrees.MultipleActualParameterSequence; |
||||||
|
import Triangle.AbstractSyntaxTrees.MultipleArrayAggregate; |
||||||
|
import Triangle.AbstractSyntaxTrees.MultipleFieldTypeDenoter; |
||||||
|
import Triangle.AbstractSyntaxTrees.MultipleFormalParameterSequence; |
||||||
|
import Triangle.AbstractSyntaxTrees.MultipleRecordAggregate; |
||||||
|
import Triangle.AbstractSyntaxTrees.Operator; |
||||||
|
import Triangle.AbstractSyntaxTrees.ProcActualParameter; |
||||||
|
import Triangle.AbstractSyntaxTrees.ProcDeclaration; |
||||||
|
import Triangle.AbstractSyntaxTrees.ProcFormalParameter; |
||||||
|
import Triangle.AbstractSyntaxTrees.Program; |
||||||
|
import Triangle.AbstractSyntaxTrees.RecordExpression; |
||||||
|
import Triangle.AbstractSyntaxTrees.RecordTypeDenoter; |
||||||
|
import Triangle.AbstractSyntaxTrees.SequentialCommand; |
||||||
|
import Triangle.AbstractSyntaxTrees.SequentialDeclaration; |
||||||
|
import Triangle.AbstractSyntaxTrees.SimpleTypeDenoter; |
||||||
|
import Triangle.AbstractSyntaxTrees.SimpleVname; |
||||||
|
import Triangle.AbstractSyntaxTrees.SingleActualParameterSequence; |
||||||
|
import Triangle.AbstractSyntaxTrees.SingleArrayAggregate; |
||||||
|
import Triangle.AbstractSyntaxTrees.SingleFieldTypeDenoter; |
||||||
|
import Triangle.AbstractSyntaxTrees.SingleFormalParameterSequence; |
||||||
|
import Triangle.AbstractSyntaxTrees.SingleRecordAggregate; |
||||||
|
import Triangle.AbstractSyntaxTrees.SubscriptVname; |
||||||
|
import Triangle.AbstractSyntaxTrees.TypeDeclaration; |
||||||
|
import Triangle.AbstractSyntaxTrees.UnaryExpression; |
||||||
|
import Triangle.AbstractSyntaxTrees.UnaryOperatorDeclaration; |
||||||
|
import Triangle.AbstractSyntaxTrees.VarActualParameter; |
||||||
|
import Triangle.AbstractSyntaxTrees.VarDeclaration; |
||||||
|
import Triangle.AbstractSyntaxTrees.VarFormalParameter; |
||||||
|
import Triangle.AbstractSyntaxTrees.Visitor; |
||||||
|
import Triangle.AbstractSyntaxTrees.Vname; |
||||||
|
import Triangle.AbstractSyntaxTrees.VnameExpression; |
||||||
|
import Triangle.AbstractSyntaxTrees.WhileCommand; |
||||||
|
|
||||||
|
public final class Encoder implements Visitor { |
||||||
|
|
||||||
|
// Commands
|
||||||
|
public Object visitAssignCommand(AssignCommand ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
Integer valSize = (Integer) ast.E.visit(this, frame); |
||||||
|
encodeStore(ast.V, new Frame(frame, valSize.intValue()), |
||||||
|
valSize.intValue()); |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitCallCommand(CallCommand ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
Integer argsSize = (Integer) ast.APS.visit(this, frame); |
||||||
|
ast.I.visit(this, new Frame(frame.level, argsSize)); |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitEmptyCommand(EmptyCommand ast, Object o) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitIfCommand(IfCommand ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int jumpifAddr, jumpAddr; |
||||||
|
|
||||||
|
Integer valSize = (Integer) ast.E.visit(this, frame); |
||||||
|
jumpifAddr = nextInstrAddr; |
||||||
|
emit(Machine.JUMPIFop, Machine.falseRep, Machine.CBr, 0); |
||||||
|
ast.C1.visit(this, frame); |
||||||
|
jumpAddr = nextInstrAddr; |
||||||
|
emit(Machine.JUMPop, 0, Machine.CBr, 0); |
||||||
|
patch(jumpifAddr, nextInstrAddr); |
||||||
|
ast.C2.visit(this, frame); |
||||||
|
patch(jumpAddr, nextInstrAddr); |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitLetCommand(LetCommand ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int extraSize = ((Integer) ast.D.visit(this, frame)).intValue(); |
||||||
|
ast.C.visit(this, new Frame(frame, extraSize)); |
||||||
|
if (extraSize > 0) |
||||||
|
emit(Machine.POPop, 0, 0, extraSize); |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitSequentialCommand(SequentialCommand ast, Object o) { |
||||||
|
ast.C1.visit(this, o); |
||||||
|
ast.C2.visit(this, o); |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitWhileCommand(WhileCommand ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int jumpAddr, loopAddr; |
||||||
|
|
||||||
|
jumpAddr = nextInstrAddr; |
||||||
|
emit(Machine.JUMPop, 0, Machine.CBr, 0); |
||||||
|
loopAddr = nextInstrAddr; |
||||||
|
ast.C.visit(this, frame); |
||||||
|
patch(jumpAddr, nextInstrAddr); |
||||||
|
ast.E.visit(this, frame); |
||||||
|
emit(Machine.JUMPIFop, Machine.trueRep, Machine.CBr, loopAddr); |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
// Expressions
|
||||||
|
public Object visitArrayExpression(ArrayExpression ast, Object o) { |
||||||
|
ast.type.visit(this, null); |
||||||
|
return ast.AA.visit(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitBinaryExpression(BinaryExpression ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
Integer valSize = (Integer) ast.type.visit(this, null); |
||||||
|
int valSize1 = ((Integer) ast.E1.visit(this, frame)).intValue(); |
||||||
|
Frame frame1 = new Frame(frame, valSize1); |
||||||
|
int valSize2 = ((Integer) ast.E2.visit(this, frame1)).intValue(); |
||||||
|
Frame frame2 = new Frame(frame.level, valSize1 + valSize2); |
||||||
|
ast.O.visit(this, frame2); |
||||||
|
return valSize; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitCallExpression(CallExpression ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
Integer valSize = (Integer) ast.type.visit(this, null); |
||||||
|
Integer argsSize = (Integer) ast.APS.visit(this, frame); |
||||||
|
ast.I.visit(this, new Frame(frame.level, argsSize)); |
||||||
|
return valSize; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitCharacterExpression(CharacterExpression ast, |
||||||
|
Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
Integer valSize = (Integer) ast.type.visit(this, null); |
||||||
|
emit(Machine.LOADLop, 0, 0, ast.CL.spelling.charAt(1)); |
||||||
|
return valSize; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitEmptyExpression(EmptyExpression ast, Object o) { |
||||||
|
return new Integer(0); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitIfExpression(IfExpression ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
Integer valSize; |
||||||
|
int jumpifAddr, jumpAddr; |
||||||
|
|
||||||
|
ast.type.visit(this, null); |
||||||
|
ast.E1.visit(this, frame); |
||||||
|
jumpifAddr = nextInstrAddr; |
||||||
|
emit(Machine.JUMPIFop, Machine.falseRep, Machine.CBr, 0); |
||||||
|
valSize = (Integer) ast.E2.visit(this, frame); |
||||||
|
jumpAddr = nextInstrAddr; |
||||||
|
emit(Machine.JUMPop, 0, Machine.CBr, 0); |
||||||
|
patch(jumpifAddr, nextInstrAddr); |
||||||
|
valSize = (Integer) ast.E3.visit(this, frame); |
||||||
|
patch(jumpAddr, nextInstrAddr); |
||||||
|
return valSize; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitIntegerExpression(IntegerExpression ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
Integer valSize = (Integer) ast.type.visit(this, null); |
||||||
|
emit(Machine.LOADLop, 0, 0, Integer.parseInt(ast.IL.spelling)); |
||||||
|
return valSize; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitLetExpression(LetExpression ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
ast.type.visit(this, null); |
||||||
|
int extraSize = ((Integer) ast.D.visit(this, frame)).intValue(); |
||||||
|
Frame frame1 = new Frame(frame, extraSize); |
||||||
|
Integer valSize = (Integer) ast.E.visit(this, frame1); |
||||||
|
if (extraSize > 0) |
||||||
|
emit(Machine.POPop, valSize.intValue(), 0, extraSize); |
||||||
|
return valSize; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitRecordExpression(RecordExpression ast, Object o) { |
||||||
|
ast.type.visit(this, null); |
||||||
|
return ast.RA.visit(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitUnaryExpression(UnaryExpression ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
Integer valSize = (Integer) ast.type.visit(this, null); |
||||||
|
ast.E.visit(this, frame); |
||||||
|
ast.O.visit(this, new Frame(frame.level, valSize.intValue())); |
||||||
|
return valSize; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitVnameExpression(VnameExpression ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
Integer valSize = (Integer) ast.type.visit(this, null); |
||||||
|
encodeFetch(ast.V, frame, valSize.intValue()); |
||||||
|
return valSize; |
||||||
|
} |
||||||
|
|
||||||
|
// Declarations
|
||||||
|
public Object visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, |
||||||
|
Object o) { |
||||||
|
return new Integer(0); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitConstDeclaration(ConstDeclaration ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int extraSize = 0; |
||||||
|
|
||||||
|
if (ast.E instanceof CharacterExpression) { |
||||||
|
CharacterLiteral CL = ((CharacterExpression) ast.E).CL; |
||||||
|
ast.entity = new KnownValue(Machine.characterSize, |
||||||
|
characterValuation(CL.spelling)); |
||||||
|
} else if (ast.E instanceof IntegerExpression) { |
||||||
|
IntegerLiteral IL = ((IntegerExpression) ast.E).IL; |
||||||
|
ast.entity = new KnownValue(Machine.integerSize, |
||||||
|
Integer.parseInt(IL.spelling)); |
||||||
|
} else { |
||||||
|
int valSize = ((Integer) ast.E.visit(this, frame)).intValue(); |
||||||
|
ast.entity = new UnknownValue(valSize, frame.level, frame.size); |
||||||
|
extraSize = valSize; |
||||||
|
} |
||||||
|
writeTableDetails(ast); |
||||||
|
return new Integer(extraSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitFuncDeclaration(FuncDeclaration ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int jumpAddr = nextInstrAddr; |
||||||
|
int argsSize = 0, valSize = 0; |
||||||
|
|
||||||
|
emit(Machine.JUMPop, 0, Machine.CBr, 0); |
||||||
|
ast.entity = new KnownRoutine(Machine.closureSize, frame.level, nextInstrAddr); |
||||||
|
writeTableDetails(ast); |
||||||
|
if (frame.level == Machine.maxRoutineLevel) |
||||||
|
reporter.reportRestriction("can't nest routines more than 7 deep"); |
||||||
|
else { |
||||||
|
Frame frame1 = new Frame(frame.level + 1, 0); |
||||||
|
argsSize = ((Integer) ast.FPS.visit(this, frame1)).intValue(); |
||||||
|
Frame frame2 = new Frame(frame.level + 1, Machine.linkDataSize); |
||||||
|
valSize = ((Integer) ast.E.visit(this, frame2)).intValue(); |
||||||
|
} |
||||||
|
emit(Machine.RETURNop, valSize, 0, argsSize); |
||||||
|
patch(jumpAddr, nextInstrAddr); |
||||||
|
return new Integer(0); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitProcDeclaration(ProcDeclaration ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int jumpAddr = nextInstrAddr; |
||||||
|
int argsSize = 0; |
||||||
|
|
||||||
|
emit(Machine.JUMPop, 0, Machine.CBr, 0); |
||||||
|
ast.entity = new KnownRoutine(Machine.closureSize, frame.level, |
||||||
|
nextInstrAddr); |
||||||
|
writeTableDetails(ast); |
||||||
|
if (frame.level == Machine.maxRoutineLevel) |
||||||
|
reporter.reportRestriction("can't nest routines so deeply"); |
||||||
|
else { |
||||||
|
Frame frame1 = new Frame(frame.level + 1, 0); |
||||||
|
argsSize = ((Integer) ast.FPS.visit(this, frame1)).intValue(); |
||||||
|
Frame frame2 = new Frame(frame.level + 1, Machine.linkDataSize); |
||||||
|
ast.C.visit(this, frame2); |
||||||
|
} |
||||||
|
emit(Machine.RETURNop, 0, 0, argsSize); |
||||||
|
patch(jumpAddr, nextInstrAddr); |
||||||
|
return new Integer(0); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitSequentialDeclaration(SequentialDeclaration ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int extraSize1, extraSize2; |
||||||
|
|
||||||
|
extraSize1 = ((Integer) ast.D1.visit(this, frame)).intValue(); |
||||||
|
Frame frame1 = new Frame(frame, extraSize1); |
||||||
|
extraSize2 = ((Integer) ast.D2.visit(this, frame1)).intValue(); |
||||||
|
return new Integer(extraSize1 + extraSize2); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitTypeDeclaration(TypeDeclaration ast, Object o) { |
||||||
|
// just to ensure the type's representation is decided
|
||||||
|
ast.T.visit(this, null); |
||||||
|
return new Integer(0); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, |
||||||
|
Object o) { |
||||||
|
return new Integer(0); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitVarDeclaration(VarDeclaration ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int extraSize; |
||||||
|
|
||||||
|
extraSize = ((Integer) ast.T.visit(this, null)).intValue(); |
||||||
|
emit(Machine.PUSHop, 0, 0, extraSize); |
||||||
|
ast.entity = new KnownAddress(Machine.addressSize, frame.level, frame.size); |
||||||
|
writeTableDetails(ast); |
||||||
|
return new Integer(extraSize); |
||||||
|
} |
||||||
|
|
||||||
|
// Array Aggregates
|
||||||
|
public Object visitMultipleArrayAggregate(MultipleArrayAggregate ast, |
||||||
|
Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int elemSize = ((Integer) ast.E.visit(this, frame)).intValue(); |
||||||
|
Frame frame1 = new Frame(frame, elemSize); |
||||||
|
int arraySize = ((Integer) ast.AA.visit(this, frame1)).intValue(); |
||||||
|
return new Integer(elemSize + arraySize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitSingleArrayAggregate(SingleArrayAggregate ast, Object o) { |
||||||
|
return ast.E.visit(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
// Record Aggregates
|
||||||
|
public Object visitMultipleRecordAggregate(MultipleRecordAggregate ast, |
||||||
|
Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int fieldSize = ((Integer) ast.E.visit(this, frame)).intValue(); |
||||||
|
Frame frame1 = new Frame(frame, fieldSize); |
||||||
|
int recordSize = ((Integer) ast.RA.visit(this, frame1)).intValue(); |
||||||
|
return new Integer(fieldSize + recordSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitSingleRecordAggregate(SingleRecordAggregate ast, |
||||||
|
Object o) { |
||||||
|
return ast.E.visit(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
// Formal Parameters
|
||||||
|
public Object visitConstFormalParameter(ConstFormalParameter ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int valSize = ((Integer) ast.T.visit(this, null)).intValue(); |
||||||
|
ast.entity = new UnknownValue(valSize, frame.level, -frame.size - valSize); |
||||||
|
writeTableDetails(ast); |
||||||
|
return new Integer(valSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitFuncFormalParameter(FuncFormalParameter ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int argsSize = Machine.closureSize; |
||||||
|
ast.entity = new UnknownRoutine(Machine.closureSize, frame.level, |
||||||
|
-frame.size - argsSize); |
||||||
|
writeTableDetails(ast); |
||||||
|
return new Integer(argsSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitProcFormalParameter(ProcFormalParameter ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int argsSize = Machine.closureSize; |
||||||
|
ast.entity = new UnknownRoutine(Machine.closureSize, frame.level, |
||||||
|
-frame.size - argsSize); |
||||||
|
writeTableDetails(ast); |
||||||
|
return new Integer(argsSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitVarFormalParameter(VarFormalParameter ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
ast.T.visit(this, null); |
||||||
|
ast.entity = new UnknownAddress(Machine.addressSize, frame.level, |
||||||
|
-frame.size - Machine.addressSize); |
||||||
|
writeTableDetails(ast); |
||||||
|
return new Integer(Machine.addressSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitEmptyFormalParameterSequence( |
||||||
|
EmptyFormalParameterSequence ast, Object o) { |
||||||
|
return new Integer(0); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitMultipleFormalParameterSequence( |
||||||
|
MultipleFormalParameterSequence ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int argsSize1 = ((Integer) ast.FPS.visit(this, frame)).intValue(); |
||||||
|
Frame frame1 = new Frame(frame, argsSize1); |
||||||
|
int argsSize2 = ((Integer) ast.FP.visit(this, frame1)).intValue(); |
||||||
|
return new Integer(argsSize1 + argsSize2); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitSingleFormalParameterSequence( |
||||||
|
SingleFormalParameterSequence ast, Object o) { |
||||||
|
return ast.FP.visit(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
// Actual Parameters
|
||||||
|
public Object visitConstActualParameter(ConstActualParameter ast, Object o) { |
||||||
|
return ast.E.visit(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitFuncActualParameter(FuncActualParameter ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
if (ast.I.decl.entity instanceof KnownRoutine) { |
||||||
|
ObjectAddress address = ((KnownRoutine) ast.I.decl.entity).address; |
||||||
|
// static link, code address
|
||||||
|
emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), 0); |
||||||
|
emit(Machine.LOADAop, 0, Machine.CBr, address.displacement); |
||||||
|
} else if (ast.I.decl.entity instanceof UnknownRoutine) { |
||||||
|
ObjectAddress address = ((UnknownRoutine) ast.I.decl.entity).address; |
||||||
|
emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level, |
||||||
|
address.level), address.displacement); |
||||||
|
} else if (ast.I.decl.entity instanceof PrimitiveRoutine) { |
||||||
|
int displacement = ((PrimitiveRoutine) ast.I.decl.entity).displacement; |
||||||
|
// static link, code address
|
||||||
|
emit(Machine.LOADAop, 0, Machine.SBr, 0); |
||||||
|
emit(Machine.LOADAop, 0, Machine.PBr, displacement); |
||||||
|
} |
||||||
|
return new Integer(Machine.closureSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitProcActualParameter(ProcActualParameter ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
if (ast.I.decl.entity instanceof KnownRoutine) { |
||||||
|
ObjectAddress address = ((KnownRoutine) ast.I.decl.entity).address; |
||||||
|
// static link, code address
|
||||||
|
emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), 0); |
||||||
|
emit(Machine.LOADAop, 0, Machine.CBr, address.displacement); |
||||||
|
} else if (ast.I.decl.entity instanceof UnknownRoutine) { |
||||||
|
ObjectAddress address = ((UnknownRoutine) ast.I.decl.entity).address; |
||||||
|
emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level, |
||||||
|
address.level), address.displacement); |
||||||
|
} else if (ast.I.decl.entity instanceof PrimitiveRoutine) { |
||||||
|
int displacement = ((PrimitiveRoutine) ast.I.decl.entity).displacement; |
||||||
|
// static link, code address
|
||||||
|
emit(Machine.LOADAop, 0, Machine.SBr, 0); |
||||||
|
emit(Machine.LOADAop, 0, Machine.PBr, displacement); |
||||||
|
} |
||||||
|
return new Integer(Machine.closureSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitVarActualParameter(VarActualParameter ast, Object o) { |
||||||
|
encodeFetchAddress(ast.V, (Frame) o); |
||||||
|
return new Integer(Machine.addressSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitEmptyActualParameterSequence( |
||||||
|
EmptyActualParameterSequence ast, Object o) { |
||||||
|
return new Integer(0); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitMultipleActualParameterSequence( |
||||||
|
MultipleActualParameterSequence ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
int argsSize1 = ((Integer) ast.AP.visit(this, frame)).intValue(); |
||||||
|
Frame frame1 = new Frame(frame, argsSize1); |
||||||
|
int argsSize2 = ((Integer) ast.APS.visit(this, frame1)).intValue(); |
||||||
|
return new Integer(argsSize1 + argsSize2); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitSingleActualParameterSequence( |
||||||
|
SingleActualParameterSequence ast, Object o) { |
||||||
|
return ast.AP.visit(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
// Type Denoters
|
||||||
|
public Object visitAnyTypeDenoter(AnyTypeDenoter ast, Object o) { |
||||||
|
return new Integer(0); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitArrayTypeDenoter(ArrayTypeDenoter ast, Object o) { |
||||||
|
int typeSize; |
||||||
|
if (ast.entity == null) { |
||||||
|
int elemSize = ((Integer) ast.T.visit(this, null)).intValue(); |
||||||
|
typeSize = Integer.parseInt(ast.IL.spelling) * elemSize; |
||||||
|
ast.entity = new TypeRepresentation(typeSize); |
||||||
|
writeTableDetails(ast); |
||||||
|
} else |
||||||
|
typeSize = ast.entity.size; |
||||||
|
return new Integer(typeSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitBoolTypeDenoter(BoolTypeDenoter ast, Object o) { |
||||||
|
if (ast.entity == null) { |
||||||
|
ast.entity = new TypeRepresentation(Machine.booleanSize); |
||||||
|
writeTableDetails(ast); |
||||||
|
} |
||||||
|
return new Integer(Machine.booleanSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitCharTypeDenoter(CharTypeDenoter ast, Object o) { |
||||||
|
if (ast.entity == null) { |
||||||
|
ast.entity = new TypeRepresentation(Machine.characterSize); |
||||||
|
writeTableDetails(ast); |
||||||
|
} |
||||||
|
return new Integer(Machine.characterSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitErrorTypeDenoter(ErrorTypeDenoter ast, Object o) { |
||||||
|
return new Integer(0); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitSimpleTypeDenoter(SimpleTypeDenoter ast, |
||||||
|
Object o) { |
||||||
|
return new Integer(0); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitIntTypeDenoter(IntTypeDenoter ast, Object o) { |
||||||
|
if (ast.entity == null) { |
||||||
|
ast.entity = new TypeRepresentation(Machine.integerSize); |
||||||
|
writeTableDetails(ast); |
||||||
|
} |
||||||
|
return new Integer(Machine.integerSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitRecordTypeDenoter(RecordTypeDenoter ast, Object o) { |
||||||
|
int typeSize; |
||||||
|
if (ast.entity == null) { |
||||||
|
typeSize = ((Integer) ast.FT.visit(this, new Integer(0))).intValue(); |
||||||
|
ast.entity = new TypeRepresentation(typeSize); |
||||||
|
writeTableDetails(ast); |
||||||
|
} else |
||||||
|
typeSize = ast.entity.size; |
||||||
|
return new Integer(typeSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, |
||||||
|
Object o) { |
||||||
|
int offset = ((Integer) o).intValue(); |
||||||
|
int fieldSize; |
||||||
|
|
||||||
|
if (ast.entity == null) { |
||||||
|
fieldSize = ((Integer) ast.T.visit(this, null)).intValue(); |
||||||
|
ast.entity = new Field(fieldSize, offset); |
||||||
|
writeTableDetails(ast); |
||||||
|
} else |
||||||
|
fieldSize = ast.entity.size; |
||||||
|
|
||||||
|
Integer offset1 = new Integer(offset + fieldSize); |
||||||
|
int recSize = ((Integer) ast.FT.visit(this, offset1)).intValue(); |
||||||
|
return new Integer(fieldSize + recSize); |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, |
||||||
|
Object o) { |
||||||
|
int offset = ((Integer) o).intValue(); |
||||||
|
int fieldSize; |
||||||
|
|
||||||
|
if (ast.entity == null) { |
||||||
|
fieldSize = ((Integer) ast.T.visit(this, null)).intValue(); |
||||||
|
ast.entity = new Field(fieldSize, offset); |
||||||
|
writeTableDetails(ast); |
||||||
|
} else |
||||||
|
fieldSize = ast.entity.size; |
||||||
|
|
||||||
|
return new Integer(fieldSize); |
||||||
|
} |
||||||
|
|
||||||
|
// Literals, Identifiers and Operators
|
||||||
|
public Object visitCharacterLiteral(CharacterLiteral ast, Object o) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitIdentifier(Identifier ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
if (ast.decl.entity instanceof KnownRoutine) { |
||||||
|
ObjectAddress address = ((KnownRoutine) ast.decl.entity).address; |
||||||
|
emit(Machine.CALLop, displayRegister(frame.level, address.level), |
||||||
|
Machine.CBr, address.displacement); |
||||||
|
} else if (ast.decl.entity instanceof UnknownRoutine) { |
||||||
|
ObjectAddress address = ((UnknownRoutine) ast.decl.entity).address; |
||||||
|
emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level, |
||||||
|
address.level), address.displacement); |
||||||
|
emit(Machine.CALLIop, 0, 0, 0); |
||||||
|
} else if (ast.decl.entity instanceof PrimitiveRoutine) { |
||||||
|
int displacement = ((PrimitiveRoutine) ast.decl.entity).displacement; |
||||||
|
if (displacement != Machine.idDisplacement) |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement); |
||||||
|
} else if (ast.decl.entity instanceof EqualityRoutine) { // "=" or "\="
|
||||||
|
int displacement = ((EqualityRoutine) ast.decl.entity).displacement; |
||||||
|
emit(Machine.LOADLop, 0, 0, frame.size / 2); |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitIntegerLiteral(IntegerLiteral ast, Object o) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitOperator(Operator ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
if (ast.decl.entity instanceof KnownRoutine) { |
||||||
|
ObjectAddress address = ((KnownRoutine) ast.decl.entity).address; |
||||||
|
emit(Machine.CALLop, displayRegister(frame.level, address.level), |
||||||
|
Machine.CBr, address.displacement); |
||||||
|
} else if (ast.decl.entity instanceof UnknownRoutine) { |
||||||
|
ObjectAddress address = ((UnknownRoutine) ast.decl.entity).address; |
||||||
|
emit(Machine.LOADop, Machine.closureSize, displayRegister(frame.level, |
||||||
|
address.level), address.displacement); |
||||||
|
emit(Machine.CALLIop, 0, 0, 0); |
||||||
|
} else if (ast.decl.entity instanceof PrimitiveRoutine) { |
||||||
|
int displacement = ((PrimitiveRoutine) ast.decl.entity).displacement; |
||||||
|
if (displacement != Machine.idDisplacement) |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement); |
||||||
|
} else if (ast.decl.entity instanceof EqualityRoutine) { // "=" or "\="
|
||||||
|
int displacement = ((EqualityRoutine) ast.decl.entity).displacement; |
||||||
|
emit(Machine.LOADLop, 0, 0, frame.size / 2); |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, displacement); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
// Value-or-variable names
|
||||||
|
public Object visitDotVname(DotVname ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
RuntimeEntity baseObject = (RuntimeEntity) ast.V.visit(this, frame); |
||||||
|
ast.offset = ast.V.offset + ((Field) ast.I.decl.entity).fieldOffset; |
||||||
|
// I.decl points to the appropriate record field
|
||||||
|
ast.indexed = ast.V.indexed; |
||||||
|
return baseObject; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitSimpleVname(SimpleVname ast, Object o) { |
||||||
|
ast.offset = 0; |
||||||
|
ast.indexed = false; |
||||||
|
return ast.I.decl.entity; |
||||||
|
} |
||||||
|
|
||||||
|
public Object visitSubscriptVname(SubscriptVname ast, Object o) { |
||||||
|
Frame frame = (Frame) o; |
||||||
|
RuntimeEntity baseObject; |
||||||
|
int elemSize, indexSize; |
||||||
|
|
||||||
|
baseObject = (RuntimeEntity) ast.V.visit(this, frame); |
||||||
|
ast.offset = ast.V.offset; |
||||||
|
ast.indexed = ast.V.indexed; |
||||||
|
elemSize = ((Integer) ast.type.visit(this, null)).intValue(); |
||||||
|
if (ast.E instanceof IntegerExpression) { |
||||||
|
IntegerLiteral IL = ((IntegerExpression) ast.E).IL; |
||||||
|
ast.offset = ast.offset + Integer.parseInt(IL.spelling) * elemSize; |
||||||
|
} else { |
||||||
|
// v-name is indexed by a proper expression, not a literal
|
||||||
|
if (ast.indexed) |
||||||
|
frame.size = frame.size + Machine.integerSize; |
||||||
|
indexSize = ((Integer) ast.E.visit(this, frame)).intValue(); |
||||||
|
if (elemSize != 1) { |
||||||
|
emit(Machine.LOADLop, 0, 0, elemSize); |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, |
||||||
|
Machine.multDisplacement); |
||||||
|
} |
||||||
|
if (ast.indexed) |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); |
||||||
|
else |
||||||
|
ast.indexed = true; |
||||||
|
} |
||||||
|
return baseObject; |
||||||
|
} |
||||||
|
|
||||||
|
// Programs
|
||||||
|
public Object visitProgram(Program ast, Object o) { |
||||||
|
return ast.C.visit(this, o); |
||||||
|
} |
||||||
|
|
||||||
|
public Encoder(ErrorReporter reporter) { |
||||||
|
this.reporter = reporter; |
||||||
|
nextInstrAddr = Machine.CB; |
||||||
|
elaborateStdEnvironment(); |
||||||
|
} |
||||||
|
|
||||||
|
private ErrorReporter reporter; |
||||||
|
|
||||||
|
// Generates code to run a program.
|
||||||
|
// showingTable is true iff entity description details
|
||||||
|
// are to be displayed.
|
||||||
|
public final void encodeRun(Program theAST, boolean showingTable) { |
||||||
|
tableDetailsReqd = showingTable; |
||||||
|
// startCodeGeneration();
|
||||||
|
theAST.visit(this, new Frame(0, 0)); |
||||||
|
emit(Machine.HALTop, 0, 0, 0); |
||||||
|
} |
||||||
|
|
||||||
|
// Decides run-time representation of a standard constant.
|
||||||
|
private final void elaborateStdConst(Declaration constDeclaration, |
||||||
|
int value) { |
||||||
|
|
||||||
|
if (constDeclaration instanceof ConstDeclaration) { |
||||||
|
ConstDeclaration decl = (ConstDeclaration) constDeclaration; |
||||||
|
int typeSize = ((Integer) decl.E.type.visit(this, null)).intValue(); |
||||||
|
decl.entity = new KnownValue(typeSize, value); |
||||||
|
writeTableDetails(constDeclaration); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Decides run-time representation of a standard routine.
|
||||||
|
private final void elaborateStdPrimRoutine(Declaration routineDeclaration, |
||||||
|
int routineOffset) { |
||||||
|
routineDeclaration.entity = new PrimitiveRoutine(Machine.closureSize, routineOffset); |
||||||
|
writeTableDetails(routineDeclaration); |
||||||
|
} |
||||||
|
|
||||||
|
private final void elaborateStdEqRoutine(Declaration routineDeclaration, |
||||||
|
int routineOffset) { |
||||||
|
routineDeclaration.entity = new EqualityRoutine(Machine.closureSize, routineOffset); |
||||||
|
writeTableDetails(routineDeclaration); |
||||||
|
} |
||||||
|
|
||||||
|
private final void elaborateStdRoutine(Declaration routineDeclaration, |
||||||
|
int routineOffset) { |
||||||
|
routineDeclaration.entity = new KnownRoutine(Machine.closureSize, 0, routineOffset); |
||||||
|
writeTableDetails(routineDeclaration); |
||||||
|
} |
||||||
|
|
||||||
|
private final void elaborateStdEnvironment() { |
||||||
|
tableDetailsReqd = false; |
||||||
|
elaborateStdConst(StdEnvironment.falseDecl, Machine.falseRep); |
||||||
|
elaborateStdConst(StdEnvironment.trueDecl, Machine.trueRep); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.notDecl, Machine.notDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.andDecl, Machine.andDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.orDecl, Machine.orDisplacement); |
||||||
|
elaborateStdConst(StdEnvironment.maxintDecl, Machine.maxintRep); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.addDecl, Machine.addDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.subtractDecl, Machine.subDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.multiplyDecl, Machine.multDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.divideDecl, Machine.divDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.moduloDecl, Machine.modDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.lessDecl, Machine.ltDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.notgreaterDecl, Machine.leDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.greaterDecl, Machine.gtDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.notlessDecl, Machine.geDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.chrDecl, Machine.idDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.ordDecl, Machine.idDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.eolDecl, Machine.eolDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.eofDecl, Machine.eofDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.getDecl, Machine.getDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.putDecl, Machine.putDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.getintDecl, Machine.getintDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.putintDecl, Machine.putintDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.geteolDecl, Machine.geteolDisplacement); |
||||||
|
elaborateStdPrimRoutine(StdEnvironment.puteolDecl, Machine.puteolDisplacement); |
||||||
|
elaborateStdEqRoutine(StdEnvironment.equalDecl, Machine.eqDisplacement); |
||||||
|
elaborateStdEqRoutine(StdEnvironment.unequalDecl, Machine.neDisplacement); |
||||||
|
} |
||||||
|
|
||||||
|
// Saves the object program in the named file.
|
||||||
|
|
||||||
|
public void saveObjectProgram(String objectName) { |
||||||
|
FileOutputStream objectFile = null; |
||||||
|
DataOutputStream objectStream = null; |
||||||
|
|
||||||
|
int addr; |
||||||
|
|
||||||
|
try { |
||||||
|
objectFile = new FileOutputStream(objectName); |
||||||
|
objectStream = new DataOutputStream(objectFile); |
||||||
|
|
||||||
|
addr = Machine.CB; |
||||||
|
for (addr = Machine.CB; addr < nextInstrAddr; addr++) |
||||||
|
Machine.code[addr].write(objectStream); |
||||||
|
objectFile.close(); |
||||||
|
} catch (FileNotFoundException s) { |
||||||
|
System.err.println("Error opening object file: " + s); |
||||||
|
} catch (IOException s) { |
||||||
|
System.err.println("Error writing object file: " + s); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
boolean tableDetailsReqd; |
||||||
|
|
||||||
|
public static void writeTableDetails(AST ast) { |
||||||
|
} |
||||||
|
|
||||||
|
// OBJECT CODE
|
||||||
|
|
||||||
|
// Implementation notes:
|
||||||
|
// Object code is generated directly into the TAM Code Store, starting at CB.
|
||||||
|
// The address of the next instruction is held in nextInstrAddr.
|
||||||
|
|
||||||
|
private int nextInstrAddr; |
||||||
|
|
||||||
|
// Appends an instruction, with the given fields, to the object code.
|
||||||
|
private void emit(int op, int n, int r, int d) { |
||||||
|
Instruction nextInstr = new Instruction(); |
||||||
|
if (n > 255) { |
||||||
|
reporter.reportRestriction("length of operand can't exceed 255 words"); |
||||||
|
n = 255; // to allow code generation to continue
|
||||||
|
} |
||||||
|
nextInstr.op = op; |
||||||
|
nextInstr.n = n; |
||||||
|
nextInstr.r = r; |
||||||
|
nextInstr.d = d; |
||||||
|
if (nextInstrAddr == Machine.PB) |
||||||
|
reporter.reportRestriction("too many instructions for code segment"); |
||||||
|
else { |
||||||
|
Machine.code[nextInstrAddr] = nextInstr; |
||||||
|
nextInstrAddr = nextInstrAddr + 1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Patches the d-field of the instruction at address addr.
|
||||||
|
private void patch(int addr, int d) { |
||||||
|
Machine.code[addr].d = d; |
||||||
|
} |
||||||
|
|
||||||
|
// DATA REPRESENTATION
|
||||||
|
|
||||||
|
public int characterValuation(String spelling) { |
||||||
|
// Returns the machine representation of the given character literal.
|
||||||
|
return spelling.charAt(1); |
||||||
|
// since the character literal is of the form 'x'}
|
||||||
|
} |
||||||
|
|
||||||
|
// REGISTERS
|
||||||
|
|
||||||
|
// Returns the register number appropriate for object code at currentLevel
|
||||||
|
// to address a data object at objectLevel.
|
||||||
|
private int displayRegister(int currentLevel, int objectLevel) { |
||||||
|
if (objectLevel == 0) |
||||||
|
return Machine.SBr; |
||||||
|
else if (currentLevel - objectLevel <= 6) |
||||||
|
return Machine.LBr + currentLevel - objectLevel; // LBr|L1r|...|L6r
|
||||||
|
else { |
||||||
|
reporter.reportRestriction("can't access data more than 6 levels out"); |
||||||
|
return Machine.L6r; // to allow code generation to continue
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Generates code to fetch the value of a named constant or variable
|
||||||
|
// and push it on to the stack.
|
||||||
|
// currentLevel is the routine level where the vname occurs.
|
||||||
|
// frameSize is the anticipated size of the local stack frame when
|
||||||
|
// the constant or variable is fetched at run-time.
|
||||||
|
// valSize is the size of the constant or variable's value.
|
||||||
|
|
||||||
|
private void encodeStore(Vname V, Frame frame, int valSize) { |
||||||
|
|
||||||
|
RuntimeEntity baseObject = (RuntimeEntity) V.visit(this, frame); |
||||||
|
// If indexed = true, code will have been generated to load an index value.
|
||||||
|
if (valSize > 255) { |
||||||
|
reporter.reportRestriction("can't store values larger than 255 words"); |
||||||
|
valSize = 255; // to allow code generation to continue
|
||||||
|
} |
||||||
|
if (baseObject instanceof KnownAddress) { |
||||||
|
ObjectAddress address = ((KnownAddress) baseObject).address; |
||||||
|
if (V.indexed) { |
||||||
|
emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), |
||||||
|
address.displacement + V.offset); |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); |
||||||
|
emit(Machine.STOREIop, valSize, 0, 0); |
||||||
|
} else { |
||||||
|
emit(Machine.STOREop, valSize, displayRegister(frame.level, |
||||||
|
address.level), address.displacement + V.offset); |
||||||
|
} |
||||||
|
} else if (baseObject instanceof UnknownAddress) { |
||||||
|
ObjectAddress address = ((UnknownAddress) baseObject).address; |
||||||
|
emit(Machine.LOADop, Machine.addressSize, displayRegister(frame.level, |
||||||
|
address.level), address.displacement); |
||||||
|
if (V.indexed) |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); |
||||||
|
if (V.offset != 0) { |
||||||
|
emit(Machine.LOADLop, 0, 0, V.offset); |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); |
||||||
|
} |
||||||
|
emit(Machine.STOREIop, valSize, 0, 0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Generates code to fetch the value of a named constant or variable
|
||||||
|
// and push it on to the stack.
|
||||||
|
// currentLevel is the routine level where the vname occurs.
|
||||||
|
// frameSize is the anticipated size of the local stack frame when
|
||||||
|
// the constant or variable is fetched at run-time.
|
||||||
|
// valSize is the size of the constant or variable's value.
|
||||||
|
|
||||||
|
private void encodeFetch(Vname V, Frame frame, int valSize) { |
||||||
|
|
||||||
|
RuntimeEntity baseObject = (RuntimeEntity) V.visit(this, frame); |
||||||
|
// If indexed = true, code will have been generated to load an index value.
|
||||||
|
if (valSize > 255) { |
||||||
|
reporter.reportRestriction("can't load values larger than 255 words"); |
||||||
|
valSize = 255; // to allow code generation to continue
|
||||||
|
} |
||||||
|
if (baseObject instanceof KnownValue) { |
||||||
|
// presumably offset = 0 and indexed = false
|
||||||
|
int value = ((KnownValue) baseObject).value; |
||||||
|
emit(Machine.LOADLop, 0, 0, value); |
||||||
|
} else if ((baseObject instanceof UnknownValue) || |
||||||
|
(baseObject instanceof KnownAddress)) { |
||||||
|
ObjectAddress address = (baseObject instanceof UnknownValue) ? ((UnknownValue) baseObject).address |
||||||
|
: ((KnownAddress) baseObject).address; |
||||||
|
if (V.indexed) { |
||||||
|
emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), |
||||||
|
address.displacement + V.offset); |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); |
||||||
|
emit(Machine.LOADIop, valSize, 0, 0); |
||||||
|
} else |
||||||
|
emit(Machine.LOADop, valSize, displayRegister(frame.level, |
||||||
|
address.level), address.displacement + V.offset); |
||||||
|
} else if (baseObject instanceof UnknownAddress) { |
||||||
|
ObjectAddress address = ((UnknownAddress) baseObject).address; |
||||||
|
emit(Machine.LOADop, Machine.addressSize, displayRegister(frame.level, |
||||||
|
address.level), address.displacement); |
||||||
|
if (V.indexed) |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); |
||||||
|
if (V.offset != 0) { |
||||||
|
emit(Machine.LOADLop, 0, 0, V.offset); |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); |
||||||
|
} |
||||||
|
emit(Machine.LOADIop, valSize, 0, 0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Generates code to compute and push the address of a named variable.
|
||||||
|
// vname is the program phrase that names this variable.
|
||||||
|
// currentLevel is the routine level where the vname occurs.
|
||||||
|
// frameSize is the anticipated size of the local stack frame when
|
||||||
|
// the variable is addressed at run-time.
|
||||||
|
|
||||||
|
private void encodeFetchAddress(Vname V, Frame frame) { |
||||||
|
|
||||||
|
RuntimeEntity baseObject = (RuntimeEntity) V.visit(this, frame); |
||||||
|
// If indexed = true, code will have been generated to load an index value.
|
||||||
|
if (baseObject instanceof KnownAddress) { |
||||||
|
ObjectAddress address = ((KnownAddress) baseObject).address; |
||||||
|
emit(Machine.LOADAop, 0, displayRegister(frame.level, address.level), |
||||||
|
address.displacement + V.offset); |
||||||
|
if (V.indexed) |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); |
||||||
|
} else if (baseObject instanceof UnknownAddress) { |
||||||
|
ObjectAddress address = ((UnknownAddress) baseObject).address; |
||||||
|
emit(Machine.LOADop, Machine.addressSize, displayRegister(frame.level, |
||||||
|
address.level), address.displacement); |
||||||
|
if (V.indexed) |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); |
||||||
|
if (V.offset != 0) { |
||||||
|
emit(Machine.LOADLop, 0, 0, V.offset); |
||||||
|
emit(Machine.CALLop, Machine.SBr, Machine.PBr, Machine.addDisplacement); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
/* |
||||||
|
* @(#)EqualityRoutine.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
public class EqualityRoutine extends RuntimeEntity { |
||||||
|
|
||||||
|
public EqualityRoutine() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
|
||||||
|
public EqualityRoutine(int size, int displacement) { |
||||||
|
super(size); |
||||||
|
this.displacement = displacement; |
||||||
|
} |
||||||
|
|
||||||
|
public int displacement; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)Field.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
public class Field extends RuntimeEntity { |
||||||
|
|
||||||
|
public Field() { |
||||||
|
super(); |
||||||
|
fieldOffset = 0; |
||||||
|
} |
||||||
|
|
||||||
|
public Field(int size, int fieldOffset) { |
||||||
|
super(size); |
||||||
|
this.fieldOffset = fieldOffset; |
||||||
|
} |
||||||
|
|
||||||
|
public int fieldOffset; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
/* |
||||||
|
* @(#)Frame.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
public class Frame { |
||||||
|
|
||||||
|
public Frame() { |
||||||
|
this.level = 0; |
||||||
|
this.size = 0; |
||||||
|
} |
||||||
|
|
||||||
|
public Frame(int level, Integer size) { |
||||||
|
this.level = level; |
||||||
|
this.size = size.intValue(); |
||||||
|
} |
||||||
|
|
||||||
|
public Frame(int level, int size) { |
||||||
|
this.level = level; |
||||||
|
this.size = size; |
||||||
|
} |
||||||
|
|
||||||
|
public Frame(Frame frame, int sizeIncrement) { |
||||||
|
this.level = frame.level; |
||||||
|
this.size = frame.size + sizeIncrement; |
||||||
|
} |
||||||
|
|
||||||
|
public Frame(Frame frame, Integer sizeIncrement) { |
||||||
|
this.level = frame.level; |
||||||
|
this.size = frame.size + sizeIncrement.intValue(); |
||||||
|
} |
||||||
|
|
||||||
|
protected int level; |
||||||
|
protected int size; |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)KnownAddress.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
public class KnownAddress extends RuntimeEntity { |
||||||
|
|
||||||
|
public KnownAddress() { |
||||||
|
super(); |
||||||
|
address = null; |
||||||
|
} |
||||||
|
|
||||||
|
public KnownAddress(int size, int level, int displacement) { |
||||||
|
super(size); |
||||||
|
address = new ObjectAddress(level, displacement); |
||||||
|
} |
||||||
|
|
||||||
|
public ObjectAddress address; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)KnownRoutine.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
public class KnownRoutine extends RuntimeEntity { |
||||||
|
|
||||||
|
public KnownRoutine() { |
||||||
|
super(); |
||||||
|
address = null; |
||||||
|
} |
||||||
|
|
||||||
|
public KnownRoutine(int size, int level, int displacement) { |
||||||
|
super(size); |
||||||
|
address = new ObjectAddress(level, displacement); |
||||||
|
} |
||||||
|
|
||||||
|
public ObjectAddress address; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)KnownValue.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
public class KnownValue extends RuntimeEntity { |
||||||
|
|
||||||
|
public KnownValue() { |
||||||
|
super(); |
||||||
|
value = 0; |
||||||
|
} |
||||||
|
|
||||||
|
public KnownValue(int size, int value) { |
||||||
|
super(size); |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
public int value; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
/* |
||||||
|
* @(#)ObjectAddress.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
public final class ObjectAddress { |
||||||
|
|
||||||
|
public ObjectAddress(int level, int displacement) { |
||||||
|
this.level = level; |
||||||
|
this.displacement = displacement; |
||||||
|
} |
||||||
|
|
||||||
|
public int level, displacement; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)PrimitiveRoutine.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
public class PrimitiveRoutine extends RuntimeEntity { |
||||||
|
|
||||||
|
public PrimitiveRoutine() { |
||||||
|
super(); |
||||||
|
displacement = 0; |
||||||
|
} |
||||||
|
|
||||||
|
public PrimitiveRoutine(int size, int displacement) { |
||||||
|
super(size); |
||||||
|
this.displacement = displacement; |
||||||
|
} |
||||||
|
|
||||||
|
public int displacement; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
/* |
||||||
|
* @(#)RuntimeEntity.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
// Run-time object
|
||||||
|
|
||||||
|
public abstract class RuntimeEntity { |
||||||
|
|
||||||
|
public final static int maxRoutineLevel = 7; |
||||||
|
|
||||||
|
public RuntimeEntity() { |
||||||
|
size = 0; |
||||||
|
} |
||||||
|
|
||||||
|
public RuntimeEntity(int size) { |
||||||
|
this.size = size; |
||||||
|
} |
||||||
|
|
||||||
|
public int size; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
/* |
||||||
|
* @(#)TypeRepresentation.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
public class TypeRepresentation extends RuntimeEntity { |
||||||
|
|
||||||
|
public TypeRepresentation(int size) { |
||||||
|
super(size); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/* |
||||||
|
* @(#)UnknownAddress.java 2.1 2003/10/07 |
||||||
|
* |
||||||
|
* Copyright (C) 1999, 2003 D.A. Watt and D.F. Brown |
||||||
|
* Dept. of Computing Science, University of Glasgow, Glasgow G12 8QQ Scotland |
||||||
|
* and School of Computer and Math Sciences, The Robert Gordon University, |
||||||
|
* St. Andrew Street, Aberdeen AB25 1HG, Scotland. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* This software is provided free for educational use only. It may |
||||||
|
* not be used for commercial purposes without the prior written permission |
||||||
|
* of the authors. |
||||||
|
*/ |
||||||
|
|
||||||
|
package Triangle.CodeGenerator; |
||||||
|
|
||||||
|
public class UnknownAddress extends RuntimeEntity { |
||||||
|
|
||||||
|
public UnknownAddress() { |
||||||
|
super(); |
||||||
|
address = null; |
||||||
|
} |
||||||
|
|
||||||
|
public UnknownAddress(int size, int level, int displacement) { |
||||||
|
super(size); |
||||||
|
address = new ObjectAddress(level, displacement); |
||||||
|
} |
||||||
|
|
||||||
|
public ObjectAddress address; |
||||||
|
|
||||||
|
} |
Some files were not shown because too many files have changed in this diff Show More
Reference in new issue