zusammengehörige if-else-endif erkennen

So, ich habe jetzt den javascript-Code für mein Java analog angepaßt. Allerdings wird bei mir gar nichts zurückgeschrieben!
Annahme meinerseits war nun, dass 'stack.top()' analog 'stack.peek()' ist. Außerdem kommt bei mir kein ELSEIF vor, sondern wenn, nur ELSE. Das Textfile ist auch das gleiche geblieben (analog @deepthroat) --> Ausgabe sollte also auch analog @deepthroat sein!
Ich denke, dass ich in meinem Code bestimmt etwas falsch geschrieben bzw. übersehen habe?!
Hier meine jetzige Fassung analog zum Vorschlag @deepthroat:
Java:
Stack stack = new Stack();
stack.push("true");
//ab hier jede Zeile vom Textfile durchgehen
...
   if( line.startsWith("IF") || line.startsWith("if") ){
      //wenn IF-Bedingung true zurückliefert, dann...
      if( ifcheck == true ){
         stack.push( stack.peek() + "true" );
      } else{
         stack.push( stack.peek() + "false" );
      }
   }else if( line.startsWith("ELSE") || line.startsWith("else") ){
      //bei ELSE Stack negieren
      if( stack.peek().equals("true") ){
         //Element löschen und (neues)negiertes Element hinzufügen
         stack.pop();
         stack.push( stack.peek() + "false" );
      } else{
         stack.pop();
         stack.push( stack.peek() + "true" );
      }
   } else if( line.startsWith("ENDIF") || line.startsWith("endif") ){
      //Wert vom Stack löschen
      stack.pop();
   }
   //nur relevante Zeilen speichern
   else if( stack.peek().equals("true") ){
      strBuffer.append(line + "\n");
   }
Was habe ich hier falsch gemacht bzw. übersehen?

Gruß.
 
Hi.

Wie bereits gesagt: es ist keine gute Idee da Strings auf den Stack zu schreiben. So wie es jetzt ist hast du auf dem Stack Werte wie "truefalse", "truetruefalsefalsefalse" etc.

Du solltest einfach den Typ boolean verwenden (bzw. die Klasse Boolean) wie ich bereits angesprochen hatte.

Gruß
 
Du solltest einfach den Typ boolean verwenden (bzw. die Klasse Boolean) wie ich bereits angesprochen hatte.
OMG, ich breche mir jetzt schon ewig einen aus der Krone, um nicht mit Strings, sondern mit Boolean zu arbeiten.
1. muß ich immer casten, wg. Java1.4
2. wie negiere ich einen Boolean? (Geht irgendwie nicht)
Java:
...
} else if( line.startsWith("ELSE") || line.startsWith("else") ){
   //bei ELSE Stack negieren
   Boolean bool = (Boolean) stack.pop();
   stack.push( ! bool );    //ist nicht erlaubt

Das leuchtet mir nun auch ein, dass ich keine Strings, sondern gleich die boolschen Werte auf den Stack speichern soll/kann... aber wie schon gesagt, es gibt noch einige Probleme :(
Wie schreibe ich das syntaktisch richtig?
 
Hi.
OMG, ich breche mir jetzt schon ewig einen aus der Krone, um nicht mit Strings, sondern mit Boolean zu arbeiten.
1. muß ich immer casten, wg. Java1.4
Autsch. ;)
2. wie negiere ich einen Boolean? (Geht irgendwie nicht)
Java:
...
} else if( line.startsWith("ELSE") || line.startsWith("else") ){
   //bei ELSE Stack negieren
   Boolean bool = (Boolean) stack.pop();
   stack.push( ! bool );    //ist nicht erlaubt
Versuch's mal so
Java:
Boolean bool = (Boolean)stack.pop();
stack.push(Boolean.valueOf(!bool.booleanValue()));
Oder evtl. einfacher (ohne Cast :)):
Java:
Object bool = stack.pop();
if (bool.equals(Boolean.TRUE)) {
  stack.push(Boolean.FALSE);
} else {
  stack.push(Boolean.TRUE);
}
Gruß
 
Zuletzt bearbeitet:
Hi.
...
Hier mal ein Test in JavaScript (kannst du ja einfach übersetzen):
Javascript:
function checkIF(line) {
  var exp = line.substr(3);
  return eval(exp);
}

var text = ("IF 1==9;textzeile1;if 8==8;textzeile2;if 3<7;textzeile3;endif;else;" +
		   "textzeile4;endif;textzeile5;ELSE;textzeile6;if 4<6;textzeile7;else;textzeile8;" +
		   "endif;textzeile9;ENDIF").split(';');

var stack = new Array();
stack.push(true); // vor ersten if Ausgabe angeschaltet

stack.top = function () {
	return this[this.length-1];
}

for (var i = 0; i < text.length; ++i) {
  var line = text[i];

  if(/^IF/i.test(line)) {
    stack.push(stack.top() && checkIF(line));
  } else if (/^ELSEIF/i.test(line)) { // Reihenfolge ist wichtig!
    if (!stack.top()) {
      stack.pop();
      stack.push(stack.top() && checkIF(line));
    }
  } else if (/^ELSE/i.test(line)) {
    var b = stack.pop();
    stack.push(stack.top() && !b);
  } else if (/^ENDIF/i.test(line)) {
    stack.pop();
  } else if (stack.top()) {
    // Im if/else Zweig dessen Bedingung "TRUE" ist...
	document.writeln(line);
  }
}
Wenn du das im Browser ausführst, erhälst du als Ergebnis:
Code:
textzeile6
textzeile7
textzeile9
Gruß

So, das habe ich jetzt 1:1 in Java1.4 übersetzt, oder! Leider bekomme ich nicht Deine Ergebnisse raus! Ich bekomme raus:
Code:
textzeile2
textzeile3
textzeile6
textzeile7
textzeile9
textzeile2 und textzeile3 sollten eigentlich nicht mit aufgeführt werden
Mein Code sieht jetzt so aus:
Java:
Stack stack = new Stack();
stack.push( new Boolean(true) );
//ab hier jede Zeile durchgehen
...
   if( line.startsWith("IF") || line.startsWith("if") ){
      //prüfen der IF-Bedingung, ob TRUE oder FALSE
      ifcheck = berechnenIf(sLinks, sOperator, sRechts);
      //ifcheck = true/false auf Stack schreiben
      stack.push( Boolean.valueOf(ifcheck) );
   } else if( line.startsWith("ELSE") || line.startsWith("else") ){
      //bei ELSE Stack negieren        			
      if ( stack.peek().equals(Boolean.TRUE) ) {
         stack.pop();
         stack.push( Boolean.FALSE );
      } else {
         stack.pop();
         stack.push( Boolean.TRUE );
      } 
   } else if( line.startsWith("ENDIF") || line.startsWith("endif") ){
      //Wert vom Stack löschen
      stack.pop();
   }
   //Auswahl der relevanten Zeilen
   else if( stack.peek().equals(Boolean.TRUE) ){
      //Zeilen hinzufügen
      strBuffer.append(line + "\n");
   }
Wo ich mir einen Fehler vorstellen könnte ist meine Abfrage für ELSE?! Bei Deinem javascript-Code siehts ja so aus:
Javascript:
var b = stack.pop();
stack.push(stack.top() && !b);
Doch wie setzt man das in Java1.4 um, speziell die &&-Verknüpfung oder was das sein soll? Das würde ja heißen (in Worten): stack.push setzt sich zusammen aus stack.peek() && der Negation aus dem gelöschten obersten Stackwert. Wie sieht das denn syntaktisch in Java1.4 aus? :confused:

Gruß
 
So, das habe ich jetzt 1:1 in Java1.4 übersetzt, oder!
Nicht ganz.. ;-)
Code:
   if( line.startsWith("IF") || line.startsWith("if") ){
      //prüfen der IF-Bedingung, ob TRUE oder FALSE
      ifcheck = berechnenIf(sLinks, sOperator, sRechts);
      //ifcheck = true/false auf Stack schreiben
      stack.push( Boolean.valueOf(ifcheck) );
Hier hast du vergessen den Wert des übergeordneten IF mittels peek() mit dem aktuellen Wert zu kombinieren. Du mußt das IF nur berechnen, wenn auf dem Stack der Wert TRUE liegt. Ansonsten einfach nur Boolean.FALSE auf den Stack schieben.
Wo ich mir einen Fehler vorstellen könnte ist meine Abfrage für ELSE?! Bei Deinem javascript-Code siehts ja so aus:
Javascript:
var b = stack.pop();
stack.push(stack.top() && !b);
Doch wie setzt man das in Java1.4 um, speziell die &&-Verknüpfung oder was das sein soll? Das würde ja heißen (in Worten): stack.push setzt sich zusammen aus stack.peek() && der Negation aus dem gelöschten obersten Stackwert. Wie sieht das denn syntaktisch in Java1.4 aus? :confused:
Fast genauso:
Java:
boolean b = stack.pop().equals(Boolean.TRUE);
stack.push(Boolean.valueOf(stack.peek().equals(Boolean.TRUE) && !b));
Gruß
 
Yeah, es geht endlich! :D
Ich habs jetzt mit verschiedenen IF-ELSE-ENDIF Konstellationen getestet - sieht sehr gut aus.
Hier nun der endgültige Code:
Java:
Stack stack = new Stack();
stack.push( new Boolean(true) );

//ab hier jede Zeile durchgehen
...
   if( line.startsWith("IF") || line.startsWith("if") ){
      //prüfen der IF-Bedingung, ob TRUE oder FALSE
      ifcheck = berechnenIf(sLinks, sOperator, sRechts);
      //wenn IF-Bedingung true zurückliefert, dann...
      if( stack.peek().equals(Boolean.TRUE) ){
         stack.push( Boolean.valueOf(stack.peek().equals(Boolean.TRUE) && ifcheck) );
      }else{
         stack.push( Boolean.FALSE );
      }
   } else if( line.startsWith("ELSE") || line.startsWith("else") ){
      //bei ELSE Stack negieren           
      boolean b = stack.pop().equals(Boolean.TRUE);
      stack.push( Boolean.valueOf(stack.peek().equals(Boolean.TRUE) && !b) );
   } else if( line.startsWith("ENDIF") || line.startsWith("endif") ){
      //Wert vom Stack löschen
      stack.pop();
   }
   //Auswahl der relevanten Zeilen
   else if( stack.peek().equals(Boolean.TRUE) ){
      //Zeilen hinzufügen
      strBuffer.append(line + "\n");
   }
Ich danke Dir echt wie verrückt... ich war schon kurz vorm Fenstersprung!

Eine Sache interessiert mich noch bzw. ist mir nicht ganz klar:
Java:
boolean b = stack.pop().equals(Boolean.TRUE);
stack.push( Boolean.valueOf(stack.peek().equals(Boolean.TRUE) && !b) );
Ist das eine logische Auswertung bzw. Verknüpfung?
Also ich meine: Bei einem ELSE wird das oberste Stackelement gelöscht, der Wert wird aber noch in b gespeichert (bspw. TRUE). Dann wird gepusht und zwar ein TRUE, wenn der nun oberste Wert (durch peek() ermittelt) TRUE ist UND (&&) b eben auch TRUE ist? Wäre b FALSE, dann würde auch nur FALSE gepusht werden, oder?
Das ist hier eigentlich die zentrale Stelle, welche bei der ganzen Geschichte in die Tiefe geht?!
Hab ich das so richtig interpretiert?
 
Hi.
Ich danke Dir echt wie verrückt... ich war schon kurz vorm Fenstersprung!
Oh je, ich hatte ja keine Ahnung wie schlimm es stand.. ;)
Eine Sache interessiert mich noch bzw. ist mir nicht ganz klar:
Java:
boolean b = stack.pop().equals(Boolean.TRUE);
stack.push( Boolean.valueOf(stack.peek().equals(Boolean.TRUE) && !b) );
Ist das eine logische Auswertung bzw. Verknüpfung?
Ja, der && Operator ist das logische UND.
Also ich meine: Bei einem ELSE wird das oberste Stackelement gelöscht, der Wert wird aber noch in b gespeichert (bspw. TRUE).
Richtig.
Dann wird gepusht und zwar ein TRUE, wenn der nun oberste Wert (durch peek() ermittelt) TRUE ist UND (&&) b eben auch TRUE ist?
Nein, falls !b WAHR ist, also wenn der peek() Wert TRUE und b FALSE ist.
Wäre b FALSE, dann würde auch nur FALSE gepusht werden, oder?
Der && Operator evaluiert nur zu TRUE wenn beide Operanden TRUE sind, also wenn peek() TRUE ist und wenn !b gleich TRUE (also b gleich FALSE) ist.

Gruß
 

Neue Beiträge

Zurück