[VB .net] Eigener Editor


L

luckerking

Erstmal ein frohes neues Jahr.
Ich habe irgendwann letzten Sommer angefangen meinen eigenen Editor zu schreiben, da ich mich in VB .net einarbeiten wollte.
Ich habe dieses Projekt auch nach der Einarbeitung weiterverfolgt.
Nun ist der Hauptteil des Editors ( die Syntax Erkennung) fertig.
Leider läuft diese sehr langsam ab, den es gibt bestimmt noch Sachen die ich verbessern kann, die ich mit euch jetzt gemeinsam herausfinden möchte.
Vielleicht könnt ihr mir dazu gedankliche Anstöße geben.

Ich werde mal in Kurzform meine Syntaxerkennung beschreiben.
Da dies ein Editor mit frei konfigurirbaren Spachen sein soll (d.h. man kann einfach und unkompliziert seine eigene Sprache einfügen),
ist eine besondere Art der Syntaxerkennung von nöten.

Man kann eine Spache mit Hilfe von "Containern" beschreiben.
Z.B. ist in VB der String-Container ein Container ("hier steht ein String").

Als allerestes Suche ich den ganzen Text nach diesen Container ab.
Natürlich gibt es noch weiter Einstellungen für die Container, einer wäre zum Beispiel, dass der Container andere Container überschreibt.
Damit ist z.B. gemeint, das ein Kommentar-Container erst gar nicht in einem String-Container erkannt wird.
( "hier steht ein String, '<-- obwohl hier ein komma ist")

Ich denke dieser Teil meiner Syntax Erkennung ist schon voll optimiert, bis jetzt führe ich den Code aber nach jedem Tastendruck aus (Es kann ja sein, dass gerade ein Container erstellt/gelöscht wurde).
Dies kann man bestimmt besser gestalten, aber wie?

Der nächste Punkt in meiner Syntax-Erkennung ist die Zuordnung, der Container-Anfangs und der Container-Ende Zeichen.
Denn es gibt auch logische Container.

Beispiel:
(1 gehoert zu 1, 2 zu 2)
Normaler Container | Logischer Container
{1...........................|......{1
........ {2..................|............{2
.........}1..................|............}2
}2 ..........................|......}1



Ich denke dieser Punkt ist auch soweit in Ordnung.

Jetzt kommt aber die Syntaxmakierung, mit der ich unzufrieden bin und die man auf jedenfall besser machen kann (hoffe ich).

Bei der Syntaxmakierung durchläuft der Computer eine Liste von den Container ( die ich vorher erstellt hab) und makiert diese in einer
Farbe, zwischendurch (nach dem Container und auch manchmal in den Containern) sucht er immer noch nach Syntaxwörter
(MsgBox, If, Else) und makiert diese ebenfalls.
Die Suche mache ich über die Methode Richtextbox.Find, die ich mehrmals aufrufe.

Wenn er das Wort nich findet sucht er nach dem nächsten, wenn er es findet, dann sucht er nochmal (Das Wort kann ja mehrmals dort stehen) und dann sucht er wieder nach dem nächsten Wort.
Dieser Teil ist sehr Zeitaufwändig.


Wenn er alle Container und Wörter makiert hat (den makierten Bereich, hab ich auf den gerade Sichtbaren Berech verkleinert) ist er Fertig.
Ganz am Anfang unterbreche ich, das die Richtextbox sich neu zeichnet und zum Schluss stell ich es wieder ein.


Die ganze Syntaxmakierung passiert direkt in der Richtextbox, ist es vielleicht ratsamer, dies in einem großen String zu machen?
Gibt es eine bessere Methode Wörter innerhalb einens Textes zu finden?
Sollte ich vielleicht andere Sachen noch grundlegend ändern?


Der oben genannte Code passiert nach jedem Tastendruck und dauert wenige als eine Sekunde, aber trotzdem gibt es eine kleine merkbare Verzögerung.

Ich meine so ein Computer berechnet Spiele mit weit aus komplexeren Berechnungen und das manchmal mehrmals in der Sekunde, darum denke ich nicht, das die Programmiersprache so langsam ist, sondern der Code einfach schlecht aufgebaut ist.


Ich danke schonmal allen, die bis hierher gelesen haben und ich freue mich auf eure Anregungen zur Verbesserung meines Editors (wovon es ja schon so viele gibt :) )

PS: Falls etwas unverständlich ist, erklär ich dies natürlich nochmal.
 
Zuletzt bearbeitet von einem Moderator:
L

luckerking

Mir ist eingefallen, wie ich die Strukturerfassung (dort wo ich die Container zuordne) schneller machen könnte.
Ich könnte den ganzen Text in einem String speichern und diesen dann mit Regulären Ausdrücken nach Containern durchsuchen kann.

Für Testzwecke würde ich gerne Messen, wie schnell der Code überhaupt ist?
 
L

luckerking

Stopwatch funktioniert.
So kann ich jetzt messen, wo ich sehr laange brauche.
Meine Syntaxwörter suche ist durch RegEx jetzt auch viel schneller.

Jetzt wollte ich nach Schlüsselzeichen suchen (" ' /* *\ { }), nur leider kirege ich das mit RegEx bisher nur hin, dass er ein Zeichen alleine matcht.
Also wenn ich nach " suche, dann findet er auch alle, nur müsste ich danach nach ' suchen
und wenn ich alle Zeichen gefunden habe müsste ich sie nochmal nach dem Index sortieren.
Es wäre bestimmt eleganter, wenn ich gleich nach allen Zeichen suchen könnte.
Nur leider weiß ich nicht, wie ich mehrer Sachen matche.
Hab in keinen der gut erklärten Tutorials (wikipedia usw.) dafür etwas gefunden.