Parsing Java

Chessko

Mitglied
Hey Leute!

Ich möchte einen Parser in mein MUD notwendiger Weise intigrieren.

Dazu will ich zu erst Zeilenweise aus der Konsole auslesen.

Java:
import java.util.*;

public class Eingabe {
   private Scanner scanner;
   
   public Eingabe() {
      scanner = new Scanner(System.in);
      boolean quit = false;

      while(!quit){
      if(scanner.next().equals("stop")) {quit = true;}
      else {System.out.print("Eingabe: ");}
    }
   }
 }

Erstes Problem der Code läuft nicht. Bzw. die virtuelle Maschine streikt. Also liegt es an der Schleife, aber wo?
Meines Erachtens liegt der fehler beim boolean quit.
Gibt es eine bessere Möglichkeit, wie könnt ich den Code modifizieren, so dass er funktioniert?


...

Wenn der Code dann funktioniert möchte ich, dass das eingegebene Wort in den Parser weitergereicht wird.

Da mein MUD ziemlich groß ist, wird ein rekursiver parser wohl unübersichtlich. Via Google bin ich leider nicht fündig geworden, auf der Suche nach einem guten Beispiel-Parser.


Er sollte folgendes können:

Wörter werden eingespeist -> Splitte die Wörte auf -> suche Methode und Instanz -> Führe aus

z.B. Eingabe: take beer -> meth=take und inst=beer -> do take(beer)


Gruß Chessko
 
Erstes Problem der Code läuft nicht. Bzw. die virtuelle Maschine streikt.
Der Aussage entnehme ich, dass die Fehlerangabe genau so lautet: "NöIchStreikeException"?

Gibt es eine bessere Möglichkeit, wie könnt ich den Code modifizieren, so dass er funktioniert?
Ja, die Eingabe nicht in dem Konstruktor machen.

MUD wie Multi User Dungeon? Wenn ja, dann solltest du vllt erstmal etwas die Grundlagen lernen, bevor du etwas größeres versuchst. Wenn nein, dann bleibt der Vorschlag dennoch.
 
Nein es kommt keine Exception. Die Maschine rechnet und rechnet einfach bis zum "get-no".

Dieser Code funktioniert z.B. super! Allerdings ist dieser darauf ausgelegt: *Schleife so lange durchlaufen wie die Eingabe gleich bleibt.*

Ich möchte allerdings: *Schleife so lange durchlaufen bis das Wort "stop" eingegeben wird.*



Java:
import java.util.*;

public class Eingabe {
   private Scanner scanner;
   
   public Eingabe() {
      scanner = new Scanner(System.in);

      do {
         System.out.print("Weiter eingeben? y? ");
         System.out.println(scanner.next());
      }
      while(scanner.next().equals("y"));
   }
}


Das Hauptproblem ist wie schon gesagt, das boolean quit, weil while nicht true/false unterscheiden kann, da muss es eine Ersatzlösung geben.


Wenn es *unequals("stop")* geben würde, wäre die Sache schon fertig.
 
Dieser Code funktioniert z.B. super! Allerdings ist dieser darauf ausgelegt: *Schleife so lange durchlaufen wie die Eingabe gleich bleibt.*
Keiner von den 2 Codeschnipsel von dir ist dafür ausgelegt dies zu machen :bahnhof:
Ich möchte allerdings: *Schleife so lange durchlaufen bis das Wort "stop" eingegeben wird.*
Das sollte der 1. Code machen, auch wenn etwas versetzt

[JAVA=9]
do {
System.out.print("Weiter eingeben? y? ");
System.out.println(scanner.next());
}
while(scanner.next().equals("y"));
[/code]
Der Code macht nur bedingt Sinn, weil dann, wo du die Benutzereingabe abfangen musst, lässt du die ins Nirvana laufen und dann soll der Benutzer aus irgendeinem Grund noch mal eine Eingabe machen.
Das Hauptproblem ist wie schon gesagt, das boolean quit, weil while nicht true/false unterscheiden kann, da muss es eine Ersatzlösung geben.
??? :autsch:
Wenn es *unequals("stop")* geben würde, wäre die Sache schon fertig.
das Gegenteil von "gleich" ist "nicht gleich", ergo:
Code:
a.equals(b)
und das Gegenteil:
Code:
!a.equals(b)
 
!equal funktioniert nicht.

Der erste Code scheint im Gegenteil zum zweiten nicht Konstruktor fähig zu sein.

Ich mache es jetzt als Methode. - Und melde mich dann wieder, wenn ich den Parser zusammen setze.


Sry für die Zeitverschwendung so weit.
 
Die Codes waren vollkommen in Ordnung.

Java:
import java.util.*;

public class Calc {
   private Scanner scanner;
   
   public Calc() {
      scanner = new Scanner(System.in);

      do {
         System.out.print("Eingabe: ");
      }
      while(!scanner.next().equals("stop"));
   }

}


Es lag an der Konsole von der IDE.
Die hat keine Exception angezeigt, weil sie einfach mal gar nichts mehr angezeigt hat, sie hatte sich schlicht aufgehängt. :autsch:
 
Also ich habe die Struktur meines Parsers so weit fertig. Teilweise funktioniert es, teilweise nicht.

Mir geht es nun speziell um die Teile die nicht klappen.


Wenn ich z.B. eingebe "use door south" gibt er mir false aus, sollte aber true ausgeben.

Er soll aber Strukturen der Art "use door" dir erkennen. Mit dir ist alles in Ordnung. Der Fehler muss in useDoor() liegen.

Wie es mit der Struktur x y dir funktionieren würde weiß ich, daß möchte ich hier aber nicht.

Hoffe jemand sieht den Fehler.

Java:
  public static boolean parse(String line) {
    input = line;
    index = 0;
  
    try {
      return command();
    } catch (RAParseException e) {
      return false;
    }
  }

  private static boolean command() throws RAParseException {
    return useDoor() && index >= input.length();
  }

   private static boolean useDoor() throws RAParseException {
    if (index < input.length() - 8) {
    String subs = input.substring(index, index+8);
    if (!subs.equals("use door")) {
      return false;
    }
    }
    if (index >= input.length() || input.charAt(index) != ' ') {
      return false;
    }
    index++;
    return dir();
  } 

  private static boolean dir() throws RAParseException {
    if (index <= input.length() - 4) {
      String subs = input.substring(index, index+4);
      if (subs.equals("east")) {
        index += 4;
        return true;
      }
      if (subs.equals("west")) {
        index += 4;
        return true;
      }
    }
    if (index <= input.length()-5) {
      String subs = input.substring(index, index+5);
      if (subs.equals("south")) {
        index += 5;
        return true;
      }
      if (subs.equals("north")) {
        index += 5;
        return true;
      }
    }
    return false;
  }

Gruß Chessko
 
Zeile 36 sieht kryptisch aus. Das 1. Zeichen ist nicht ' ', deswegen gibt er vermutlich auch false zurück.
Aber vllt wären ein paar Debugausgaben angebracht, wie "Untersuche xy", "rufe z() auf" etc. Dann erkennst du es auch selber
 
Ich habe es jetzt mit einem extra eingeführten boolean balance gelöst und es klappt.

Java:
    private static boolean useDoor() throws RAParseException {
    boolean balance = false;    
    if (index < input.length() - 8) {
      String subs = input.substring(index, index+8);
      if (subs.equals("use door")) {
        index += 8;
        balance = true;
      }
    }
    
    if (!balance) {return false;}

    
    if (index >= input.length()
    || input.charAt(index) != ' ') {return false;}
    index++;
    return dir();

  }

Ich melde mich wieder, wenn ich nicht weiter komme 😱
 
In einem Buch bei mir steht bei einem Parsing Beispiel für rekursives Parsen:

zeichen = a {a}
a = 'a'|...|'z'

Ist mit a {a} gemeint, dass man das Zeichen a in einen String umwandeln soll?
 
Zuletzt bearbeitet:

Zurück
Oben