Einzelnen Beitrag anzeigen

Dejan Vu
(Gast)

n/a Beiträge
 
#11

AW: QuoteText parsen?

  Alt 6. Nov 2014, 07:34
Ein Parser geht Zeichen für Zeichen durch den String
Das ist -streng genommen- nicht richtig. Ein Parser geht Token für Token durch eine Eingabe und prüft die Syntax einer Sprache bzw. erstellt einen Syntaxbaum. Ein Scanner/Tokenizer geht Zeichen für Zeichen durch einen String und erstellt Token anhand des Alphabets der zu scannenden Eingabe. Das Alphabet besteht hier aus normalen Zeichen, sowie den Sonderzeichen '[','/' und ']'. Dies sind gleichzeitig die Terminalsymbole. Man könnte die Terminalsymbole auch als '[','[/' und ']' definieren (ein Symbol ist 2 Zeichen lang). Dann würde der Scanner mit einem Lookahead arbeiten, aber es macht die Sache einfacher. Ähnliches haben wir bei Delphi mit den Symbolen ':=', '..' '(*' , '*)' usw.

Der Scanner erkennt meist mit Hilfe eines Automaten (->State machine) die einzelnen Token. Die Token sind hier: CHARS, BEGIN-GROUP, GROUPNAME, END-GROUP.

Der Parser prüft nun, ob die vom Scanner gelieferten Token der zu prüfenden Grammatik entsprechen. Hier z.B.:
Code:
BBText  ::= <Literals> [<BBText>]
Literals ::= CHARS | <Group>
Group   ::= <BeginGroup> <BBText> <EndGroup>
BeginGroup ::= BEGIN-GROUP GROUPNAME
EndGroup ::= END-GROUP GROUPNAME
Während des Erkennens kann ein Syntaxbaum erstellt werden. Dieser Syntaxbaum kann Grundlage für einen Compiler sein, der die einzelnen Knoten des Baumes in die Zielsprache übersetzt. Hier wäre die Zielsprache eine Liste von 'TTextPart' Einträgen. Eine andere Zielsprache könnte 'RTF' sein. Oder 'DOCX', oder z.B. formatierter Quelltext etc.

Viele Parser spannen den Baum nicht mehr explizit auf (obwohl damit Codepfade analysiert werden können, Stichwort: Die Variable 'X' ist wahrscheinlich nicht initialisiert, Rückgabewert undefiniert etc.), sondern spucken direkt das Compilat aus.

Das alles hat Sir Rufo in die Klasse gepackt, alles andere wäre ein wenig oversized. Und da die Sprache so einfach ist, spannt er einen eindimensionalen Baum auf: Einen Stack.

Übrigens: Es gibt Programme (Compilergeneratoren), denen gibt man die Grammatik der Zielsprache sowie reguläre Ausdrücke zum Erkennen der Token und die spucken dann einen fertigen und garantiert fehlerfreien Parser aus. Füttert man den Generator noch mit Übersetzungsregeln, hat man einen Compiler.

Geändert von Dejan Vu ( 6. Nov 2014 um 07:49 Uhr)
  Mit Zitat antworten Zitat