* aktuellen Zustand keine Scriptinstruktion decodiert wurde.
*/
private String naechsterZustand() {
String inst = "";
Knoten aktZust = this.holeKnoten(this.aktZustand);
ZInfo info;
LinkedList<Transition> bedingungen;
int aktion;
int par, parStand;
int zusatz, zusatzStand;
int regNumZiel;
int regNumQuelle;
int scrAktion;
int k;
int zwisch;
if (this.boc || this.eoc) {
return null;
}
if (aktZust == null) {
aktZust = this.holeStartzustand();
if (aktZust == null) {
return null;
}
this.aktZustand = aktZust.holeName();
}
info = aktZust.getInfo();
aktion = info.getAktion();
if (!this.pars.getParValueBoolean("UseTranslatorWITHCompletingTransitions") && aktion == 106) {
StaticMethods.logError("\nTranslator-Befehl 106 aufgetreten in "
+ Arrays.deepToString(Thread.currentThread().getStackTrace()), this.pars);
throw new RuntimeException("\nTranslator-Befehl 106 aufgetreten.");
}
// Aktion ermitteln und zusammenstellen.
// This should work for both WC and WOC.
if (aktion == ConstantsTranslator.AUT_ADD_EDGE
|| aktion == ConstantsTranslator.AUT_ADD_NODE
|| aktion == ConstantsTranslator.AUT_CHANGE_ACT
|| aktion == ConstantsTranslator.AUT_CHANGE_AGE
|| aktion == ConstantsTranslator.AUT_CHANGE_PAR
|| aktion == ConstantsTranslator.AUT_EXTEND_COND_H
|| aktion == ConstantsTranslator.AUT_EXTEND_COND_C
|| aktion == ConstantsTranslator.AUT_EXTEND_COND_O
|| aktion == ConstantsTranslator.AUT_ERGAENZ_COND) {
// Topologische Aktionen:
parStand = info.getParam();
parStand = StaticMethods.modZwischen(
parStand,
StaticMethods.minVar(StaticMethods.MODUS_TRANSLATOR),
StaticMethods.maxVar(StaticMethods.MODUS_TRANSLATOR));
if (aktion == ConstantsTranslator.AUT_EXTEND_COND_H) {
k = 255;
} else if (aktion == ConstantsTranslator.AUT_EXTEND_COND_O) {
// Für Konstanten siehe Konstanten.autTOscript()
zwisch = StaticMethods.modZwischen(this.getH(parStand), 4, 16);
if (zwisch == 12) {
zwisch++;
}
// This should work for both WC and WOC.
k = ConstantsTranslator.autTOscript(zwisch) - zwisch;
// k = Konstanten.autTOscript(
// this.getH(parStand))
// - this.getH(parStand);
} else {
k = 0;
}
if (this.pars.getParValueBoolean("UseTranslatorWITHCompletingTransitions")) {
scrAktion = ConstantsTranslator.scrBefNum(aktion);
} else {
scrAktion = ConstantsTranslatorWOC.scrBefNum(aktion);
}
// System.out.println(
// aktion
// + ": "
// + ConstantsTranslatorWOC.scrBefNum(aktion)
// + " ("
// + ConstantsTranslator.scrBefNum(aktion)
// + ")");
inst += scrAktion;
inst += "," + (this.getH(parStand) + k);
// Zusatzparameter vorhanden?
// This should work in both WC and WOC mode.
if (ConstantsScript.BEF_PAR[scrAktion] == 2) {
zusatzStand = info.getAlter();
zusatzStand = StaticMethods.modZwischen(
zusatzStand,
StaticMethods.minVar(StaticMethods.MODUS_TRANSLATOR),
StaticMethods.maxVar(StaticMethods.MODUS_TRANSLATOR));
inst += "," + this.getH(zusatzStand);
// Speichere automatisch den Zusatzparameter in Reg2 (= H102).
// This should work for both WC and WOC.
if (aktion != ConstantsTranslator.AUT_EXTEND_COND_C
&& aktion != ConstantsTranslator.AUT_EXTEND_COND_H
&& aktion != ConstantsTranslator.AUT_EXTEND_COND_O) {
this.setH(
ConstantsTranslator.SENS_REG_MIN + 1,
this.getH(zusatzStand));
}
}
// Speichere automatisch den Parameter in Reg1 (= H101).
// This should work for both WC and WOC.
if (aktion != ConstantsTranslator.AUT_EXTEND_COND_C
&& aktion != ConstantsTranslator.AUT_EXTEND_COND_H
&& aktion != ConstantsTranslator.AUT_EXTEND_COND_O) {
this.setH(ConstantsTranslator.SENS_REG_MIN, this.getH(parStand));
}
} else if (aktion == ConstantsTranslator.AUT_REG_CONST) {
// Register-Aktion (Konstante setzen):
par = info.getParam();
zusatz = info.getAlter();
regNumZiel = StaticMethods.modZwischen(
par,
StaticMethods.minVar(StaticMethods.MODUS_TRANSLATOR),
StaticMethods.maxVar(StaticMethods.MODUS_TRANSLATOR));
this.setH(regNumZiel, zusatz);
} else if (aktion == ConstantsTranslator.AUT_REG_VAR) {
// Register-Aktion (anderes Register kopieren):
par = info.getParam();
zusatz = info.getAlter();
regNumQuelle = StaticMethods.modZwischen(
par,
StaticMethods.minVar(StaticMethods.MODUS_TRANSLATOR),
StaticMethods.maxVar(StaticMethods.MODUS_TRANSLATOR));
regNumZiel = StaticMethods.modZwischen(
zusatz,
StaticMethods.minVar(StaticMethods.MODUS_TRANSLATOR),
StaticMethods.maxVar(StaticMethods.MODUS_TRANSLATOR));
this.setH(regNumZiel, this.getH(regNumQuelle));
}
/*
* IDLE-Aktion (NXT): Bedeutet, dass nur der Code-Zeiger verschoben
* wird; wird nicht explizit behandelt.
*/
StaticMethods.log(
StaticMethods.LOG_STAGE1,
"Translator: Zustand "
+ this.aktZustand
+ ", Token "
+ this.getAktToken()
+ " / "
+ this.getLookAheadToken()
+ ": "
+ new Script(inst, this.pars),
this.pars);
// Folgezustand festlegen, Code-Zeiger verschieben.
bedingungen = info.getBeds();
this.aktZustand = -1;
for (Transition aktBed : bedingungen) {
if (aktBed.evaluiere(this)) {
this.aktZustand = aktBed.getFolgezustand();
break;