Christian S.: SourceCode parsen / highlighten

Hi,

ich arbeite aus Spaß im Moment an Code-Erkennung (so nenne ich es mal). Speziell JavaScript Code. Ich möchte also verschiedene Bestandteile des Codes erkennen und unterscheiden, auch für Code-Highlighting.

Wie man einfache Strings erkennt, ist ja nicht so das Problem, auch Keywords nicht.

Komplexer wird es allerdings, wenn ich sowas hab:

var test = "a' gi " + '"b"';

Würde ich zB erst alle "-Strings erkennen und einfärben, wäre der zweite String schon falsch erkannt (also das "b"). Würde ich erst alle '-Strings suchen, wäre ' a gi " + ' ein String, was aber nicht stimmt.

Sehr ähnlich ist es bei regulären Ausdrücken:

var reg = /test" bla"/;

Und überhaupt, Codebestandteile innerhalb anderer Codebestandteile. Auch Strings innerhalb von Comments usw.

Das Problem ist halt: würde ich erst alle Comments suchen, dann alle Strings, dann wäre das hier fälschlicherweise auch ein Comment:

var com = "/*Test*/";

Und andersrum halt genauso.

Das hier zB würde auch zu einem Parserfehler führen:

/*
var test = /comment\*//;
*/

Also scheinen Strings irgendwie schon mal höhere "Priorität" gegenüber Comments zu haben, als reguläre Ausdrücke, da das hier geht:

/*
var test = "bla*/";
*/

Da bin ich jetzt überfragt, und wende mich an euch, da es für sowas ja sicher eine Lösung gibt.

Aber ich möchte zB auch Code Blöcke erkennen, also zB ganze Funktionen. Da ist das Problem, dass man ja nicht einfach nach /{.*?}/ suchen kann, da ja auch } innerhalb der Funktion gefunden wird.

Wie wird sowas gemacht?

Danke für Hilfe.

Gruß
Christian

  1. Hey Christian,

    vorab: Keine Ahnung, wie "sowas gemacht wird".

    Aber ich hab irgendwie das Gefühl, dass Dein Denkansatz im Moment Dich nicht weiterbringt. Strings haben keine höhere Priorität als Kommentare - umgekehrt genauso wenig.

    Du müßtest in Deiner Programmlogik/Schleife den Code von Anfang bis zum Ende durchgehen und je nach aktuellem Kontext vorgehen. Wenn ein Kommentar geöffnet wurde, befindest Du Dich im Kommentar-Kontext (oder meinetwegen "Modus") und suchst nach dem Kommentarende, egal ob ein String anfängt oder nicht. Befindest Du Dich im String-Modus, suchst Du nach dem Ende des Strings und scherst Dich nicht um Kommentar-Symbole. Für Block-Klammern müßtest Du halt die geöffneten und geschlossenen Klammern jeweils zählen, um sie einander zuordnen können...

    Weiß nicht, ob Dir das weiterhilft, viel Erfolg.

    Gruss,
    Patrick

  2. Hi,

    Wie wird sowas gemacht?

    Du beschäftigst Dich mit einem der komplexesten Standard-Probleme der Informatik. Deswegen wirst Du in einem Forum auch ganz sicher keine ausreichende Antwort erhalten. Wichtige Hinweise liefert Dir http://de.wikipedia.org/wiki/Compiler[1], für Weiteres folge den Literaturempfehlungen.

    Cheatah

    [1] Wobei es unerheblich ist, ob es überhaupt um eine Kompilierung im klassischen, engeren oder weiteren Sinne geht.

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      Wie wird sowas gemacht?

      Du beschäftigst Dich mit einem der komplexesten Standard-Probleme der Informatik. Deswegen wirst Du in einem Forum auch ganz sicher keine ausreichende Antwort erhalten. Wichtige Hinweise liefert Dir http://de.wikipedia.org/wiki/Compiler[1], für Weiteres folge den Literaturempfehlungen.

      Cheatah

      [1] Wobei es unerheblich ist, ob es überhaupt um eine Kompilierung im klassischen, engeren oder weiteren Sinne geht.

      Ich befürchtete fast, dass es in Richtung Compilerbau laufen würde....

      Habe aber gerade noch herausgefunden, wenn ich die RegExp, die ich im momentan zu Erkennung von Strings, RegExp, Comments, usw. nicht sequenziell auf den Code ablasse sondern durch ODER verknüpft, ist mein beschriebenes Problem scheinbar schon gelöst... muss noch testen...

      Gruß!

      1. Hi,

        Habe aber gerade noch herausgefunden, wenn ich die RegExp, die ich im momentan zu Erkennung von Strings, RegExp, Comments, usw. nicht sequenziell auf den Code ablasse sondern durch ODER verknüpft, ist mein beschriebenes Problem scheinbar schon gelöst... muss noch testen...

        ja, richtig: scheinbar. Dein Vorhaben ist mit RegExp allein nicht zu lösen, sie können allerhöchstens Hilfsmittel sein. Teste Deinen Code auch mit Folgendem:

        $var = "foo "bar" \" + $pathes['qa"z'] + """;

        Und wenn er diesen Code korrekt analysiert, erstellen wir den nächsten Testfall ;-)

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hi,

          Habe aber gerade noch herausgefunden, wenn ich die RegExp, die ich im momentan zu Erkennung von Strings, RegExp, Comments, usw. nicht sequenziell auf den Code ablasse sondern durch ODER verknüpft, ist mein beschriebenes Problem scheinbar schon gelöst... muss noch testen...

          ja, richtig: scheinbar. Dein Vorhaben ist mit RegExp allein nicht zu lösen, sie können allerhöchstens Hilfsmittel sein. Teste Deinen Code auch mit Folgendem:

          $var = "foo "bar" \" + $pathes['qa"z'] + """;

          Und wenn er diesen Code korrekt analysiert, erstellen wir den nächsten Testfall ;-)

          Cheatah

          »»

          Jo, den macht er richtig :-)

          1. Hi,

            $var = "foo "bar" \" + $pathes['qa"z'] + """;
            Und wenn er diesen Code korrekt analysiert, erstellen wir den nächsten Testfall ;-)
            Jo, den macht er richtig :-)

            $var = "Test\ ";

            Cheatah ;-)

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Hi,

              $var = "foo "bar" \" + $pathes['qa"z'] + """;
              Und wenn er diesen Code korrekt analysiert, erstellen wir den nächsten Testfall ;-)
              Jo, den macht er richtig :-)

              $var = "Test\ ";

              Cheatah ;-)

              auch den ;-)

  3. Hallo

    ich arbeite aus Spaß im Moment an Code-Erkennung (so nenne ich es mal). Speziell JavaScript Code. Ich möchte also verschiedene Bestandteile des Codes erkennen und unterscheiden, auch für Code-Highlighting.

    Heisst das "nur für Code-Highlighting" oder auch für anderes? Wenn du den Code noch weiter verarbeiten willst (z.B. schöner formatieren, compilen etc.), dann lohnt es sich einen Baum zu erstellen (Parserbaum).
    Andernfalls kannst du mit RegExp weiterarbeiten.

    Ich hab mal für ein Projekt einen Code-Highlighter in und für JavaScript geschrieben: http://www.mnn.ch/abc/html/ProgABC_codelab.html. Funktioniert ganz gut.
    Vielleicht hilft dir das weiter.

    Gruss,
    Mathias

    1. Nachtrag

      Funktioniert ganz gut.

      Mit deine Test-Cases auch nicht :(
      Da werd ich wohl über die Bücher müssen:)

  4. Ahoi Christian S.,

    Wie wird sowas gemacht?

    keine ahnung, kann dir nur sagen wie ich es machen würde. Wenn du mich
    fragst ist dein denkansatz falsch. Suche nicht im gesamten code nach
    schemas sondern gehe den Code zeilenweise durch und verfalle je nachdem
    was da so kommt ind die entsprechende Highlighting darstellung.

    hoffe du verstehst was ich meine.

    MfG