Seite 1 von 1
Scintilla Lexer selber schreiben
Verfasst: 16.12.2010 20:16
von mbuettner
Hallo,
ich bin heute über Google auf
diese Seite gestoßen, und jetzt habe ich überlegt, wie man so etwas auch für PureBASIC machen kann. Man kann wohl kaum den Prototype
Code: Alles auswählen
unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler
benutzen, da dieser in C++ ist und die SyntaxHilighting.dll aus dem PureBASIC SDK die Parameter
braucht, möchte ich mal wissen, wie man so einen Lexer in PureBASIC schreibt. Fantaisie Software hat das ja auch geschafft, allerdings ist kein SourceCode verfügbar.
P.S.: Wo finde ich eigendlich den Lexer von Remi Meier?
Re: Scintilla Lexer selber schreiben
Verfasst: 16.12.2010 21:31
von Vera
Vor drei Tagen brauchtest Du so
unheimlich dringend genau die SciLexer.dll-2.21, dass ich 2 mal für Dich danach gesucht und sie letztlich sogar hochgeladen hab'.
Sie wurde weder bis jetzt runtergeladen, noch mindestens Bescheid gesagt, dass es plötzlich total unwichtig geworden ist.
Danke für die Blumen und diesmal darf jemand anderes für Dich die Such-und Beschaffungsarbeit machen.
ich habe fertig
Re: Scintilla Lexer selber schreiben
Verfasst: 16.12.2010 21:40
von ts-soft
Vera hat geschrieben:Danke für die Blumen und diesmal darf jemand anderes für Dich die Such-und Beschaffungsarbeit machen.
Die passenden link z.B. zu GoScintilla, hat er doch bereits bekommen.
Auch der jaPBe-Source wäre nützlich.
Aber ich denke er wartet auf etwas, was er auch verstehen kann, das
wird es IMHO zur Zeit nicht geben.
mfg
Thomas
Re: Scintilla Lexer selber schreiben
Verfasst: 17.12.2010 11:06
von mbuettner
@Vera: Ich habe den eindruck, dass soziemlich jede SciLexer version die Funktion DecodePointer braucht (außer der von Notepad++).
@ts-soft: Meinetwegen kann es auch C-Code sein; ich habe nämlich selber mal in C++ kleinere Programme programmiert, bis ich auf PureBASIC umgestiegen bin, weil PB schneller als C ist.
Re: Scintilla Lexer selber schreiben
Verfasst: 17.12.2010 20:18
von edel
Re: Scintilla Lexer selber schreiben
Verfasst: 18.12.2010 12:07
von mbuettner
@edel:
Wenn ich das richtig sehe, hat diese Funktion die drei Parameter SCN_STYLENEEDED, WINDOW_ID und OnStyleNeeded. Aber da ja die SyntaHilighting-DLL aus dem PureBASIC SDK fünf Parameter (SCI_Buffer, end_pos - SCI_start_pos, @SHCallback(), #False) braucht, und die
nicht den fünf Parametern aus meinem ersten Post entsprechen, wird das dann ja auch nicht gehen, wenn die Parameter in der Reihenfolge vertauscht währen. Vielleicht rückt ja auch Fantaisie Software die Quellcodes raus?

Re: Scintilla Lexer selber schreiben
Verfasst: 18.12.2010 13:17
von edel
Die DLL von Freak hat mit Scintilla nichts zu tun.
Die MFC Funktion OnStyleNeeded sieht in pb in etwa so aus
Code: Alles auswählen
PROCEDUREDLL ScintillaCallBack(Gadget, *scinotify.SCNotification)
IF *scinotify\nmhdr\code = #SCN_STYLENEEDED
ENDIF
ENDPROCEDURE
[...]
ScintillaGadget(0, 10, 10, 300, 70, @ScintillaCallBack())
Re: Scintilla Lexer selber schreiben
Verfasst: 18.12.2010 13:51
von mbuettner
Nur eine Verständnisfrage:
Beim Scintilla Helper ist folgender Callback:
Code: Alles auswählen
Procedure ScintillaCallBack(EditorGadget, *scinotify.SCNotification)
Protected line_number.l
Protected txtr.TEXTRANGE
Protected end_pos.l
Shared SCI_start_pos, SCI_Buffer, SCI_Editor
SCI_Editor = EditorGadget
If *scinotify\nmhdr\code = #SCN_STYLENEEDED
line_number = ScintillaSendMessage(EditorGadget, #SCI_LINEFROMPOSITION, ScintillaSendMessage(EditorGadget, #SCI_GETENDSTYLED))
SCI_start_pos = ScintillaSendMessage(EditorGadget, #SCI_POSITIONFROMLINE, line_number)
end_pos = *scinotify\Position
txtr\chrg\cpMin = SCI_start_pos
txtr\chrg\cpMax = end_pos
txtr\lpstrText = AllocateMemory(end_pos - SCI_start_pos + 1)
SCI_Buffer = txtr\lpstrText
ScintillaSendMessage(EditorGadget, #SCI_GETTEXTRANGE, 0, txtr)
SyntaxHighlight(SCI_Buffer, end_pos - SCI_start_pos, @SHCallback(), #False)
FreeMemory(SCI_Buffer)
EndIf
EndProcedure
Und in dem SCN_STYLENEEDED-Teil wird dann die Funktion SyntaxHilight aufgerufen, die dann den Text nach Schlüsselwörtern markiert und dies dann entsprechend einfärbt. Aber woher weiß dann die DLL, welche Farbe es nehmen soll? Die werden ja vorher im ScintillaHelper und nicht in der DLL gesetzt.
Re: Scintilla Lexer selber schreiben
Verfasst: 18.12.2010 18:06
von Fluid Byte
Erwartest du ernsthaft das er weiß was MFC ist edel?
Re: Scintilla Lexer selber schreiben
Verfasst: 18.12.2010 18:16
von ts-soft
mbuettner hat geschrieben:Aber woher weiß dann die DLL, welche Farbe es nehmen soll? Die werden ja vorher im ScintillaHelper und nicht in der DLL gesetzt.
Die SyntaxHilighting.dll ist ja auch nur der Lexer, sie unterscheidet zwischen:
Code: Alles auswählen
Enumeration; Syntax
#SYNTAX_Text
#SYNTAX_Keyword
#SYNTAX_Comment
#SYNTAX_Constant
#SYNTAX_String
#SYNTAX_Function
#SYNTAX_Asm
#SYNTAX_Operator
#SYNTAX_Structure
#SYNTAX_Number
#SYNTAX_Pointer
#SYNTAX_Separator
#SYNTAX_Label
EndEnumeration
Mehr muß der lexer nicht entscheiden, die Farben sind ja schon vereinbart
Im SDK von pb, wo auch die DLL liegt gibt es auch ein simples Beispiel. Aber für Dein Vorhaben ist die
DLL wohl nicht zu gebrauchen.
Aber nochmal auf die relevanten Sourcen Verweise ich jetzt nicht mehr
Gruß
Thomas