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

Code: Alles auswählen

*Buffer, Length, @Callback(), 0
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?
:iamwithstupid:

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 :wink:

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 :mrgreen:

Gruß
Thomas