Moin Chris,
aller Anfang dürfte in so einem Falle mal die lexikalische Analyse sein.
Ich versuch' mal kurz zu beschreiben, was man dafür so braucht.
- Zeichenweises durchlesen der Datei
- Aufbau einer Tokenliste, wobei ein Token üblicher Weise aus aus einer Kennung (was ist es denn) und einem Attribut besteht. Das Attribut enthält dann den Wert. Hast Du z.B. einen String gefunden, wäre der gefundene Text das Attribut und die Kennung könnte toHTMLString sein (die Kennungen aufgebaut als Aufzählungstyp)
Ob man hierbei z.B. die Sonderzeichen &xxxx als ein Token mit unterschiedlichen Attributen betrachtet oder jedem ein eigenes Token spendiert (wäre wohl nicht unbedingt sinnvoll für das weitere Vorgehen) musst Du dann selber entscheiden.
- Um die Zeichen gleich ein wenig sinnvoll auszuwerten kannst Du auch Flags verwenden, um z.B. anzuzeigen, das Du gerade ein Zeichen gefunden hast, dass ein Tag öffnet (<) um die weitere Auswertungen zu steuern, z.B., dass jetzt entweder ein / oder ein Tagname kommen muss. Man könnte natürlich /tagname als eigenes Token ansehen.
- Wurde auf diesem Wege dann eine Tokentabelle aufgebaut (dynamisches Array) kann es "schon" mit der Syntaxprüfung losgehen
- Hierbei muss dann der Tokenstrom der Reihe nach durchgegangen werden, und, anhand des jeweils gefundenen Tokens entschieden werden, ob dieses an dieser Stelle sein kann. Ein </tagname> kann z.B. keine weiteren Werte enthalten. Ist das doch der Fall kannst Du entweder mit einem Fehler abbrechen, oder Dir den Fehler merken und versuchen bis zu nächsten verarbeitbaren Wert zu gehen.
Das nur mal so in Kürze. Oft läuft das auch so ab, das der eigentliche Parser ein Token nach dem anderen abfordert, und erst zu diesem Zeitpunkt die lexikalische Analyse versucht das nächste Token zu liefern.
Ich finde es von Vorteil die Schritte, zumindest zu Anfang, komplett zu trennen. Für meinen Geschmack erleichtert das den Test, ob die einzelnen Bestandteile auch wie erwartet arbeiten.
Lass Dir doch als erstes mal eine sinnvolle Tokenliste (Aufzählungstyp) einfallen zu lassen. Ich hatte das mal als Objekt erstellt, so dass ich dann nur noch jeweils TokenList.Add(TokenTyp,Attribut) gebraucht habe, um der Liste ein Element hinzuzufügen.
Ach so:
Für die lexikalische Analyse braucht man i.d.R.:
Eine Liste der Bezeichner, Operatoren, Trennzeichen usw.
Wahrscheinlich wirst Du ja SelfHTML haben. Dort ist das glaube ich auch einzeln aufgeschlüsselt.