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