Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   QuoteText parsen? (https://www.delphipraxis.net/182623-quotetext-parsen.html)

Dejan Vu 6. Nov 2014 07:34

AW: QuoteText parsen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1278849)
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.

Bjoerk 9. Nov 2014 17:05

AW: QuoteText parsen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab' den Parser jetzt doch (lieber) in "BjoerkStyle" gemacht. Tut. In diesem Zusammenhang ist bei mir eine andere Frage aufgetaucht. Ist TStringList.Text nicht dasselbe wie das Ganze in einen String aufsummiert? (Siehe auch FBBCParser.LineOut(PaintBox.Canvas, FSL.Text, ..))

p80286 10. Nov 2014 09:37

AW: QuoteText parsen?
 
Zitat:

Zitat von Bjoerk (Beitrag 1279229)
Ich hab' den Parser jetzt doch (lieber) in "BjoerkStyle" gemacht. Tut. In diesem Zusammenhang ist bei mir eine andere Frage aufgetaucht. Ist TStringList.Text nicht dasselbe wie das Ganze in einen String aufsummiert? (Siehe auch FBBCParser.LineOut(PaintBox.Canvas, FSL.Text, ..))

Wenn ich Dich richtig verstanden habe, ja das könnte man so sehen.

Gruß
K-H

Bjoerk 10. Nov 2014 14:45

AW: QuoteText parsen?
 
Ok. Thanx. Das war ja das: StringReplace(FSL.Text, sLineBreak, '', [rfReplaceAll]) :oops:

Die LinesOut (Strings) funktioniert übrigens nicht richtig. Die hab ich nochmal überarbeitet…

lbccaleb 10. Nov 2014 17:33

AW: QuoteText parsen?
 
Hier kannst du dir vllt auch noch was abschauen??

http://www.delphipraxis.net/126859-b...trichedit.html

Bjoerk 10. Nov 2014 19:47

AW: QuoteText parsen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok. Thanx. Ich denke aber ich habs jetzt soweit. Etwas optimiert und mit korrekter LinesOut. Man kann übrigens auch von außen (FBBCParser.List.Add..) oder auch im constructor weitere BBCodes setzen. Die werden dann automatisch berücksichtigt.

Jens01 10. Nov 2014 20:33

AW: QuoteText parsen?
 
Cool ist, wenn der Parser noch sowas kann :
"F[sub]d[/sub]"
"N/mm[sup]2[/sup]"
:thumb:

himitsu 11. Nov 2014 00:22

AW: QuoteText parsen?
 
Parser können das, da es problemlos in die Syntax passt, aber es muß das Ziel auch diese Art ver Formatierung können und es benötigt bei der Auswertung des geparsten Textes noch die Funktion, das entsprechend zu übergeben.

Bjoerk 11. Nov 2014 07:51

AW: QuoteText parsen?
 
Gut. Machen kann man viel..

[SqrtSign]
[Picture]c:\...\.jpg[/Picture]

Sir Rufo 11. Nov 2014 10:27

AW: QuoteText parsen?
 
Zitat:

Zitat von Bjoerk (Beitrag 1279329)
[Picture]c:\...\.jpg[/Picture]

Das solltest du aber so nicht machen, logischer (und einfacher zu integrieren) wäre das
Code:
[font="Arial"]blabla[/font]
text [image="c:\...\foo.jpg"] text


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz