Frage

Ich bin zur Zeit zu lernen, wie lexers und Parser arbeiten, und ich habe über Zustandsmaschine folgende Frage. Zum Beispiel, ich brauche Text durch folgende Regel kolorieren: Für diese Regel einfache Zustandsübergangstabelle wird wie folgt aussehen:

current event next  action
IDLE    $     COLOR -
COLOR   any   -     OnColor()
COLOR   \n    IDLE  -

Dies ruft OnColor () -Aktion für jedes Zeichen, das zwischen ‚$‘ und Zeilenende ist, so kann ich es kolorieren kann. Natürlich gleichen automatisch von regexp erzeugt werden kann, aber ich möchte wirklich wissen, wie es funktioniert, bevor schwere Magie Nutzung :). Als nächstes geht Problem: wenn ich eine Regel haben:  (Jede Textzeile färben will, die mit Dollar-Ende, das Zustandsübergangstabelle nicht ganz klar:

current      event next             action
IDLE         any   -                -
IDLE         $     DOUND_DOLLAR     -
FOUND_DOLLAR \n    IDLE             OnDollar()
FOUND_DOLLAR any   IDLE             -

Ich kann meine Zustandsmaschine zu nennen OnDollar () unterrichten, wenn es ein ‚$‘ Zeichen am Ende der Zeile gründet, aber was ich tue, um Text zu kolorieren, die vor dem Dollarzeichen Begegnung war? Was sind gemeinsame Muster, solche Probleme zu lösen? Natürlich wird es 1 Zeile mit regexp sein, aber ich bin wirklich daran interessiert zu wissen, wie solche Parser über Zustandsmaschine implementiert werden kann, und ist es überhaupt möglich.

War es hilfreich?

Lösung 3

Mit dem „lila Drachen Book“ (sic!) Zu lesen scheint es, dass moderne Compiler und Interpreter aktiv „look ahead“ Puffers und die letzten Text akkumulieren, so dass sie leicht überprüfen wenige nächsten Symbole und einige früheren Symbole, um genaues lexem zu erhalten Art.

Also, in meinem Beispiel event () müssen bei der nächsten aussehen und vorherigen Symbole, um Art von lexem zu entscheiden, die sich angesammelt werden könnten.

Andere Tipps

Wenn Sie gezwungen sind, ein Zeichen in einer Zeit zu färben (das heißt Sie haben keine Pufferung, Look-Ahead, Umfärbung oder Markierungsfähigkeiten), dann ist es unmöglich.

Andernfalls, wenn Sie solche Fähigkeiten haben, es kann getan werden; die Technik hängt davon ab, was verfügbar ist.

  • Umfärbung - haben eine Aktion, die n Zeichen zurück umfärben können. Offensichtlich ist dies eine triviale Lösung.

  • Buffering / Kennzeichnung - hat eine Aktion, die Zeichen auf Ende eines Puffers platziert / setzt eine benannte Markierung in der Quelle, anstatt den Charakters durch Stich gelassen. Wenn Sie dann später herausfinden, was zu tun ist, hat eine Aktion, die den Puffer der einen oder anderen, oder Spülungen von einer benannten Marke verpflichtet. Umfärbung mehr als 1 Zeichen mit diesem, wenn auch etwas komplizierter wird.

  • Die Look-Ahead - haben spekulative Übergänge, also verwenden, um eine NFA anstelle eines < a href = "http://en.wikipedia.org/wiki/Deterministic_finite_state_machine" rel = "nofollow noreferrer"> DFA .

Die meisten Colorizers immer auf einem größeren Block arbeiten, sagen, eine ganze Zeile (was in den meisten Fällen ausreichend ist) sowie ein „Leck“ Flagge für, sagen wir, mehrzeiligen Kommentaren. Sehen Sie die Qt Syntax Highlighter Beispiel für eine solche API.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top