Seite 2 von 2
Verfasst: Sonntag 3. Januar 2010, 13:06
von Hyperion
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.
Verfasst: Sonntag 3. Januar 2010, 14:15
von theliquidwave
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ß
Verfasst: Sonntag 3. Januar 2010, 21:54
von Hyperion
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.
Verfasst: Montag 4. Januar 2010, 14:48
von theliquidwave
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ß
Verfasst: Dienstag 5. Januar 2010, 15:03
von sma
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