Eigener Parser will nicht so wie ich

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

sma hat geschrieben:
Hyperion hat geschrieben:Ich war so frei smas Funtkion ein wenig aufzubohren - zumindest habe ich mal vermutet, dass auch Interesse am Parsen der Koordinaten bestehen könnte.
Deine Koordinaten-Erkennung würde den String "Web 2.0" zu [2.0] machen. Ist das beabsichtigt? Wenn du Koordinaten erkennen willst, würde ich auf einen String der Form \d+\.\d+,\d+\.\d+,\d+\.\d+ achten und nur diesen umwandeln -
Stimmt! Das war so nicht beabsichtigt.
sma hat geschrieben: wenn überhaupt, da das schon sehr speziell ist und dem Parser die Allgemeingültigkeit nimmt.
Hm... ist halt die Frage, inwiefern das Format eben spezifiziert ist.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Man kann es zwar nicht Spezifikation nennen, jedoch ist das hier genauer beschrieben (sofern man darauf zurückgreifen möchte): http://developer.valvesoftware.com/wiki/KeyValues
Man könnte das ganze ja auch modular aufbauen, also praktisch Funktionen für bestimmte Typen (z.B. Listen oder Koordinaten) erstellen und die durch eine Iteration aufrufen.

Gruß
Grüßle.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich denke das hier erklärt es besser:
VMF (Valve Map Format)

Allerdings widerspricht die Definition der hier benutzten Datei in einigen Punkten bzw. ist in sich nicht sehr konsitstent.

vertex und rgb sind ja die einzigen nativen Datentypen, die aus mehreren Einzelwerten bestehen. In obigen Beispiel handelt es sich wohl um einen vertex, der dort aber mit Kommatas intern separiert wird. Laut Doku im wiki sollten es aber Leerzeichen sein.

Zudem finden sich unter "Connections" dann Values, die anscheinend mehrere Datentypen enthalten und diese dann Komma separiert werden.

Vielleicht müßte ich mir das alles noch einmal genauer durchlesen, aber ich finde das alles wenig konsitent und präzise definiert.

Vermutlich hat sma damit also recht, dass man das Parsen der Values dann lieber intern im Programm erledigen sollte - ggf. hängt das ja auch vom Namen des Keys ab.

Auf jeden Fall fehlt bei smas Lösung noch das Ignorieren von Kommentarzeilen - aber das kann man ja leicht noch realisieren.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Habe dazu gerade aktuell wieder eine Frage.
Folgendes würde momentan leider auch greifen, soll es aber nicht:

Code: Alles auswählen

"bla"
{
    key    "ein//komischer//string" //erst hab hier soll es ein Kommentar sein
}
So. Problem für mich ist, rauszufinden, ob die // innerhalb der beiden " sind. Wie kann man das Effizient lösen? Auch Probleme machen mir die \" die innerhalb des Strings möglich sind (also "Das ist \"dumm\"").

Gruß
Grüßle.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wenn man auch noch Zeilen mit "//" ignorieren will, würde ich auf reguläre Ausdrücke umstellen, denn damit zerlegt sich eine Zeile einfacher. Wenn man `r'"[^"]*"|//.*'` benutzt, findet der reguläre Ausdruck zunächst Strings, egal ob die ein // enthalten oder nicht und nur außerhalb von Strings ein //. Nun muss man natürlich noch Namen, Klammern und Ziffern ergänzen und kann dann Token für Token statt Zeile für Zeile vorgehen.

Stefan
Antworten