Unverified Commit 22a8d12c authored by petter's avatar petter

initial VAM checkin


git-svn-id: https://www2.in.tum.de/repos/vam@1 e840d55b-1d80-4f23-a9d8-6aec749d046a
parents
<project name="VAM" default ="all" basedir=".">
<property name="java" location="java" />
<property name="classes" location="bin" />
<property name="dist" location="dist"/>
<property name="etc" location="etc" />
<property environment="env" />
<path id="sources">
<fileset dir="${src}">
<include name="**/**.java" />
</fileset>
</path>
<!-- initialize the workspace -->
<target name="init">
<mkdir dir="${classes}" />
<mkdir dir="${dist}" />
</target>
<!-- deletes all build-related directories -->
<target name="clean">
<delete>
<fileset dir="." defaultexcludes="no" includes="**/*~"/>
<fileset dir="." defaultexcludes="no" includes="**/#*#"/>
</delete>
<delete dir="${classes}" />
<delete dir="${dist}" />
</target>
<!-- Compiles the .java files to the classes directory -->
<target name="classes" depends="init">
<depend srcdir="${java}" destdir="${classes}" cache="${etc}" />
<javac srcdir="${java}" destdir="${classes}" verbose="off" listfiles="off"
source="1.4" target="1.4" debug="off">
</javac>
</target>
<!-- Packs the classes into single .jar files -->
<target name="pack" depends="classes">
<jar jarfile="${dist}/vam.jar" basedir="${classes}">
<manifest>
<attribute name="Main-Class" value="Starter" />
<!--attribute name="Class-Path" value="derby.jar jna.jar" /-->
</manifest>
</jar>
<copy todir="${dist}"><fileset dir="${etc}"></fileset></copy>
<zip destfile="./vam.zip" basedir="${dist}" update="true"/>
</target>
<!-- build the whole project -->
<target name="all" depends="pack" />
<target name="run" depends="pack">
<java jar="${dist}/vam.jar" fork="true">
<assertions><disable /></assertions>
</java>
</target>
</project>
-----------------------------------
- VAM - Ein System zur
Visualisierung Abstrakter Maschinen
-----------------------------------
Starten:
java.bat (Windows)
oder
java.sh (Linux)
oder
java -jar vam.jar
Programm auswhlen:
"Program"-Button
oder
Men "VAM -> Open Program ..."
Maschine auswhlen:
Men "VAM -> Select Machine"
(Auswahl der Maschine erfolgt auch automatisch ber Dateiendung)
Verzeichnisse:
vam.jar : Java-Klassen und Quellen
examples: enthlt Beispiel-Programme
verschiedener Maschinen
-----------------------------------
Peter Ziewer
TU Mnchen
ziewer@in.tum.de
Lehrstuhl Informatik II
Prof. Dr. Helmut Seidl
http://www2.in.tum.de/
-----------------------------------
java -jar vam.jar
#!/bin/bash
java -jar vam.jar
import vam.base.*;
import vam.util.*;
public class Starter
{
static private void printUsage() {
System.out.println("Usage : java Starter <options>");
System.out.println("options : ");
System.out.println(" -load <file>\t\tProgramm einladen");
System.out.println(" -nohistory\t\tHistory-Funktion ausschalten");
System.out.println(" -stackbound n\t\tGibt max. Anzahl der sichtbaren Stack-Zellen an");
System.out.println("\t\t\t(Maximum : 30; n = 0 : unbegrenzt)");
System.out.println(" -usage\t\tGibt diesen Text aus");
System.exit(0);
}
static public void main ( String args[] )
{
boolean nohistory = false;
int stackBound = 25;
String file=null;
// Parameter abarbeiten
if (args.length == 1 && args[0].equals("-usage")) {
printUsage();
}
else {
for(int i = 0; i < args.length; i++) {
if(args[i].equals("-nohistory")) {
nohistory = true;
System.out.println("Starter : History-Funktion ausgeschaltet");
}
else if(args[i].equals("-stackbound") && args.length >= i+2) {
try {
stackBound = Integer.parseInt(args[i+1]);
}
catch(NumberFormatException ex) {
System.out.println("<<< Parameter ungueltig >>>");
printUsage();
}
i++;
}
//else if(args[i].equals("-load") && args.length >= i+2) {
// file = args[++i];
//}
else {
System.out.println("<<< Parameter ungueltig >>>");
printUsage();
}
}
}
ViewMachine vam = new ViewMachine();
//if(file!=null) vam.setFile(file);
if(nohistory == true) {
vam.nohistory();
}
vam.setStackBound(stackBound);
vam.run();
System.exit(0);
}
}
package vam.base;
import javax.swing.JLabel;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.border.Border;
import java.util.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
/**
Objekt zur Visualisierung von Speicherzellen.
*/
public class Cell extends JLabel implements MouseListener
{
public static final boolean POINTER = true;
public static final boolean NOPOINTER = false;
public static final boolean VISIBLE = true;
public static final boolean INVISIBLE = false;
// Der Wert der Zelle wird in JLabel gespeichert.
// AD : Wir brauchen dieses, um beim deallokieren
// einer Speicherzelle alle darauf zeigende Pointer
// verschwinden zu lassen (sieht besser aus)
public HashSet toPointerCells;
// Typ und Adress der Zelle
String type;
int address;
// fr Zeigerdartellung
boolean isPointer = false;
public Pointer pointer = null;
Color pointerColor;
int pointerInMode,pointerOutMode;
// Gruppen-Zugehrigkeit
CellGroup group;
// fr Animation
int actionCounter = 0;
boolean waitingForSync = false;
// fr Interaktion
Point mousePoint;
// Verwaltung der mglichen Typen
static HashMap typeData = new HashMap();
// Laufzeitumgebung
public static ViewMachine vm;
// Standardwerte
public static int stdWidth = 60;
public static int stdHeight= 20;
static Color stdBackgroundColor = Color.cyan;
static Color stdForegroundColor = Color.black;
static Border stdBorder = stdBorder();
static Border stdHighlightedBorder = stdHighlightedBorder();
public boolean removing;
/**
Initialisierung. Mu vor der Erzeugung der ersten Zelle aufgerufen werden.
@param viewMachine Gibt die zugehrige Laufzeitungebung an
*/
public static void init( ViewMachine viewMachine )
{
vm = viewMachine;
// Generierung vordefinierter Typen
defineType( "undefined", Color.green );
defineType( "int", Color.cyan );
defineType( "String", Color.cyan );
defineType( "Register", Color.blue, Color.white, 70, stdHeight, NOPOINTER );
defineType( "Pointer", Color.yellow, Color.black, stdWidth, stdHeight, POINTER );
}
/**
Erzeugt eine neue Zelle.
@param value Wert der Zelle
@param type Typ der Zelle
@param x x-Koordinate der Zelle
@param y y-Koordinate der Zelle
@param visible 'true' wenn die Zelle direkt sichtbar sein soll (ohne einblenden)
*/
public Cell( String value, String type, int x, int y, boolean visible )
{
super( value );
if( type==null ) type = "undefined";
TypeData td = typeData.containsKey(type) ?
(TypeData)typeData.get( type ) :
(TypeData)typeData.get( "undefined" );
toPointerCells = new HashSet();
this.type = type;
this.address = -1;
setHorizontalAlignment( JLabel.CENTER );
setOpaque( true );
setForeground( td.foregroundColor );
setBackground( td.backgroundColor );
setBorder( stdBorder() );
setBounds( x, y, td.width, td.height );
pointerOutMode = td.pointerOutMode;
pointerInMode = td.pointerInMode;
isPointer( td.isPointer );
updateToolTipText();
setVisible( visible );
vm.addVisualization( this );
addMouseListener(this);
removing = false;
}
/**
Erzeugt eine neue Zelle.
@param value Wert der Zelle
@param x x-Koordinate der Zelle
@param y y-Koordinate der Zelle
@param visible 'true' wenn die Zelle direkt sichtbar sein soll (ohne einblenden)
*/
public Cell( String value, int x, int y, boolean visible )
{
this( value, "undefined", x, y, visible );
}
/**
Erzeugt eine neue Zelle.
@param value Wert der Zelle
@param x x-Koordinate der Zelle
@param y y-Koordinate der Zelle
Die Zelle ist direkt sichtbar
*/
public Cell( String value, int x, int y )
{
this( value, "undefined", x, y, true );
}
/**
Erzeugt eine neue Zelle.
@param value Wert der Zelle
@param location Koordinaten der Zelle
Die Zelle ist direkt sichtbar
*/
public Cell( String value, Point location )
{
this( value, "undefined", location.x, location.y, true );
}
/**
Erzeugt eine neue Zelle.
@param value Wert der Zelle
@param type Typ der Zelle
@param location Koordinaten der Zelle
@param visible 'true' wenn die Zelle direkt sichtbar sein soll (ohne einblenden)
*/
public Cell( String value, String type, Point location, boolean visible )
{
this( value, type, location.x, location.y, visible );
}
/**
Erzeugt eine neue Zelle.
@param value Wert der Zelle
@param location Koordinaten der Zelle
@param visible 'true' wenn die Zelle direkt sichtbar sein soll (ohne einblenden)
*/
public Cell( String value, Point location, boolean visible )
{
this( value, location.x, location.y, visible );
}
/**
Erzeugt eine neue Zelle.
@param value Wert der Zelle
@param visible 'true' wenn die Zelle direkt sichtbar sein soll (ohne einblenden)
Koordinaten (0,0)
*/
public Cell( String value, boolean visible )
{
this( value, 0, 0, visible );
}
/**
Erzeugt eine neue Zelle.
@param value Wert der Zelle
Die Zelle ist direkt sichtbar bei den Koordinaten (0,0)
*/
public Cell( String value )
{
this( value, 0, 0, true );
}
/**
Erzeugt eine Kopie der Zelle (mit zugehrigem Zeiger).
@return Kopie der Zelle
*/
public Cell copy()
{
Cell newCell = new Cell( getText(), getType(), getLocation(), INVISIBLE );
newCell.setBounds( getBounds() );
newCell.setBackground( getBackground() );
newCell.setForeground( getForeground() );
newCell.pointerOutMode = pointerOutMode;
newCell.pointerInMode = pointerInMode;
newCell.isPointer = isPointer;
newCell.setVisible( isVisible() );
return newCell;
}
/**
Entfernt Visualisierung der Zelle (mit zugehrigem Zeiger).
*/
public void remove()
{
removePointer();
// AD : Zelle auch aus CellGroup entfernen
if(group != null) {
group.remove(this);
}
vm.removeVisualization( this );
}
/**
Liefert Gruppierung der Zelle.
@return Liefert Gruppierung
*/
public CellGroup getCellGroup()
{
return group;
}
/**
Festsetzen der Adresse die im Tool-Tip angezeigt werden soll.
@param address Adresse
*/
void setAddress( int address )
{
this.address = address;
updateToolTipText();
}
public int getAddress() {
return address;
}
/**
Neuberechnung des Tool Tip.
*/
void updateToolTipText()
{
setToolTipText( ((address==-1)?"":"#"+address+": ") + getText() +" ("+type+")"+ ((isPointer&type.equals("undefined"))?" is Pointer":"") );
}
/**
Setzt den Wert der Zelle.
@param value Neuer Wert der Zelle
*/
public void setValue( String value )
{
setText( value );
updateToolTipText();
updatePointer();
}
/**
Setzt den Wert der Zelle.
@param value Neuer Wert der Zelle
*/
public void setValue( int value )
{
setValue( Integer.toString(value) );
}
/**
Setzt den Wert der Zelle.
@param value Neuer Wert der Zelle
*/
public void setIntValue( int value )
{
setValue( Integer.toString(value) );
}
/**
Liefert den Wert der Zelle.
@return Liefert den Wert der Zelle zurck
*/
public String getValue()
{
return getText();
}
/**
Liefert den Wert der Zelle.
@return Liefert den Wert der Zelle zurck
*/
public int getIntValue()
{
return ViewMachine.parseInt( getValue() );
}
/**********
* Zeiger *
**********/
/**
Entfernt Visualisierung des Zeigers der Zelle.
*/
void removePointer()
{
if ( pointer!=null ) pointer.remove();
pointer = null;
isPointer = false;
}
// AD : entfernt alle auf diese Zelle zeigende Pointer
public void removeToPointers()
{
HashSet pts = new HashSet(toPointerCells);
Iterator it = pts.iterator();
Cell c;
while(it.hasNext()) {
c = (Cell)it.next();
c.removePointer();
if(!c.removing) {
c.isPointer = true;
}
}
toPointerCells.clear();
}
public void hideToPointers() {
Iterator it = toPointerCells.iterator();
Cell c;
while(it.hasNext()) {
c = (Cell)it.next();
if(c.pointer != null) {
c.pointer.setVisible(false);
}
}
}
public void unhideToPointers() {
Iterator it = toPointerCells.iterator();
Cell c;
while(it.hasNext()) {
c = (Cell)it.next();
if(c.pointer != null) {