Start with project
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -174,3 +174,5 @@ cython_debug/
|
|||||||
# PyPI configuration file
|
# PyPI configuration file
|
||||||
.pypirc
|
.pypirc
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.idea
|
||||||
|
|||||||
8
.idea/.gitignore
generated
vendored
8
.idea/.gitignore
generated
vendored
@@ -1,8 +0,0 @@
|
|||||||
# Default ignored files
|
|
||||||
/shelf/
|
|
||||||
/workspace.xml
|
|
||||||
# Editor-based HTTP Client requests
|
|
||||||
/httpRequests/
|
|
||||||
# Datasource local storage ignored files
|
|
||||||
/dataSources/
|
|
||||||
/dataSources.local.xml
|
|
||||||
10
.idea/Construction-of-Compilers.iml
generated
10
.idea/Construction-of-Compilers.iml
generated
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="PYTHON_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager">
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="jdk" jdkName="Python 3.13 (Construction-of-Compilers)" jdkType="Python SDK" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
||||||
8
.idea/dictionaries/project.xml
generated
8
.idea/dictionaries/project.xml
generated
@@ -1,8 +0,0 @@
|
|||||||
<component name="ProjectDictionaryState">
|
|
||||||
<dictionary name="project">
|
|
||||||
<words>
|
|
||||||
<w>btns</w>
|
|
||||||
<w>ldsp</w>
|
|
||||||
</words>
|
|
||||||
</dictionary>
|
|
||||||
</component>
|
|
||||||
30
.idea/inspectionProfiles/Project_Default.xml
generated
30
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -1,30 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<profile version="1.0">
|
|
||||||
<option name="myName" value="Project Default" />
|
|
||||||
<inspection_tool class="PyPep8Inspection" enabled="true" level="INFORMATION" enabled_by_default="true">
|
|
||||||
<option name="ignoredErrors">
|
|
||||||
<list>
|
|
||||||
<option value="E302" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</inspection_tool>
|
|
||||||
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
|
||||||
<option name="ignoredErrors">
|
|
||||||
<list>
|
|
||||||
<option value="N802" />
|
|
||||||
<option value="N806" />
|
|
||||||
<option value="N803" />
|
|
||||||
<option value="N801" />
|
|
||||||
<option value="N812" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</inspection_tool>
|
|
||||||
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
|
||||||
<option name="ignoredIdentifiers">
|
|
||||||
<list>
|
|
||||||
<option value="int.*" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</inspection_tool>
|
|
||||||
</profile>
|
|
||||||
</component>
|
|
||||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
6
.idea/inspectionProfiles/profiles_settings.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<settings>
|
|
||||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
|
||||||
<version value="1.0" />
|
|
||||||
</settings>
|
|
||||||
</component>
|
|
||||||
7
.idea/misc.xml
generated
7
.idea/misc.xml
generated
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="Black">
|
|
||||||
<option name="sdkName" value="Python 3.13 (python_clients)" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13 (Construction-of-Compilers)" project-jdk-type="Python SDK" />
|
|
||||||
</project>
|
|
||||||
8
.idea/modules.xml
generated
8
.idea/modules.xml
generated
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/Construction-of-Compilers.iml" filepath="$PROJECT_DIR$/.idea/Construction-of-Compilers.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
7
.idea/vcs.xml
generated
7
.idea/vcs.xml
generated
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
5
Project-01/uap25-pro01-tram/.gitignore
vendored
Normal file
5
Project-01/uap25-pro01-tram/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Java build dir
|
||||||
|
out
|
||||||
|
|
||||||
|
# IDEA
|
||||||
|
.idea
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package de.unitrier.st.uap.w25.tram;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AbstractMachine {
|
||||||
|
protected List<Integer> stack;
|
||||||
|
protected List<Instruction> prog;
|
||||||
|
|
||||||
|
protected int FP = 0;
|
||||||
|
protected int PP = 0;
|
||||||
|
protected int PC = 0;
|
||||||
|
protected int TOP = 0;
|
||||||
|
|
||||||
|
protected boolean debug = false;
|
||||||
|
|
||||||
|
public AbstractMachine(Instruction[] prog) {
|
||||||
|
this.prog = Arrays.asList(prog);
|
||||||
|
this.stack = new LinkedList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AbstractMachine(Instruction[] prog, Integer[] stack) {
|
||||||
|
this(prog);
|
||||||
|
|
||||||
|
this.stack = Arrays.asList(stack);
|
||||||
|
this.TOP = stack.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDebug(boolean debug) {
|
||||||
|
this.debug = debug;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute() {
|
||||||
|
for (Instruction instruction : prog) {
|
||||||
|
switch (instruction.getOpcode()) {
|
||||||
|
case Instruction.CONST:
|
||||||
|
int k = instruction.getArg1();
|
||||||
|
this.stack.set(this.TOP + 1, k);
|
||||||
|
this.TOP += 1;
|
||||||
|
this.PC += 1;
|
||||||
|
break;
|
||||||
|
case Instruction.LOAD: break;
|
||||||
|
case Instruction.STORE: break;
|
||||||
|
case Instruction.ADD: break;
|
||||||
|
case Instruction.SUB: break;
|
||||||
|
case Instruction.MUL: break;
|
||||||
|
case Instruction.DIV: break;
|
||||||
|
case Instruction.LT: break;
|
||||||
|
case Instruction.GT: break;
|
||||||
|
case Instruction.EQ: break;
|
||||||
|
case Instruction.NEQ: break;
|
||||||
|
case Instruction.IFZERO: break;
|
||||||
|
case Instruction.GOTO: break;
|
||||||
|
case Instruction.HALT: break;
|
||||||
|
case Instruction.NOP: break;
|
||||||
|
case Instruction.INVOKE: break;
|
||||||
|
case Instruction.RETURN: break;
|
||||||
|
case Instruction.POP: break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String config() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
package de.unitrier.st.uap.w25.tram;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
public class Assembler {
|
||||||
|
static Instruction[] readTRAMCode(String filename) {
|
||||||
|
LinkedList<Instruction> code = new LinkedList<Instruction>();
|
||||||
|
LinkedList<String> lines = new LinkedList<String>();
|
||||||
|
HashMap<String,Integer> labelmap = new HashMap<String,Integer>();
|
||||||
|
try (BufferedReader in = new BufferedReader(new FileReader(filename));) {
|
||||||
|
String line;
|
||||||
|
int lineNumber=0;
|
||||||
|
while((line = in.readLine())!=null)
|
||||||
|
{ line=line.trim();
|
||||||
|
if (line.startsWith("//") || line.startsWith("#") ) continue;
|
||||||
|
if (line.contains(":")) {
|
||||||
|
String[] labels=line.substring(0, line.indexOf(':')).split(",");
|
||||||
|
for (String label : labels) labelmap.put(label, lineNumber);
|
||||||
|
line = line.substring(line.indexOf(':')+1).trim();
|
||||||
|
}
|
||||||
|
lines.add(line);
|
||||||
|
lineNumber++;
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
File file = new File(filename);
|
||||||
|
System.err.println("Error reading file: " + file.getAbsolutePath());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
for(String line: lines) {
|
||||||
|
code.add(convertToInstruction(line, labelmap));
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Instruction[]) code.toArray(new Instruction[]{});
|
||||||
|
}
|
||||||
|
|
||||||
|
static Instruction convertToInstruction(String line, HashMap<String, Integer> labelmap) {
|
||||||
|
String[] parts = line.split("\\s+");
|
||||||
|
|
||||||
|
return new Instruction(
|
||||||
|
stringToOpcode(parts[0]),
|
||||||
|
argToNumber(parts,1,labelmap),
|
||||||
|
argToNumber(parts,2,labelmap),
|
||||||
|
argToNumber(parts,3,labelmap));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int stringToOpcode(String instr) {
|
||||||
|
switch(instr) {
|
||||||
|
case "CONST": return Instruction.CONST;
|
||||||
|
case "LOAD": return Instruction.LOAD;
|
||||||
|
case "STORE": return Instruction.STORE;
|
||||||
|
case "ADD": return Instruction.ADD;
|
||||||
|
case "SUB": return Instruction.SUB;
|
||||||
|
case "MUL": return Instruction.MUL;
|
||||||
|
case "DIV": return Instruction.DIV;
|
||||||
|
case "LT": return Instruction.LT;
|
||||||
|
case "GT": return Instruction.GT;
|
||||||
|
case "EQ": return Instruction.EQ;
|
||||||
|
case "NEQ": return Instruction.NEQ;
|
||||||
|
case "IFZERO": return Instruction.IFZERO;
|
||||||
|
case "GOTO": return Instruction.GOTO;
|
||||||
|
case "HALT": return Instruction.HALT;
|
||||||
|
case "NOP": return Instruction.NOP;
|
||||||
|
case "INVOKE": return Instruction.INVOKE;
|
||||||
|
case "RETURN": return Instruction.RETURN;
|
||||||
|
case "POP": return Instruction.POP; }
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Integer argToNumber(String[] parts, int index, HashMap<String, Integer> labelmap) {
|
||||||
|
if (index>parts.length-1) return 0;
|
||||||
|
String arg=parts[index];
|
||||||
|
try { return Integer.valueOf(arg); }
|
||||||
|
catch (NumberFormatException e) {
|
||||||
|
return labelmap.get(arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,330 @@
|
|||||||
|
/**
|
||||||
|
* Instructions for TRAM 2025
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.unitrier.st.uap.w25.tram;
|
||||||
|
|
||||||
|
public class Instruction
|
||||||
|
{
|
||||||
|
private int opcode;
|
||||||
|
private Integer arg1;
|
||||||
|
private Integer arg2;
|
||||||
|
private Integer arg3;
|
||||||
|
|
||||||
|
public final static int CONST = 1;
|
||||||
|
public final static int LOAD = 2;
|
||||||
|
public final static int STORE = 3;
|
||||||
|
public final static int ADD = 4;
|
||||||
|
public final static int SUB = 5;
|
||||||
|
public final static int MUL = 6;
|
||||||
|
public final static int DIV = 7;
|
||||||
|
public final static int LT = 8;
|
||||||
|
public final static int GT = 9;
|
||||||
|
public final static int EQ = 10;
|
||||||
|
public final static int NEQ = 11;
|
||||||
|
public final static int IFZERO = 12;
|
||||||
|
public final static int GOTO = 13;
|
||||||
|
public final static int HALT = 14;
|
||||||
|
public final static int NOP = 15;
|
||||||
|
public final static int INVOKE = 16;
|
||||||
|
public final static int RETURN = 17;
|
||||||
|
public final static int POP = 18;
|
||||||
|
|
||||||
|
|
||||||
|
public Instruction(int opcode, Integer arg1, Integer arg2, Integer arg3)
|
||||||
|
{
|
||||||
|
this(opcode, arg1, arg2);
|
||||||
|
this.arg3 = arg3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Instruction(int opcode, Integer arg1, Integer arg2)
|
||||||
|
{
|
||||||
|
this(opcode, arg1);
|
||||||
|
this.arg2 = arg2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Instruction(int opcode, Integer arg1)
|
||||||
|
{
|
||||||
|
this(opcode);
|
||||||
|
this.arg1 = arg1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Instruction(int opcode)
|
||||||
|
{
|
||||||
|
this.opcode = opcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Integer getArg1()
|
||||||
|
{
|
||||||
|
return arg1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setArg1(Integer arg1)
|
||||||
|
{
|
||||||
|
this.arg1 = arg1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Integer getArg2()
|
||||||
|
{
|
||||||
|
return arg2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setArg2(Integer arg2)
|
||||||
|
{
|
||||||
|
this.arg2 = arg2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Integer getArg3()
|
||||||
|
{
|
||||||
|
return arg3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setArg3(Integer arg3)
|
||||||
|
{
|
||||||
|
this.arg3 = arg3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int getOpcode()
|
||||||
|
{
|
||||||
|
return opcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setOpcode(int opcode)
|
||||||
|
{
|
||||||
|
this.opcode = opcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
String retStr = "";
|
||||||
|
|
||||||
|
switch (opcode)
|
||||||
|
{
|
||||||
|
case Instruction.CONST:
|
||||||
|
retStr += "CONST";
|
||||||
|
break;
|
||||||
|
case Instruction.LOAD:
|
||||||
|
retStr += "LOAD";
|
||||||
|
break;
|
||||||
|
case Instruction.STORE:
|
||||||
|
retStr += "STORE";
|
||||||
|
break;
|
||||||
|
case Instruction.ADD:
|
||||||
|
retStr += "ADD";
|
||||||
|
break;
|
||||||
|
case Instruction.SUB:
|
||||||
|
retStr += "SUB";
|
||||||
|
break;
|
||||||
|
case Instruction.MUL:
|
||||||
|
retStr += "MUL";
|
||||||
|
break;
|
||||||
|
case Instruction.DIV:
|
||||||
|
retStr += "DIV";
|
||||||
|
break;
|
||||||
|
case Instruction.LT:
|
||||||
|
retStr += "LT";
|
||||||
|
break;
|
||||||
|
case Instruction.GT:
|
||||||
|
retStr += "GT";
|
||||||
|
break;
|
||||||
|
case Instruction.EQ:
|
||||||
|
retStr += "EQ";
|
||||||
|
break;
|
||||||
|
case Instruction.NEQ:
|
||||||
|
retStr += "NEQ";
|
||||||
|
break;
|
||||||
|
case Instruction.IFZERO:
|
||||||
|
retStr += "IFZERO";
|
||||||
|
break;
|
||||||
|
case Instruction.GOTO:
|
||||||
|
retStr += "GOTO";
|
||||||
|
break;
|
||||||
|
case Instruction.HALT:
|
||||||
|
retStr += "HALT";
|
||||||
|
break;
|
||||||
|
case Instruction.NOP:
|
||||||
|
retStr += "NOP";
|
||||||
|
break;
|
||||||
|
case Instruction.INVOKE:
|
||||||
|
retStr += "INVOKE";
|
||||||
|
break;
|
||||||
|
case Instruction.RETURN:
|
||||||
|
retStr += "RETURN";
|
||||||
|
break;
|
||||||
|
case Instruction.POP:
|
||||||
|
retStr += "POP";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
retStr += "ERROR";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arg1 != null)
|
||||||
|
{
|
||||||
|
retStr += " " + arg1;
|
||||||
|
|
||||||
|
if (arg2 != null)
|
||||||
|
{
|
||||||
|
retStr += " " + arg2;
|
||||||
|
|
||||||
|
if (arg3 != null)
|
||||||
|
{
|
||||||
|
retStr += " " + arg3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return retStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************
|
||||||
|
* Sample Programs
|
||||||
|
***********************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quellkode: y = x*3+5*2
|
||||||
|
* Annahmen: Variable x durch Kellerzelle 0 und Variable y durch Kellerzelle 1 implementiert,
|
||||||
|
* sowie PP=0, FP=0 und TOP=1.
|
||||||
|
*/
|
||||||
|
static Instruction[] program1 = new Instruction[] {
|
||||||
|
new Instruction(Instruction.CONST, 6), // value for x
|
||||||
|
new Instruction(Instruction.STORE, 0, 0), // store x
|
||||||
|
new Instruction(Instruction.LOAD, 0, 0),
|
||||||
|
new Instruction(Instruction.CONST, 3),
|
||||||
|
new Instruction(Instruction.MUL),
|
||||||
|
new Instruction(Instruction.CONST, 5),
|
||||||
|
new Instruction(Instruction.CONST, 2),
|
||||||
|
new Instruction(Instruction.MUL),
|
||||||
|
new Instruction(Instruction.ADD),
|
||||||
|
new Instruction(Instruction.STORE, 1, 0),
|
||||||
|
new Instruction(Instruction.HALT) };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quellkode: x=10; if(x == 0) 100 else 200; 3
|
||||||
|
* Annahmen: Variable x durch Kellerzelle 0 implementiert, sowie PP=0, FP=0 und TOP=0.
|
||||||
|
*/
|
||||||
|
static Instruction[] program2 = new Instruction[] {
|
||||||
|
new Instruction(Instruction.CONST, 10),
|
||||||
|
new Instruction(Instruction.STORE, 0, 0),
|
||||||
|
new Instruction(Instruction.LOAD, 0, 0),
|
||||||
|
new Instruction(Instruction.IFZERO, 6), // --> iftrue
|
||||||
|
new Instruction(Instruction.CONST, 200),
|
||||||
|
new Instruction(Instruction.GOTO, 7), // --> goto
|
||||||
|
// iftrue
|
||||||
|
new Instruction(Instruction.CONST, 100),
|
||||||
|
// goto
|
||||||
|
new Instruction(Instruction.NOP),
|
||||||
|
new Instruction(Instruction.CONST, 3),
|
||||||
|
new Instruction(Instruction.HALT) };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quellkode: let square(x) { x*x }
|
||||||
|
* in square(10)
|
||||||
|
* Annahmen: Das Argument von square wird durch Kellerzelle 0 repraesentiert, sowie PP=0, FP=0
|
||||||
|
* und TOP=-1
|
||||||
|
*/
|
||||||
|
static Instruction[] program3 = new Instruction[] {
|
||||||
|
new Instruction(Instruction.CONST, 10),
|
||||||
|
new Instruction(Instruction.INVOKE, 1, 3, 0), // --> square
|
||||||
|
// return
|
||||||
|
new Instruction(Instruction.HALT),
|
||||||
|
// square
|
||||||
|
new Instruction(Instruction.LOAD, 0, 0),
|
||||||
|
new Instruction(Instruction.LOAD, 0, 0),
|
||||||
|
new Instruction(Instruction.MUL),
|
||||||
|
new Instruction(Instruction.RETURN) // --> return
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quellkode: let wrapper(number, threshold) {
|
||||||
|
* let square(x) {
|
||||||
|
* if (x*x > threshold) x
|
||||||
|
* else x*x
|
||||||
|
* }
|
||||||
|
* in square(number)
|
||||||
|
* }
|
||||||
|
* in wrapper(4, 10)
|
||||||
|
* Annahmen: Die Argumente von wrapper werden durch die Kellerzellen 0 und 1 repraesentiert,
|
||||||
|
* sowie PP=0, FP=0 und TOP=-1
|
||||||
|
*/
|
||||||
|
static Instruction[] program4 = new Instruction[] {
|
||||||
|
new Instruction(Instruction.CONST, 4),
|
||||||
|
new Instruction(Instruction.CONST, 10),
|
||||||
|
new Instruction(Instruction.INVOKE, 2, 4, 0), // --> wrapper
|
||||||
|
// return wrapper
|
||||||
|
new Instruction(Instruction.HALT),
|
||||||
|
// wrapper
|
||||||
|
new Instruction(Instruction.LOAD, 0, 0),
|
||||||
|
new Instruction(Instruction.INVOKE, 1, 7, 0), // --> square
|
||||||
|
// return square
|
||||||
|
new Instruction(Instruction.RETURN),
|
||||||
|
// square
|
||||||
|
new Instruction(Instruction.LOAD, 0, 0),
|
||||||
|
new Instruction(Instruction.LOAD, 0, 0),
|
||||||
|
new Instruction(Instruction.MUL),
|
||||||
|
new Instruction(Instruction.LOAD, 1, 1),
|
||||||
|
new Instruction(Instruction.GT),
|
||||||
|
new Instruction(Instruction.IFZERO, 15),
|
||||||
|
new Instruction(Instruction.LOAD, 0, 0),
|
||||||
|
new Instruction(Instruction.RETURN), // --> return square
|
||||||
|
new Instruction(Instruction.LOAD, 0, 0),
|
||||||
|
new Instruction(Instruction.LOAD, 0, 0),
|
||||||
|
new Instruction(Instruction.MUL),
|
||||||
|
new Instruction(Instruction.RETURN) // --> return square
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* let f (x, y, z) {
|
||||||
|
* x = y + z;
|
||||||
|
* if ( y == 3) then
|
||||||
|
* 15
|
||||||
|
* else
|
||||||
|
* f ( z = 3 ; 4 , y, z)
|
||||||
|
* } in f (2, 3, 4)
|
||||||
|
*
|
||||||
|
* Annahmen: keine
|
||||||
|
*/
|
||||||
|
static Instruction[] program5 = new Instruction[] {
|
||||||
|
new Instruction(Instruction.GOTO, 23), // --> L1
|
||||||
|
new Instruction(Instruction.LOAD, 1, 0), // LF
|
||||||
|
new Instruction(Instruction.LOAD, 2, 0),
|
||||||
|
new Instruction(Instruction.ADD),
|
||||||
|
new Instruction(Instruction.STORE, 0, 0),
|
||||||
|
new Instruction(Instruction.LOAD, 0, 0),
|
||||||
|
new Instruction(Instruction.POP),
|
||||||
|
new Instruction(Instruction.LOAD, 1, 0),
|
||||||
|
new Instruction(Instruction.CONST, 3),
|
||||||
|
new Instruction(Instruction.EQ),
|
||||||
|
new Instruction(Instruction.IFZERO, 13), // --> L2
|
||||||
|
new Instruction(Instruction.CONST, 15),
|
||||||
|
new Instruction(Instruction.GOTO, 21), // --> L3
|
||||||
|
new Instruction(Instruction.CONST, 3), // L2
|
||||||
|
new Instruction(Instruction.STORE, 2, 0),
|
||||||
|
new Instruction(Instruction.LOAD, 2, 0),
|
||||||
|
new Instruction(Instruction.POP),
|
||||||
|
new Instruction(Instruction.CONST, 4),
|
||||||
|
new Instruction(Instruction.LOAD, 1, 0),
|
||||||
|
new Instruction(Instruction.LOAD, 2, 0),
|
||||||
|
new Instruction(Instruction.INVOKE, 3, 1, 1), // --> LF
|
||||||
|
new Instruction(Instruction.NOP), // L3
|
||||||
|
new Instruction(Instruction.RETURN),
|
||||||
|
new Instruction(Instruction.CONST, 2), // L1
|
||||||
|
new Instruction(Instruction.CONST, 3),
|
||||||
|
new Instruction(Instruction.CONST, 4),
|
||||||
|
new Instruction(Instruction.INVOKE, 3, 1, 0), // --> LF
|
||||||
|
new Instruction(Instruction.HALT)
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package de.unitrier.st.uap.w25.tram;
|
||||||
|
|
||||||
|
final class Main
|
||||||
|
{
|
||||||
|
private Main(){}
|
||||||
|
|
||||||
|
public static void main(String[] argv)
|
||||||
|
{
|
||||||
|
Instruction[] code = Assembler.readTRAMCode(
|
||||||
|
// "tramcode/square.tram"
|
||||||
|
// "tramcode/wrapper.tram"
|
||||||
|
// "tramcode/example1.tram"
|
||||||
|
// "tramcode/example2.tram"
|
||||||
|
//"tramcode/example3.tram"
|
||||||
|
"tramcode/test.tram"
|
||||||
|
);
|
||||||
|
|
||||||
|
int lineNr=0;
|
||||||
|
for(Instruction instr: code) {
|
||||||
|
if (instr != null) {
|
||||||
|
System.out.println(String.format("%03d", lineNr) + "| " + instr.toString());
|
||||||
|
lineNr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Create an instance of the abstract machine with reasonable parameters
|
||||||
|
}
|
||||||
|
}
|
||||||
14
Project-01/uap25-pro01-tram/tramcode/example1.tram
Normal file
14
Project-01/uap25-pro01-tram/tramcode/example1.tram
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// Quellkode: y = x*3+5*2
|
||||||
|
// Annahmen: Variable x durch Kellerzelle 0 und Variable y durch Kellerzelle 1 implementiert,
|
||||||
|
// sowie PP=0, FP=0 und TOP=1.
|
||||||
|
CONST 6
|
||||||
|
STORE 0 0
|
||||||
|
LOAD 0 0
|
||||||
|
CONST 3
|
||||||
|
MUL
|
||||||
|
CONST 5
|
||||||
|
CONST 2
|
||||||
|
MUL
|
||||||
|
ADD
|
||||||
|
STORE 1 0
|
||||||
|
HALT
|
||||||
13
Project-01/uap25-pro01-tram/tramcode/example2.tram
Normal file
13
Project-01/uap25-pro01-tram/tramcode/example2.tram
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
// Quellkode: x=10; if(x == 0) 100 else 200; 3
|
||||||
|
// Annahmen: Variable x durch Kellerzelle 0 implementiert, sowie PP=0, FP=0 und TOP=0.
|
||||||
|
//
|
||||||
|
CONST 10
|
||||||
|
STORE 0 0
|
||||||
|
LOAD 0 0
|
||||||
|
IFZERO L1
|
||||||
|
CONST 200
|
||||||
|
GOTO L2
|
||||||
|
L1: CONST 100
|
||||||
|
L2: NOP
|
||||||
|
CONST 3
|
||||||
|
HALT
|
||||||
37
Project-01/uap25-pro01-tram/tramcode/example3.tram
Normal file
37
Project-01/uap25-pro01-tram/tramcode/example3.tram
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
// Quellkode: let f (x, y, z) {
|
||||||
|
// x = y + z;
|
||||||
|
// if ( y == 3) then
|
||||||
|
// 15
|
||||||
|
// else
|
||||||
|
// f ( z = 3 ; 4 , y, z)
|
||||||
|
// } in f (2, 3, 4)
|
||||||
|
//
|
||||||
|
// Annahmen: keine
|
||||||
|
GOTO L1
|
||||||
|
LF: LOAD 1 0
|
||||||
|
LOAD 2 0
|
||||||
|
ADD
|
||||||
|
STORE 0 0
|
||||||
|
LOAD 0 0
|
||||||
|
POP
|
||||||
|
LOAD 1 0
|
||||||
|
CONST 3
|
||||||
|
EQ
|
||||||
|
IFZERO L2
|
||||||
|
CONST 15
|
||||||
|
GOTO L3
|
||||||
|
CONST 3
|
||||||
|
STORE 2 0
|
||||||
|
LOAD 2 0
|
||||||
|
POP
|
||||||
|
CONST 4
|
||||||
|
LOAD 1 0
|
||||||
|
LOAD 2 0
|
||||||
|
INVOKE 3 LF 1
|
||||||
|
L3: NOP
|
||||||
|
RETURN
|
||||||
|
L1: CONST 2
|
||||||
|
CONST 3
|
||||||
|
CONST 4
|
||||||
|
INVOKE 3 LF 0
|
||||||
|
HALT
|
||||||
11
Project-01/uap25-pro01-tram/tramcode/square.tram
Normal file
11
Project-01/uap25-pro01-tram/tramcode/square.tram
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
// Quellkode: let square(x) { x*x }
|
||||||
|
// in square(10)
|
||||||
|
// Annahmen: Das Argument von square wird durch Kellerzelle 0 repraesentiert,
|
||||||
|
// sowie PP=0, FP=0 und TOP=-1
|
||||||
|
CONST 10
|
||||||
|
INVOKE 1 LSQUARE 0
|
||||||
|
HALT
|
||||||
|
LSQUARE: LOAD 0 0
|
||||||
|
LOAD 0 0
|
||||||
|
MUL
|
||||||
|
RETURN
|
||||||
28
Project-01/uap25-pro01-tram/tramcode/test.tram
Normal file
28
Project-01/uap25-pro01-tram/tramcode/test.tram
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
GOTO L2
|
||||||
|
L1: LOAD 0 0
|
||||||
|
CONST 0
|
||||||
|
EQ
|
||||||
|
IFZERO L3
|
||||||
|
CONST 0
|
||||||
|
GOTO L4
|
||||||
|
L3: LOAD 0 0
|
||||||
|
CONST 1
|
||||||
|
EQ
|
||||||
|
IFZERO L5
|
||||||
|
CONST 1
|
||||||
|
GOTO L6
|
||||||
|
L5: LOAD 0 0
|
||||||
|
CONST 1
|
||||||
|
SUB
|
||||||
|
INVOKE 1 L1 1
|
||||||
|
LOAD 0 0
|
||||||
|
CONST 2
|
||||||
|
SUB
|
||||||
|
INVOKE 1 L1 1
|
||||||
|
ADD
|
||||||
|
L6: NOP
|
||||||
|
L4: NOP
|
||||||
|
RETURN
|
||||||
|
L2: CONST 6
|
||||||
|
INVOKE 1 L1 0
|
||||||
|
HALT
|
||||||
29
Project-01/uap25-pro01-tram/tramcode/wrapper.tram
Normal file
29
Project-01/uap25-pro01-tram/tramcode/wrapper.tram
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
// Quellkode: let wrapper(number, threshold) {
|
||||||
|
// let square(x) {
|
||||||
|
// if (x*x > threshold) x
|
||||||
|
// else x*x
|
||||||
|
// }
|
||||||
|
// in square(number)
|
||||||
|
// }
|
||||||
|
// in wrapper(4, 10)
|
||||||
|
// Annahmen: Die Argumente von wrapper werden durch die Kellerzellen 0 und 1 repraesentiert,
|
||||||
|
// sowie PP=0, FP=0 und TOP=-1
|
||||||
|
CONST 4
|
||||||
|
CONST 10
|
||||||
|
INVOKE 2 LWRAPPER 0
|
||||||
|
HALT
|
||||||
|
LWRAPPER: LOAD 0 0
|
||||||
|
INVOKE 1 LSQUARE 0
|
||||||
|
RETURN
|
||||||
|
LSQUARE: LOAD 0 0
|
||||||
|
LOAD 0 0
|
||||||
|
MUL
|
||||||
|
LOAD 1 1
|
||||||
|
GT
|
||||||
|
IFZERO L1
|
||||||
|
LOAD 0 0
|
||||||
|
RETURN
|
||||||
|
L1: LOAD 0 0
|
||||||
|
LOAD 0 0
|
||||||
|
MUL
|
||||||
|
RETURN
|
||||||
11
Project-01/uap25-pro01-tram/uap25-pro01-tram.iml
Normal file
11
Project-01/uap25-pro01-tram/uap25-pro01-tram.iml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
Reference in New Issue
Block a user