Scintilla Lexer selber schreiben

Für allgemeine Fragen zur Programmierung mit PureBasic.
mbuettner
Beiträge: 88
Registriert: 14.05.2010 15:53
Computerausstattung: 3 GB RAM, Windows 7 32-Bit Home Premium
Wohnort: daheim
Kontaktdaten:

Scintilla Lexer selber schreiben

Beitrag 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?
Bild
Bild
Die täglich beförderte Datenmenge des Internets beträgt 415 Petabyte oder 445.602.856.960 Megabyte!
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Scintilla Lexer selber schreiben

Beitrag 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
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Scintilla Lexer selber schreiben

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
mbuettner
Beiträge: 88
Registriert: 14.05.2010 15:53
Computerausstattung: 3 GB RAM, Windows 7 32-Bit Home Premium
Wohnort: daheim
Kontaktdaten:

Re: Scintilla Lexer selber schreiben

Beitrag 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.
Bild
Bild
Die täglich beförderte Datenmenge des Internets beträgt 415 Petabyte oder 445.602.856.960 Megabyte!
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Scintilla Lexer selber schreiben

Beitrag von edel »

mbuettner
Beiträge: 88
Registriert: 14.05.2010 15:53
Computerausstattung: 3 GB RAM, Windows 7 32-Bit Home Premium
Wohnort: daheim
Kontaktdaten:

Re: Scintilla Lexer selber schreiben

Beitrag 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:
Bild
Bild
Die täglich beförderte Datenmenge des Internets beträgt 415 Petabyte oder 445.602.856.960 Megabyte!
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Scintilla Lexer selber schreiben

Beitrag 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())
mbuettner
Beiträge: 88
Registriert: 14.05.2010 15:53
Computerausstattung: 3 GB RAM, Windows 7 32-Bit Home Premium
Wohnort: daheim
Kontaktdaten:

Re: Scintilla Lexer selber schreiben

Beitrag 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.
Bild
Bild
Die täglich beförderte Datenmenge des Internets beträgt 415 Petabyte oder 445.602.856.960 Megabyte!
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: Scintilla Lexer selber schreiben

Beitrag von Fluid Byte »

Erwartest du ernsthaft das er weiß was MFC ist edel?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Scintilla Lexer selber schreiben

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten