Autor Beitrag
Tobi482
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: So 21.10.07 10:21 
Hi Leute,

ich habe Fremddaten in der form

ausblenden Quelltext
1:
(item(name 123)(Index 3)(Icon "a.bmp")(Event 1 1)(class file txt)(ex (owner 1 3)(permission 1 2 "rwx")(cdate 194642346)))					

formatiert sieht es so aus
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
(item
  (name 123)
  (Index 3)
  (Icon "a.bmp")
  (Event 1 1)
  (class file txt)
  (ex
    (owner 1 3)
    (permission 1 2 "rwx")
    (cdate 194642346)
  )
)

ich denke, dass sie in eine Structure gehören die ca so aussieht
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
item.name     = 123
item.Index     = 3
item.Icon     = "a.bmp"
item.Event.Normal   = 1
item.Event.Ex    = 1 
//???
item.ex.owner.a    = 1
imte.ex.owner.b    = 3
item.ex.permission.a  = 1
item.ex.permission.b  = 2
item.ex.permission.c  = "rwx"
item.ex.cdate    = 194642346

wobei ich mir bei der einen Zeile nicht sicher bin, da es weder Integer noch Strings sind. Evtl sind es Konstanten oder Sub-Klassen

Gibt es Praser die mir dabei helfen können oder muss ich für diese Art von Formatierung einen eigenen schreiben. Evtl gibt es ja schon eine Unit mit einer Art Multi-Praser. Habe bisher leider noch keinen gefunden. Oder evtl ist dies ja auch ein gängiges Praser Format (ich kenne es nur nicht^^). Ist für mich das erste mal, dass ich mich mit Praser beschäftige. Bitte daher im Rücksicht für meine Unwissenheit

Falls ich einen Praser selber schreiben muss, muss ich ja auch eine Art dynamische Roh-Structure schreiben.
Habe dies bereits versucht bin mit dem Ergebniss aber noch nicht ganz zufrieden

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Type
  TTParamTyp = (TTByte, TTWord, TTDWord, TTFloat, TTString);

  TTPraserItemParam = packed record
    Name    : String;
    Typ    : TTParamTyp;
    Parameter  : Array of Pointer;
  end;

  TTPraserItem = packed record
    Name    : String;
    Parameter  : Array of TTPraserItemParam
    SubItems  : Array of TTPraserItem;
  end;
end;


Daher meine Fragen:

1. Gibt es einen schon fertigen Praser, der mein Datenformat lesen kann
2. Habt ihr irgendwelche Tips für mich (evtl brauch ich gar keinen Praser)

Mit freundlichen Grüßen
Tobi
Silas
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 478

Windows XP Home
Delphi 2005, RAD Studio 2007, MASM32, FASM, SharpDevelop 3.0
BeitragVerfasst: So 21.10.07 11:53 
Moin!

So ein Format is mir auch noch nie untergekommen, aber ein Parser sollte recht einfach zu schreiben sein.
Ich würd die Datei einfach zeichen für zeichen durchgehen. Für die Klammern würd ich einen Stack verwenden, weil sie verschachtelt sein können. Dann denk ich brauchst du eine Variable die speichert, ob du dich in einem String (") befindest (wegen der Leerzeichen).
Nach einer Klammer ist das erste Nicht-Whitespace-Zeichen der Name, und durch ein oder mehrere Whitespaces getrennt folgen die Parameter. (Bei Strings musst du Whitespaces und Anführungszeichen natürlich ignorieren).
Bei den Datentypen würd ich nur String, LongInt und Extended verwenden (du weißt ja nicht, was gemeint ist und zuviel ist besser als zuwenig :) (es sei denn, deine Datei ist ein paar GB groß). Alles was nur Ziffern + Vorzeichen hat ist ein LongInt, das ganze mit "." ist ein Extended (evtl. auch mit "f" hinten dran, ist auch recht üblich). Alles andere wäre dann ein String.

Bei deinem Quelltext is mir was aufgefallen: Bei dir hat jeder Parameter einen Namen, im Dateibeispiel aber soweit ich das seh nicht. Ich würde jedes () als eigenes Item ansehen, das macht das Parsen einfacher.

_________________
Religionskriege sind nur Streitigkeiten darüber, wer den cooleren imaginären Freund hat ;-)
Tobi482 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: So 21.10.07 16:11 
Hi,
Danke für deine Antwort. Schade, dachte es gäbe einen Parser dafür.
Ok werde deinen Rat beflogen und den Namen für jedes Parameter löschen.
Ist ja auch einfacher so :D

Gut dann nochmla ein danke schön für die schnelle Antwort :)

Mit freundlichen Grüßen
Tobi