![]() |
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 ;-) |
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! |
AW: SynHighlighter erweitern
Das haette ich Dir sagen können :-D Nur blick ich das Grammar nicht :oops:
|
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.
|
AW: SynHighlighter erweitern
Zitat:
|
AW: SynHighlighter erweitern
Zitat:
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? |
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:
in den Quelltext des Highlighters eingebunden werden. Damit kann ich mir die veränderlichen Fragmente eines Highlighter generieren.
{$I dateiname}
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:
enthält, je Zeile:
TtkTokenKind
Delphi-Quellcode:
. 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
Zeichenfolge|TtkTokenKind
Delphi-Quellcode:
aufgebaut sein, da hieraus auch Teile des Quelltextes generiert werden.
SynRopsSyn.Functionen.txt
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:
ist im Abschnitt
SynHighlighterROPS.PrivateFunc.inc
Delphi-Quellcode:
des Highlighters hinter
private
Delphi-Quellcode:
einzufügen, das Fragment mit einem Namen in der Form
function KeyComp(const aKey: String): Boolean;
Delphi-Quellcode:
muss in die
SynHighlighterROPS.IdentFuncTable.inc
Delphi-Quellcode:
eingefügt werden und das Fragment mit einem Namen in der Form
procedure TSynROPSSyn.InitIdent;
Delphi-Quellcode:
wird im Implementierungsteil hinter
SynHighlighterROPS.FuncSource.inc
Delphi-Quellcode:
eingefügt und ersetzt den gesamten Quelltext bis vor
function TSynROPSSyn.KeyComp(const aKey: String): Boolean;
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. |
AW: SynHighlighter erweitern
Zitat:
|
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:
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. |
AW: SynHighlighter erweitern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz