AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SynEdit-Highlighter, der Strings ignorieren soll

Ein Thema von Matze · begonnen am 29. Nov 2005 · letzter Beitrag vom 7. Dez 2005
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

SynEdit-Highlighter, der Strings ignorieren soll

  Alt 29. Nov 2005, 19:13
Moin

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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: SynEdit-Highlighter, der Strings ignorieren soll

  Alt 30. Nov 2005, 08:04
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
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: SynEdit-Highlighter, der Strings ignorieren soll

  Alt 30. Nov 2005, 15:51
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: SynEdit-Highlighter, der Strings ignorieren soll

  Alt 30. Nov 2005, 17:53
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
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#5

Re: SynEdit-Highlighter, der Strings ignorieren soll

  Alt 30. Nov 2005, 17:58
huhu,

schau doch mal in meinem gemoddten SynGeneralHighlighter hinein,
da wirst du sicherlich fündig.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: SynEdit-Highlighter, der Strings ignorieren soll

  Alt 30. Nov 2005, 21:34
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:

Comment,BraceComment,{,},MultiLine 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 hier jemand):

Comment,BraceComment,-- @bigg: Danke, konnte es nun so lösen, bzw. ich hoffe, dass ich's nun so lösen kann.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: SynEdit-Highlighter, der Strings ignorieren soll

  Alt 2. Dez 2005, 09:32
Hallo Matthias,

Zitat von Matze:
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
Comment,BraceComment,--
da hast du recht. Ich habe mir SynGen mal angesehen. Ich weiß nicht warum, aber alle scheinen eine irre Freude daran zu haben die SynGen grammar files durch eigene Code-Strecken zu verbiegen - nur um EOL terminierte enclosures zu ermöglichen. Ich halte eine kleine Änderung an der SynGenUnit für komfortabler und effektiver:

Delphi-Quellcode:
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;
Damit werden alle enclosures ohne definierten terminator durch EOL terminiert - und für deine Kommentarsyntax wird ein korrekter Parser wird generiert - hoffe ich...

Vorweihnachtliche Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: SynEdit-Highlighter, der Strings ignorieren soll

  Alt 2. Dez 2005, 14:46
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:
  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;
Nur hat dies leider keine Auswirkung auf das Ergebnis. Erzeugt wird immer noch eine Unit, die wie folgt aussieht:

Delphi-Quellcode:
procedure TSynAdaSyn.Next;
begin
  fTokenPos := Run;
  case fRange of // <== Hier fehlt natürlich etwas
  else
    begin
      fRange := rsUnknown;
      fProcTable[fLine[Run]];
    end;
  end;
end;
Beim Aufruf von

Delphi-Quellcode:
ENCLOSEDBY

Comment,BraceComment,--
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: SynEdit-Highlighter, der Strings ignorieren soll

  Alt 2. Dez 2005, 14:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: SynEdit-Highlighter, der Strings ignorieren soll

  Alt 2. Dez 2005, 15:43
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz