Hallo MB,
es ist wirklich sehr schwierig, deinen Gedankengängen zu folgen. Mir scheint auch, dass Du keine Vorstellung hast, welcher Systematik Du folgen willst.
Ich fragte:
Woran erkennst Du den Beginn des nächsten Informationsbrockens?
Du sagst:
Zunächst an der Kombination: Index, Doppelpunkt, Kapitalschrift, Tabulator(en), "- ", String.
DAS ist eine sehr komplexe Idee. Du bist im Informationsbrocken 1 bis zum String gelangt. Nun musst Du alles folgende, was Du findest, als Teil dieses Strings auffassen, bis Du den Beginn des nächsten Informationsbrockens erkennst. Und das kann beliebig komplex werden. Ich möchte Dir mit Leitfragen helfen.
Die Indexnummer ist optional. Der Doppelpunkt auch? Oder eher nicht? Was ist mit der Kapitalschrift? Pflicht oder optional? Das fragte ich bereits, aber Du hast es nicht beantwortet.
Was auch wichtig wäre: Darf es sein, dass der String von Block 1 endet und der Block 2 auf der gleichen Zeile beginnt? Oder beginnt ein Informationsblock grundsätzlich auf einer neuen Zeile?
Von den Antworten auf diese Fragen hängt es ab, wie sehr dein Parser raten muss. Aber ein wenig raten muss er auf jeden Fall, weil dein "string" Teil kein klar definiertes Ende hat. Es gibt Stellen, wo nicht klar ist, ob ein angetroffenes Zeichen zum String des vorigen Blocks gehört, oder einen neuen Block beginnt.
Man nennt das ein Entscheidungsproblem. Das Programm muss entscheiden, ob es links- oder rechtsrum laufen muss, aber hat noch nicht genug Daten um die Entscheidung treffen zu können. Zur Lösung gibt es mehrere Strategien (entnommen aus: Jackson Structured Programming - das war Stoff meiner Berufsausbildung...)
-
Do/Undo: Einfachste Form. Man entscheidet sich für eine Seite und schreitet wacker voran. Stellt man fest, dass man auf der falschen Seite ist, muss man alles, was auf der falschen Seite passiert ist, rückgängig machen und auf der richtigen Seite einsteigen. Hat man z.B. irgendwo "+1" gerechnet, muss man im Undo "-1" rechnen.
-
Note/Restore: Wenn Do/Undo zu komplex wird: Man merkt sich den Ausgangszustand, legt auf einer Seite los und wenn man falsch lag, setzt man die Daten auf den gemerkten Zustand zurück.
-
Pretend/Really Do: Wenn ein Undo oder Restore nicht möglich ist (z.B. weil zum "do" das Löschen einer Datei oder das Senden einer Mail gehörte): Man führt die eigentlichen Aktionen nur soweit wie nötig/möglich aus, dass ein Undo oder Restore noch möglich ist. Erst, wenn klar ist, dass man auf der richtigen Seite ist, werden die unwiderrufbaren Teile ausgeführt.
-
Backtracking: Wenn das Entscheidungsproblem sich zu einem Entscheidungsbaum auswächst, und Du nicht weißt, in welchen Ast Du musst. Dann kann es passieren, dass Du mehrere Prüfpunkte hast und Dich im Irrtumsfalls schrittweise zurückarbeiten musst. Das Damenproblem ist ein Beispiel dafür.
Das war jetzt ein Exkurs; in deinem Fall ist es nicht ganz so komplex. Aber ein Entscheidungsproblem hast Du auf jeden Fall zu lösen. Wenn Du an einer Stelle, wo ein Block beginnen kann, auf Daten triffst, die zu einem Blockbeginn passen, dann muss dein Parser diese Möglichkeit einbeziehen. Und Du musst eine Strategie finden, wie das erfolgen soll.
Diese Strategie muss auf jeden Fall eins können: den Punkt finden, wo die Spekulation endet. Sie endet entweder mit der Erkenntnis, dass man im falschen Entscheidungsast war, oder mit der Entscheidung, im richtigen Ast zu sein. Je nach gewählter Vorgehensweise folgen dann die Aktivitäten, um die Spekulation aufzulösen.
Das ist nicht einfach. Die Entscheidung, wie Du das machen willst, musst Du treffen. Was am einfachsten ist, hängt auch davon ab, wie einfach Du im Eingabedatenstrom wieder zurück kannst. Das kann ich nicht beurteilen, ich kenne SQF nicht.
Rolf
sumpsi - posui - obstruxi