Thema: Delphi Konzept - BBCode Parser

Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Konzept - BBCode Parser

  Alt 14. Mai 2007, 13:33
Hi,
an sich würde ich Dir erstmal den Tipp geben, dass Du Dich ein wenig mit den Grundlagen des Parser-/Compilerbaus beschäftigst. Da gibt es bestimmte Vorgehensweisen, die sich als sehr nützlich erwiesen haben und im Prinzip für alle Parser verwendet werden können. An sich kannst Du hier front- und Backend unterscheiden und bis einschließlich der Parser kann eigentlich immer alles auf gleiche Art und Weise gemacht werden. Je nach Grammatik sind bestimmte Parser dabei dann sicherlich effizienter als andere und je nach Implementierung gilt das dann auch noch mal, aber das ist egal (kannst Du leicht ergooglen, wenn Du nach Bei Google suchenparser oder so suchst)

Jedenfalls arbeitet man häufig nach einem sehr einfachen Prinzip, Du gehst in mehreren Stufen durch. Du hast Code der geparst werden soll, die Eingabe. Die Eingabe wird erstmal durch einen Scanner bearbeitet. Ein solcher Scanner zerlegt die Eingabe in Token. Ein Token ist dabei ein Teil der Eingabe, der um eine Qualifizierung erweitert wird. Das heißt, dass wenn Du ein BBCode-Tag findest, Du einfach ein Record (o.Ä.) hast, wo Du einen Wert und seine Eigenschaft speichern kannst. Findest Du einen String
Code:
"Ein Test String mit [i]BBCode[/i]"
So kannst Du den hier den BBCode ([i]) einfach qualifizieren, Dir also merken, dass es ein öffnendes und ein schließendes i-Tag gibt. Der Rest ist dann einfach normaler Text (ebenfalls eine Qualifizierung). Der Scanner erstellt Dir also aus einer Eingabe einfach eine Liste von Token (Typ + Wert).
Hast Du jetzt diese Liste von Token, kannst Du diese einfach an einen Parser weiterreichen.
Ein Parser hat in der Regel auch zwei einfache Aufgaben, er erstellt aus der Liste von Token einen Syntaxbaum und kann dabei die Korrektheit der Eingabe überprüfen. Hier hast Du dann die Möglichkeit, dass Du Top-Down oder Bottom-Up arbeitest. I.d.R. dürfte Bottom up effizienter zu realisieren sein, allerdings gibt es auch funktionale, monadische Parser, die einen anderen Weg gehen (und auch ordentlich flink arbeiten!).
Jedenfalls solltest Du Dir hier überlegen, wie streng Du sein möchtest, je strenger desto leichter lässt sich so ein Parser realisieren. Statt einer Matrix solltest Du übrigens wirklich lieber zu einem Baum greifen, da kannst Du die Verschachtelung der Tags leichter abbilden. Das Hauptproblem hier ist dann eine unsaubere Verschachtelung, bei der man Tags nicht in der Reihenfolge schließt, in der sie geöffnet wurden (ich würde das erstmal einfach nicht zulassen/ignorieren).

Ein solcher Baum könnte dann die Form haben:
[code]
|-(TEXT)
|-- Ein Test String mit
|-- (Italic)
|-- BBCode
|-- (END ITALIC)
[code]

Den eigentlichen Sinn erkennt man vielleicht eher bei stärkerer Verschachtelung, allerdings kannst Du halt sehr einfach eine solche Struktur traversieren und nach festen Regeln auf jeden Knoten im Baum reagieren und die Formatierung entsprechend anpassen.

Gruß Der Unwissende
  Mit Zitat antworten Zitat