Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   SynHighlighter erweitern (https://www.delphipraxis.net/170249-synhighlighter-erweitern.html)

Codehunter 11. Sep 2012 07:25

AW: SynHighlighter erweitern
 
@Bjoerk: Im Prinzip hast du recht. Ich beiß mich aber gern mal durch solche Probleme durch sonst lernt man ja nix dabei ;-) Schade dass man den ursprünglichen Erfinder des Algorithmus Martin Waldenburg nirgends mehr findet (macht anscheinend nix mehr mit Delphi).

FStringLen und FToIdent sind private-Members der Elternklasse. Ich fands schon immer merkwürdig, dass man bei der Delphi-Vererbung auf diese Weise auf Variablen der Elternklassen zugreifen kann. Aber so ist es nun mal.

Die Umwandlung in Ansistring finde ich ein wenig bedenklich. Es würde dadurch die Gefahr von False-Positives steigen denn der Hash-Algo ist ja nach wie vor der selbe. Der Verzicht auf KeyIndices bringt da meiner Meinung nach keine Vorteile.

Ich habe mich schon mit zwei Maintainern von SynEdit in Verbindung gesetzt aber anscheinend wissen sie auch nicht sehr viel über den Algorithmus. Wir vermuten aber alle, dass ein Tool verwendet wurde um die Arrays (KeyWords und KeyIndices) sowie die Konstanten im Hash-Algo zu generieren. Das einzige was mir jetzt noch einfiele, wäre die Konstanten per Bruteforce rauszufinden. Aber das ist ja auch nicht gerade die feine englische Art ;-)

Codehunter 11. Sep 2012 09:38

AW: SynHighlighter erweitern
 
Ich werd irre... Da ist doch tatsächlich ein Quellcodegenerator bei SynEdit dabei (SynGen). Man muss nur erstmal dahinter steigen, wie die Grammarfiles funktionieren die das Ding importieren will. Und der Witz an der Sache: SynGen erzeugt die Hashtable tatsächlich nach einer Art Bruteforce-Methode. Je mehr Keywords eine Sprache hat umso länger braucht das Programm.

Zwar ist der erzeugte Highlighter nicht unbedingt brauchbar weil eine Sprache ja auch aus einer Semantik besteht und nicht nur aus Keywords, Identifiern und Symbolen. Aber: Es erzeugt die Hashtables und die HashKey-Funktion. Die kann man dann einfach rüberkopieren und sich wieder auf die wesentlichen Dinge konzentrieren.

Insofern: Problem gelöst und Danke an alle die sich beteiligt haben!

stOrM 11. Sep 2012 19:04

AW: SynHighlighter erweitern
 
Das haette ich Dir sagen können :-D Nur blick ich das Grammar nicht :oops:

Furtbichler 11. Sep 2012 21:17

AW: SynHighlighter erweitern
 
und wieso baut man nicht einfach eine Hashmap ein? Ich hab mir das Ding vor ewigen Zeiten auch mal angeschaut und den Kopf geschüttelt. Ziemlicher Blödsinn.

Namenloser 11. Sep 2012 22:06

AW: SynHighlighter erweitern
 
Zitat:

Zitat von Furtbichler (Beitrag 1182558)
und wieso baut man nicht einfach eine Hashmap ein? Ich hab mir das Ding vor ewigen Zeiten auch mal angeschaut und den Kopf geschüttelt. Ziemlicher Blödsinn.

Ich denke mal, da die Map nur ein einziges mal erzeugt wird, hat man mehr Wert auf optimale Verteilung ohne Kollisionen gelegt als auf einfache Einrichtung.

Furtbichler 12. Sep 2012 05:03

AW: SynHighlighter erweitern
 
Zitat:

Zitat von NamenLozer (Beitrag 1182561)
Zitat:

Zitat von Furtbichler (Beitrag 1182558)
und wieso baut man nicht einfach eine Hashmap ein? Ich hab mir das Ding vor ewigen Zeiten auch mal angeschaut und den Kopf geschüttelt. Ziemlicher Blödsinn.

Ich denke mal, da die Map nur ein einziges mal erzeugt wird, hat man mehr Wert auf optimale Verteilung ohne Kollisionen gelegt als auf einfache Einrichtung.

Is klar, aber es geht nicht um die Anzahl der Kollisionen, sondern um die Performance. Jede Hashmap ist gegen Kollisionen immun. Wichtig ist der Load-Factor und jede halbwegs anständige Hashmap-Implementierung wächst automatisch mit.

Bei der Implementierung würde ich persönlich auch eher Wert auf Erweiterbarkeit nehmen, und die Zeit, die ich in die Entwicklung des Codegenerators gesteckt hätte, an anderer Stelle sinnvoller investiert wäre.

Kann man da nichts nachträglich einbauen bzw. ersetzen?

nahpets 12. Sep 2012 15:42

AW: SynHighlighter erweitern
 
Hallo,

habe mir vor einiger Zeit einen eigenen Highlighter gebaut für Pascalscript von RemObjects mit Anpassungen für mein Programm. Als Basis habe ich den Highlighter für Pascal/Delphi genommen. Da mir das manuelle Anpassen zu viel Arbeit wurde, habe ich mir ein Pascalscript geschrieben, das aus einer Textdatei Codefragmente erstellt, die per
Delphi-Quellcode:
{$I dateiname}
in den Quelltext des Highlighters eingebunden werden. Damit kann ich mir die veränderlichen Fragmente eines Highlighter generieren.

Da nicht jeder Pascalscript zur Verfügung hat, habe ich das Pascalscript nach Delphi übertragen und hier rangehängt.

Das Programm benötigt als ersten Parameter den Namen einer Datei, die die zu verwendenen Zeichenfolgen (Schlüsselwörter...) und den Typen für
Delphi-Quellcode:
TtkTokenKind
enthält, je Zeile:
Delphi-Quellcode:
Zeichenfolge|TtkTokenKind
. Als zweiten Parameter erwartet es entweder die Zeichenfolge ROPS oder PHP, da es hier Unterschiede beim Aufbau der Hashtable gibt. Der Dateiname muss in der Form
Delphi-Quellcode:
SynRopsSyn.Functionen.txt
aufgebaut sein, da hieraus auch Teile des Quelltextes generiert werden.

Habe für vier Highlighter entsprechende Dateien beigefügt, die zum Testen und Weiterentwickeln geeignet sein sollten. Das Fragment mit einem Namen in der Form
Delphi-Quellcode:
SynHighlighterROPS.PrivateFunc.inc
ist im Abschnitt
Delphi-Quellcode:
private
des Highlighters hinter
Delphi-Quellcode:
function KeyComp(const aKey: String): Boolean;
einzufügen, das Fragment mit einem Namen in der Form
Delphi-Quellcode:
SynHighlighterROPS.IdentFuncTable.inc
muss in die
Delphi-Quellcode:
procedure TSynROPSSyn.InitIdent;
eingefügt werden und das Fragment mit einem Namen in der Form
Delphi-Quellcode:
SynHighlighterROPS.FuncSource.inc
wird im Implementierungsteil hinter
Delphi-Quellcode:
function TSynROPSSyn.KeyComp(const aKey: String): Boolean;
eingefügt und ersetzt den gesamten Quelltext bis vor
Delphi-Quellcode:
function TSynROPSSyn.AltFunc: TtkTokenKind;
.

Für PHP sind generierte Fragmente beigefügt.

Eventuell kann ja jemand, für die Anpassung vorhandener Highlighter, damit was anfangen.

Bjoerk 12. Sep 2012 16:18

AW: SynHighlighter erweitern
 
Zitat:

Zitat von Furtbichler (Beitrag 1182558)
und wieso baut man nicht einfach eine Hashmap ein? Ich hab mir das Ding vor ewigen Zeiten auch mal angeschaut und den Kopf geschüttelt. Ziemlicher Blödsinn.

Und auch, wer soll das Programm überhaupt verstehen? Es gibt ein 0..136 Array, in denen aber nur 56 Werte drinstehen können, da es nur 56 KeyWörter gibt???

BUG 12. Sep 2012 16:35

AW: SynHighlighter erweitern
 
Ich denke, dass eine statische Hashmap erzeugt wird, um den Initialisierungsaufwand beim Start des Programms gering zu halten.
Das Erzeugen einer "idealen" Hashfunktion wird wohl gemacht, um die Struktur flach (=> Array) und gleichzeitig klein (kommt ja alles in den Datenbereich des Programms) zu halten.

Wie sinnvoll das bei höchstens ein paar hundert Keywords pro Sprache ist, muss wohl jeder selber wissen.

Zitat:

Zitat von Bjoerk (Beitrag 1182658)
Und auch, wer soll das Programm überhaupt verstehen? Es gibt ein 0..136 Array, in denen aber nur 56 Werte drinstehen können, da es nur 56 KeyWörter gibt???

Ein Hinweis-Kommentar, dass der Code generiert wurde, und ein paar Hinweise zur Funktion wäre vermutlich sehr hilfreich :mrgreen:
Wenn du irgendwo in den Speicher gucken würdest wo eine Hashmap liegt, würde die ähnlich aussehen, aber das macht man ja auch nicht.

nahpets 12. Sep 2012 16:57

AW: SynHighlighter erweitern
 
Zitat:

Zitat von Bjoerk (Beitrag 1182658)
[Und auch, wer soll das Programm überhaupt verstehen? Es gibt ein 0..136 Array, in denen aber nur 56 Werte drinstehen können, da es nur 56 KeyWörter gibt???

Vielleicht, weil man die gleiche Logik auch für andere Highlighter mit mehr (oder weniger) als 56 KeyWörtern verwenden möchte? Man muss ja nicht unbedingt für die Hashmap pro Highlighter eine eigene Logik entwickeln, die auf die konkrete Anzahl von Schlüsselwörten der Sprache ausgelegt ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 Uhr.
Seite 4 von 5   « Erste     234 5      

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