eas.simulation.spatial.sim2D.marbSimulation.translator.Translator
Klasse zur Repräsentation eines endlichen Automaten mit Übersetzerfunktion.
Der Übersetzerautomat kann aus folgenden Zuständen bestehen (p und z sind die beim Zustzand gespeicherten Parameter; der Befehl des Zustands ist als Funktionsname vor die Klammer geschrieben):
- kno(p): Erzeuge Knoten mit dem Namen, der an Hp steht.
- bef(p, z): Setze Befehl des Knotens mit dem Namen an Adresse Hp auf den Wert an Adresse Hz.
- par(p, z): Setze Parameter des Knotens mit dem Namen an Adresse Hp auf den Wert an Adresse Hz.
- zus(p, z): Setze Zusatzparameter des Knotens mit dem Namen an Adresse Hp auf den Wert an Adresse Hz.
- KAN(p, z): Füge eine Kante von dem Zustand, der an Adresse Hp steht zu dem Zustand, der an Adresse Hz steht ein; die Kante erhält die Beschriftung, die Vorher durch T-X erzeugt wurde.
- T-X(p): Erweitere die aktuelle Bedingung um den Wert, der an Hp steht, addiert mit k, wobei gilt:
k = 0, falls X = 'C',
k = 255, falls X = 'H',
k = Konstanten.autTOscript(Hp) - Hp, falls X = 'O' (511, 512: T, F; 513-520: Comp; 521, 522: OP).
- R-X(p, z): Speichere an Adresse Hp (nicht an Adresse, die in Hp steht!) den Wert k mit:
k = z, falls X = 'C',
k = Wert an Adresse Hz, falls X = 'V'.
- NXT(): Idle-Befehl, der keine Aktion durchführt.
- ERG(p, z): Ergänze Zustand p mit Namen, der in Hp steht um eine ausgehende Kante nach zum Zustand, der in Hz steht, sodass immer mindestens eine ausgehende Kante von p true
ist. Wenn c1, c2, ... die Bedingungen der ausgehenden Kanten
Nach den Befehlen kno, bef, par, zus, KAN und ERG wird automatisch noch R-V(Hp, H101) und evtl. R-V(Hz, H102) durchgeführt, das heißt, dass in Adresse H101 nach jedem topologischen Befehl der Name des Ursprungsknotens steht; in H102 steht, im Fall, dass z benutzt wurde, der Wert der topologischen Änderung bzw. der Zielknoten der Kante. In allen Fällen, wo R-V(.,.) nicht durchgeführt wird, bleiben die Register erhalten. Insbesondere bleibt Hn mit n > 102 immer erhalten.
Nach jedem Zustandswechsel wird der Zeiger im Arbeitscode auf das nächste Token verschoben. Der Code gilt als abgearbeitet, wenn die Variable eoc den Wert true annimmt oder kein gültiger Zustand für den Automaten definiert ist (bspw. wenn der Übersetzerautomat gar keine Zustände besitzt).
Das aktuelle Token ist in Sensor H100 gespeichert.
Das nächste Token (look ahead) ist in Sensor H99 gespeichert (0 falls eoc).
Zu beachten ist, dass die Entscheidung, welche Transition aus einem Zustand heraus benutzt wird, getroffen wird, BEVOR der Code-Zeiger verschoben wird; H100 zeigt also zu dem Zeitpunkt noch das Token an, auf dem gerade gearbeitet wurde, H99 das, welches zum Zeitpunkt des nächsten Zustands aktuell sein wird.
Die Register sind in den Sensoren H101..Hn gespeichert mit n = 100 + #Register (gewöhnlich n = 103).
ACHTUNG: Um Inkonsistenzen zu vermeiden, sollte auf die Attribute codeZeiger, realSensArray, eoc und boc auch innerhalb der Klasse nicht direkt zugegriffen werden, sondern nur über Getter und Setter (sonst genau überlegen!).
@author Lukas König