Eigener Lexer für Styled Text Control

Plattformunabhängige GUIs mit wxWidgets.
Antworten
barfoos
User
Beiträge: 25
Registriert: Dienstag 29. Juli 2008, 09:46

Mittwoch 27. August 2008, 14:31

Hallo

ich hab zu dem Thema verdammt wenig im Netz gefunden.

Ich möchte mit dem styled text control gern einen Editor bauen, der geklammerte Ausdrücke on-the-fly lesberarer macht, indem er die unterschiedlichen Klammertiefen durch verschieden große Klammern leichter erkennbar macht.

Außerdem wäre es schick eckig-geklammerte Terme, geschweift-geklammerte Terme und einfach-geklammerte Terme farblich zu unterschieden.

Hat jemand eine Idee, wie ich das bewerkstelligen kann, oder wie ich mich da rantaste?

danke und gruß
barfoos

(Edit: das Control heist wxStyledTextCtrl)
Zuletzt geändert von barfoos am Freitag 29. August 2008, 07:32, insgesamt 1-mal geändert.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 27. August 2008, 15:15

Meines Wissens benutzen die verschiedenen GUI-Toolkits letztlich alle Scintilla und dort scheint mir das Highlighting für ein paar Sprachen hart verdrahtet und nicht wirklich änderbar, wenn man nicht in C einen eigenen Lexer schreiben will.

Naiv mit regulären Ausdrücken lässt sich dein Problem auch nicht lösen, da diese nicht zählen können und damit prinzipbedingt keine geklammerten Ausdrücke finden können. Editoren wie VIM, JEdit oder TextMate, deren Highlighting auf regulären Ausdrücken basiert, erweitern das System dadurch, dass man den Text zuvor anhand von Anfangs- und End-Token partitioniert. Das hilft dir aber auch nicht, wenn du verschiedene Klammerebenen einer Sorte Zählen willst.

Als ich suchte, habe ich im Python-Umfeld nichts gefunden und kann sonst nur auf Wissen aus dem Java-Umfeld zurückgreifen. Für Eclipse kann man definitiv einen Editor wie von dir gewünscht bauen (die verschiedenen Schriftgrößen gehen wahrscheinlich nicht, aber verschiedene Farben und semantisches Highlighting gehen prinzipiell), das ist aber alles andere als einfach. Da scheint mir die Idee von Netbeans, die Sprache mittels einer kontextfreien Grammatik (die zählen kann) zu beschreiben und davon das Syntax-Highlighting (und mehr) abzuleiten, der einfachere weg. Dies funktioniert leider nicht für Sprachen wie Python, die einen nicht-kontextfreien Lexer brauchen. Diese Java-Rahmenwerke könntest du mit Jython angehen, damit es wenigstens etwas Python-Code bleibt...

Möglicherweise kann man den Emacs mit Elisp zu der von dir gewünschten Funktion überreden, damit habe ich mich das letzte Mal vor über 12 Jahren auseinandergesetzt...

Stefan
barfoos
User
Beiträge: 25
Registriert: Dienstag 29. Juli 2008, 09:46

Mittwoch 27. August 2008, 15:33

Danke für die Antwort.

Angenommen ich hätte schon einen Parser, der die Ausdrücke in einen Syntaxbaum umformt. Das wxStyledTextControl bietet ja prinzipiell die Möglichkeit über einen Eventmechanismus einen eigenen "Lexer" anzubinden.

Wäre folgendes denkbar:
- ich parse die Ausdrücke im Hintergrund (z.B. mit antlr oder etwas ähnlichem)
- dabei baue ich mir nebenbei einen Rückwärtssuchindex auf, der mir zu gegebener Textstelle sagt, wo diese sich im Syntaxbaum befindet
- dem wxStyledTextControl sage ich dann, dass es mich jeweils fragen soll, wie die einzelnen Textstellen auszuzeichnen sind.
- anhand meines Suchindexes könnte ich daraufhin in den Sytaxbaum springen und berechnen, in welche Klammertiefe ich gerade bin

Einfacher noch:
- wenn mich das wxStyledTextControl fragt wie es eine Klammer zeichnen soll, dann zähle ich die bis dahin geöffneten Klammern und berechner daraus eine Schriftgröße

Mein Problem:
Ich verstehe die Beispiele nicht, die ich finden konnte. Kann mir jemand den Event-Mechanismus an einem einfachen Beispiel erklären?

danke und gruß
barfoos
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 27. August 2008, 15:48

Der wxPython-Installation liegt doch so eine halbfertige Python-IDE bei. Kann man dort abgucken? Oder was ist mit Programmen wie Editra?

Als ich mir das anguckte, hatte ich keinen Weg gesehen, effizient eigenes Syntax-Highlighting einzubauen. Vielleicht hatte ich etwas übersehen. Was sind denn das für Events, die du erwähnst hast?

Ansonsten ist der Ansatz, im Hintergrund einen AST zu bauen und dann mit dem Textindex kommend in dem AST den passenden Knoten zu suchen und danach zu entscheiden, IMHO der richtige.

Stefan
barfoos
User
Beiträge: 25
Registriert: Dienstag 29. Juli 2008, 09:46

Freitag 29. August 2008, 07:31

Hi.

Ich hab mich mit den Events auf das bezogen, was ich auf dieser Seite gelesen habe:

http://www.yellowbrain.com/stc/lexing.html

Dort wird beschrieben, dass ich in meiner eigenen Klasse das EVT_STC_STYLENEEDED (http://www.yellowbrain.com/stc/events.h ... TYLENEEDED) Event behandeln kann, um die Styling-Informationen selbst einzutragen. Ob und wie das genau funktioniert hab ich aber nicht rausfinden können.

gruß
barfoos
lunar

Freitag 29. August 2008, 16:11

sma hat geschrieben:Naiv mit regulären Ausdrücken lässt sich dein Problem auch nicht lösen, da diese nicht zählen können und damit prinzipbedingt keine geklammerten Ausdrücke finden können. Editoren wie VIM, JEdit oder TextMate, deren Highlighting auf regulären Ausdrücken basiert, erweitern das System dadurch, dass man den Text zuvor anhand von Anfangs- und End-Token partitioniert.
Man kann reguläre Ausdrücke auch innerhalb eines Zustandsautomaten nutzen (Pygments macht das so). Dann lässt sich das Zählen der Klammern dadurch realisieren, dass man jedes Mal beim Betreten eines neuen Zustands einen mitgeführten Zähler erhöht, und beim Verlassen wieder verringert.

Dann kann man Klammern auch mit regulären Ausdrücken zählen.
barfoos
User
Beiträge: 25
Registriert: Dienstag 29. Juli 2008, 09:46

Donnerstag 4. September 2008, 16:50

Kurze Zusammenfassung:

Es geht relativ einfach Aber wahrscheinlich nur für kurze Texte.
Denn der einfache Weg ist, einfach bei jedem Aufruf des STYLE_NEEDED Events den kompletten Text neu zu formatieren.

Man kann dazu den Text nach eigenem belieben durchschreiten. Zum Beispiel kann man die aktuelle Klammertiefe mitzählen.

Zur eigentlichen Formatierung gibt es Funktionen, die einem Zeichen oder einer reihe von Zeichen eine StyleID.

Man kann dann einmal global definieren, welche StyleID wie dargestellt werden soll (Schriftart, Größe, etc.).

Ich schreib es jetzt hier nicht genauer, weil mir die Zeit für ein Tutorial fehlt.

Wer Fragen hat, kann sich gern per PM oder hier im Forum melden.

gruß
barfoos
Antworten