![]() |
SynEdit-Highlighter, der Strings ignorieren soll
Moin :hi:
Unter dem Titel kann sich keiner etwas vorstellen, doch ist mir kein besserer eingefallen. Ich habe mit mittels dem SynEdit General-Highlighter einen Highlighter zusammengebastelt, was auch einwandfrei fuktioniert, bis auf die Tatsache, dass der Highlighter für Kommentare auch dann anspringt, wenn sich die Zeichen, die einen (einzeiligen) Kommentar einleiten, in einem String befinden. Start und End-Expressions für den Kommentar-Highlighter sehen so aus: --(.*?)$ bzw. ^, was ich über ein Scheme eingestellt habe. Wie kann ich nun die 2 Striche ("--") innerhalb von Strings ignorieren? |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hallo Matthias.
Hast du denn schon einen ENCLOSEDBY Eintrag für deine Strings gemacht? Ich kenne die Komponente kaum, aber ich würde erwarten, dass Kommentare innerhalb von Strings nicht erkannt werden. Grüße vom marabu |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hallo marabu
Danke. Schön zu hören, dass es möglich ist, doch komme ich damit nicht ganz klar. Ich habe mir einige Demos angeschaut, wo immer von Grammar Files gesprochen wird, die man erstellen muss, doch wie man das genau macht, habe ich nicht herausgefunden. Und in der Highlighter-Demo des SynEdits wird ENCLOSEDBY kein einziges Mal erwähnt. Momentan mache ich das ohne Grammar File. Ich habe lediglich TSynGen benutzt und das mit TSynMultiGen kombiniert, für das ich das Schema für den einzeiligen Kommentar eingestellt habe. Wie funktioniert das denn genau? |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hallo Matthias,
zu SynGen gibt es eine kleine aber feine Dokumentation, die deine Anforderung ganz gut beschreibt - denke ich. Die Datei heißt Highlighters-HowTo.rtf und müsste sich in deinem SynGen Installationsordner befinden. Wenn du nach dem Studium des Dokuments noch Probleme haben solltest, dann melde dich einfach nochmal. Grüße vom marabu |
Re: SynEdit-Highlighter, der Strings ignorieren soll
huhu,
schau doch mal in meinem gemoddten SynGeneralHighlighter hinein, da wirst du sicherlich fündig. :wink: |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hallo
@marabu: Super, genau das ist das richtige, ich wusste gar nicht, dass es das gibt. Alles klappt, nur habe ich ein kleines Problem und zwar weiß ich nicht, wie ich die Kommentare angeben muss. In der HTML-Datei steht dieses Beispiel:
Delphi-Quellcode:
Mein Kommentar muss jedoch einzeilig sein und wird mittels "--" eingeleitet. Also müsste es ja irgendwie so in der Art gehen, nur geht es nicht, da dann die Parameter für eine Schleife in der erzeugten Unit fehlen (dieses Problem hatte auch
Comment,BraceComment,{,},MultiLine
![]()
Delphi-Quellcode:
@bigg: Danke, konnte es nun so lösen, bzw. ich hoffe, dass ich's nun so lösen kann. ;)
Comment,BraceComment,--
|
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hallo Matthias,
Zitat:
Delphi-Quellcode:
Damit werden alle enclosures ohne definierten terminator durch EOL terminiert - und für deine Kommentarsyntax wird ein korrekter Parser wird generiert - hoffe ich...
begin
// ... // the following condition enables EOL termination for // enclosures in the ENCLOSEDBY section of SYNGEN grammar // files when terminator is an empty string // (marabu 2005-12-02) if TLexEnclosedBy(EnclosedList[I]).EndsWith <> '' then begin Write(OutFile, sPrefix, ' if '); for J := 1 to Length(TLexEnclosedBy(EnclosedList[I]).EndsWith) do begin if (J > 1) then begin Writeln(OutFile, ' and'); Write(OutFile, sPrefix, ' '); end; Write(OutFile, '(fLine[Run' + AddInt(J - 1) + '] = ''' + StuffString(TLexEnclosedBy(EnclosedList[I]).EndsWith[J]) + ''')'); end; Writeln(OutFile, ' then'); Writeln(OutFile, sPrefix, ' begin'); Writeln(OutFile, sPrefix, ' Inc(Run, ' + IntToStr(Length(TLexEnclosedBy(EnclosedList[I]).EndsWith)) + ');'); Writeln(OutFile, sPrefix, ' fRange := rsUnKnown;'); Writeln(OutFile, sPrefix, ' Break;'); Writeln(OutFile, sPrefix, ' end;'); end; // ... end; Vorweihnachtliche Grüße vom marabu |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hallo marabu, herzlichen Dank für deine Bemühungen.
Ich habe es nun hier eingefügt: \synedit\SynGen\SynGenUnit.pas, Z. 1364 ff.:
Delphi-Quellcode:
Nur hat dies leider keine Auswirkung auf das Ergebnis. Erzeugt wird immer noch eine Unit, die wie folgt aussieht:
for I := 0 to (EnclosedList.Count - 1) do
begin { if (TLexEnclosedBy(EnclosedList[I]).StartsWith <> '') then begin Writeln(OutFile, ' ''' + StuffString(TLexEnclosedBy(EnclosedList[I]).StartsWith[1]) + ''': fProcTable[I] := ' + TLexEnclosedBy(EnclosedList[I]).ProcName + 'OpenProc;'); end; } // -------------------------------------------------------------------------- // the following condition enables EOL termination for // enclosures in the ENCLOSEDBY section of SYNGEN grammar // files when terminator is an empty string // (marabu 2005-12-02) if TLexEnclosedBy(EnclosedList[I]).EndsWith <> '' then begin Write(OutFile, sPrefix, ' if '); for J := 1 to Length(TLexEnclosedBy(EnclosedList[I]).EndsWith) do begin if (J > 1) then begin Writeln(OutFile, ' and'); Write(OutFile, sPrefix, ' '); end; Write(OutFile, '(fLine[Run' + AddInt(J - 1) + '] = ''' + StuffString(TLexEnclosedBy(EnclosedList[I]).EndsWith[J]) + ''')'); end; Writeln(OutFile, ' then'); Writeln(OutFile, sPrefix, ' begin'); Writeln(OutFile, sPrefix, ' Inc(Run, ' + IntToStr(Length(TLexEnclosedBy(EnclosedList[I]).EndsWith)) + ');'); Writeln(OutFile, sPrefix, ' fRange := rsUnKnown;'); Writeln(OutFile, sPrefix, ' Break;'); Writeln(OutFile, sPrefix, ' end;'); end; // -------------------------------------------------------------------------- end;
Delphi-Quellcode:
Beim Aufruf von
procedure TSynAdaSyn.Next;
begin fTokenPos := Run; case fRange of // <== Hier fehlt natürlich etwas else begin fRange := rsUnknown; fProcTable[fLine[Run]]; end; end; end;
Delphi-Quellcode:
ENCLOSEDBY
Comment,BraceComment,-- |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Matthias, bitte nicht irgendwo einfügen - der Code im begin end Block ist der Original-Code. Suche den Code und wickel ihn in meine drei Zeilen ein.
marabu |
Re: SynEdit-Highlighter, der Strings ignorieren soll
:wall: Wie dämlich von mir, danke. Doch klappt dies leider so auch nicht. Es tritt der gleiche Fehler wie oben auf. Und diesmal habe ich die if-Abfrage richtig eingefügt. :stupid:
|
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hallo Matthias,
Delphi-Quellcode:
wie kommst du darauf, dass an der bezeichneten Stelle etwas fehlt? Hast du denn MultiLine-Einträge spezifiziert?
procedure TSynAdaSyn.Next;
begin fTokenPos := Run; case fRange of // <== Hier fehlt natürlich etwas else begin fRange := rsUnknown; fProcTable[fLine[Run]]; end; end; end; marabu |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Zitat:
Delphi-Quellcode:
ergibt doch keinen Sinn. Es fehlen ja die Werte der Variablen, auf die überprüft wird.
case xyz of
else Zitat:
|
Re: SynEdit-Highlighter, der Strings ignorieren soll
Nur wenn du im Abschnitt ENCLOSEDBY Einträge spezifizierst, die als letzten Parameter "Multiline" aufweisen (wie beim BraceComment - der von Ada sollte wohl besser LineEndComment heißen) werden auch Selektoren für das CASE Statement generiert. Probiere es doch einfach aus, indem du den PASCAL BraceComment aufnimmst:
Code:
marabu
Comment,BraceComment,{,},Multiline
|
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hallo
Ja, so geht es ja, aber ich benötige ja kein Multiline, sondern möchte sowas wie
Delphi-Quellcode:
haben. Dein Beispiel würde schon gehen.
Comment,BraceComment,--
|
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hast du denn die generierte Unit einmal verwendet? Der Erfolg meiner Anpassung macht sich in der generierten Unit in der Prozedur LineEndCommentProc bemerkbar - wenn der Ada-Comment LineEndComment genannt wurde:
Delphi-Quellcode:
Sobald ich kann werde ich es selbst überprüfen.
procedure TSynSampleSyn.LineEndCommentProc;
begin fTokenID := tkComment; repeat // es ist dieser Teil der bei EOL terminierten enclosures // nicht erzeugt werden darf... { if then begin Inc(Run, 0); fRange := rsUnKnown; Break; end; } if not (fLine[Run] in [#0, #10, #13]) then Inc(Run); until fLine[Run] in [#0, #10, #13]; end; marabu |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hallo
Zitat:
Delphi-Quellcode:
Nur klappt das nicht, wie gesagt, es tritt immer der Fehler auf, dass die Case-Anweisung leer ist.
Comment,LineEndComment,--
|
Re: SynEdit-Highlighter, der Strings ignorieren soll
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Matthias,
ich habe mir SynGen nochmal genauer angesehen und noch zwei Dinge nachgebessert. Das erste betrifft deine Beobachtung mit dem leeren CASE Statement. SynGen kann in der Original-Fassung (1.1) keine Grammatiken verarbeiten, die in der ENCLOSEDBY section nicht mindestens ein MULTILINE token aufweisen. Nun geht das. Das zweite Problem entsteht durch deine Schreibweise des LineEndComment. SynGen ist ja erst durch meine Änderung überhaupt in der Lage EOL terminierte token über die ENCLOSEDBY section zu verarbeiten. In der Original-Fassung ist nur der MULTILINE-Parameter optional. Ich habe jetzt auch ENDSWITH optional gemacht - ist nur konsequent. Ich habe die modifizierte Unit SynGenUnit angehängt - und sicherheitshalber noch die Datei SynEdit.inc, auch wenn du die wohl schon selbst angepasst hast. Ich habe den Kommentar im Ada-Style dann in der HighlighterDemo von SynEdit erfolgreich getestet. Schönes Wochenende marabu PS: Meine Änderungen habe ich mit meinem nick gekennzeichnet, damit du sie nachvollziehen kannst. |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hallo marabu,
das war ja doch mehr als ich dachte, alle Achtung. Vielen Dank, dass du dir die Mühe gemacht hast, die Datei anzupassen, es funktioniert genau so, wie es soll. Super. :thumb: |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hi,
nicht schlimm, aber irgendwie seltsam: Gebe ich 4 Bindestriche ein, wird der letzte Strich nicht grün, sondern schwarz dargestellt. Das geht in 3er Schritten nach oben: Der letzte von 7 / 10 / 13 / 16 / ... Strichen ist immer schwarz. Woran kann das liegen? |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Matthias,
das liegt daran, dass ich gepatzt habe. Ich habe in der Prozedur SynGenUnit.RetrieveEnclosedBy() vergessen die konsumierten Zeichen am Zeilenende zu löschen. Ich habe das jetzt nachgebessert und getestet und jetzt sollten deine Farben stimmen. Im Anhang das ZIP-Archiv mit der berichtigten Unit. Grüße vom marabu |
Re: SynEdit-Highlighter, der Strings ignorieren soll
Hi marabu,
nun passt es klasse, danke. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz