Parsing einer iCalendar-Datei in C

ch möchte iCalendar-Dateien mit C analysieren. Ich habe eine vorhandene Struktur eingerichtet und lese alles bereit. Ich möchte zeilenweise Komponenten analysiere

Zum Beispiel müsste ich etwas wie das folgende analysieren:

UID:[email protected]
DTSTAMP:19970714T170000Z
ORGANIZER;CN=John Doe;SENT-BY="mailto:[email protected]":mailto:[email protected]
CATEGORIES:Project Report, XYZ, Weekly Meeting
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
SUMMARY:Bastille Day Party

Hier sind einige der Regeln:

Das erste Wort in jeder Zeile ist dasName des Anwesen Auf den Namen der Eigenschaft folgt ein Doppelpunkt (:) oder ein Semikolon (;)Wenn es ein Doppelpunkt ist, dann ist dasEigentumswer steht direkt rechts vom Inhalt am Ende der Zeile Hier wird eine weitere Komplexitätsebene hinzugefügt, da eine durch Kommas getrennte Liste von Werten zulässig ist, die dann in einem Array gespeichert werden. Also dasCATEGORIES one hätte zum Beispiel 3 Elemente in einem Array für die Werte Befindet sich nach dem Eigenschaftsnamen ein Semikolon, so gibt es optionale Parameter, die auf @ folgeDas optionale Parameterformat lautet ParamName = ParamValue. Auch hier wird eine durch Kommas getrennte Liste unterstützt.Es kann mehr als einen optionalen Parameter geben, wie auf dem @ angegebeORGANIZER Linie. Es würde nur ein weiteres Semikolon gefolgt vom nächsten Parameter und Wert geben.Und um einen weiteren Schraubenschlüssel einzusetzen, dürfen die Werte Anführungszeichen enthalten. Wenn etwas in Anführungszeichen für den Wert steht, muss es als Teil des Werts behandelt werden, anstatt Teil der Syntax zu sein. Ein Semikolon in einem Zitat bedeutet also nicht, dass es einen anderen Parameter gibt, der Teil des Werts ist.

Ich war dabei mitstrchr() undstrtok() und haben einige grundlegende Elemente daraus, aber es wird sehr chaotisch und unorganisiert und scheint nicht der richtige Weg zu sein, dies zu tun.

Wie kann ich einen so komplexen Parser mit den Standard-C-Bibliotheken (oder der POSIX-Regex-Bibliothek) implementieren? (suche nicht die ganze lösung, nur ausgangspunkt)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage