Frage

Ich möchte ein Lexer in C bauen, und ich bitte die Drachen Buch rel="nofollow, I verstehen kann die Zustandsübergänge, sondern wie sie umgesetzt werden?

Gibt es ein besseres Buch?

Die Tatsache, dass ich eine Schnur durch eine Reihe von Staaten zu analysieren, so dass ich sagen kann, ob der String akzeptabel ist oder nicht!

War es hilfreich?

Lösung

G'day,

Angenommen, Sie den Drachen Buch über Compiler Design bedeuten, würde ich empfehlen, einen Blick um diese Seite auf Compiler-Tools.

Die Seite selbst ist recht klein, aber hat Verbindungen durch verschiedene exzellente Ressourcen auf lexikalische Analysatoren.

HTH

prost,

Andere Tipps

Sie können einfache Zustandsübergänge mit einer einzelnen Zustandsvariablen implementieren, wenn Sie zum Beispiel, um durch die Staaten wollen Start-> part1-> part2-> Ende dann können Sie eine ENUM verwenden Überblick über den aktuellen Stand zu halten und die Nutzung eine switch-Anweisung für den Code, den Sie in jedem Zustand ausgeführt werden sollen.

enum state { start=1, part1, part2, end} mystate;

// ...
mystate = start;
do {
  switch (mystate) {
    case start:
      // ...
    case part1:
      // ...
    case part2:
      // ...
      if (part2_end_condition) mystate = end; // state++ will also work
      // Note you could also set the state back to part1 on some condition here
      // which creates a loop
      break;
  }
} while (mystate != end);

Für komplexere Zustandsübergänge, die von verschiedenen Variablen abhängen, sollten Sie Tabellen / Arrays wie folgt verwendet werden:

var1    var2    var_end    next_state
0       0       0          state1
0       1       0          state2
1       0       0          state3
1       1       0          state4
-1      -1      1          state_end // -1 represents "doesn't matter" here

Es gibt mehr als einen Weg, es zu tun. Jeder regulärer Ausdruck entspricht direkt ein einfaches strukturiertes Programm. Zum Beispiel könnte ein Ausdruck für Zahlen so aus:

// regular expression
digit* [.digit*]

und der entsprechende C-Code sei:

// corresponding code
while(DIGIT(*pc)) pc++;
if (*pc=='.'){
    pc++;
    while(DIGIT(*pc)) pc++;
}

Der Übergang Tisch Weg lexers des Gebäudes ist, meiner Meinung nach, unnötig kompliziert, und natürlich läuft langsamer.

Wenn Sie sich für eine modernere Behandlung als die Drachen Buch (n) sucht: Andrew W. Appel und Maia Ginsburg, Modern Compiler-Implementierung in C , Cambridge University Press, 2008.

Kapitel 2 wird auf lexikalische Analyse konzentriert: lexikalische Token, Reguläre Ausdrücke, Endliche Automaten; Nichtdeterministischen Finite Automata; Lexer Generatoren

Sehen Sie sich die Table of Contents

Das Programm flex (ein Klon von lex) eine Lexer für Sie erstellen.

eine Eingabedatei mit den Lexer Regeln gegeben, es wird eine C-Datei mit einer Implementierung eines Lexer für diese Regeln erzeugen.

Sie können somit die Ausgabe von flex prüfen, wie eine Lexer in C zu schreiben, das heißt, wenn Sie gerade nicht verwenden wollen flex Lexer ...

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