2010-11-26 4 views
1

Lassen Sie mich mit einem Beispiel erzählen. den Inhalt einer Textdatei Angenommen, sind wie folgt:Wie man Lex und Yacc programmiert, um eine Teildatei zu analysieren

Funktion fun1 {
    int a, b, c;
    Funktion fun2 {
        int d, e;
        char f g;
        Funktion fun3 {
            int h, i;
       }
   }

In dem obigen Text-Datei, die Anzahl der Öffnungs Klammern passen nicht die Anzahl der Schließ Klammern. Die Datei als Ganzes folgt nicht der Syntax. Die Teilfunktionen fun2 und fun3 folgen jedoch der Syntax. In der Regel ist die Textdatei sehr groß.

Wenn der Benutzer die gesamte Datei analysieren möchte, dh die Funktion fun1, sollte das Programm einen Fehler ausgeben, da die Klammern nicht übereinstimmen. Wenn der Benutzer jedoch nur die Teildatei analysieren möchte, dh die Funktion fun2/fun3, sollte das Programm keinen Fehler ausgeben, da die Klammern übereinstimmen.

Ich habe jetzt eine Frage 1. Gibt es eine Möglichkeit, die Lex und Yacc laden nur eine Teildatei? Wenn ja, wie muss es gemacht werden.

Antwort

2

Verwenden Sie Bison/Flex oder einfach alte yacc/lex? Ich habe lange mit yacc gespielt.

Die technische Antwort ist für beide Werkzeugpaare unterschiedlich.

Mit flex müssen Sie sich mit the buffer mechanism beschäftigen. Der endgültige Code wird sauberer sein.

Mit lex müssen Sie alles von Hand tun. Zumindest müssen Sie Eingabe- und Ausgabe-Makro neu definieren. Sie können auch versuchen, mit yyin und fseek zu spielen.

Auf der Parser Seite werden Sie mit Fehlermanagement zu tun haben (yyerrok Makro) und error Token

http://dinosaur.compilertools.net/bison/bison_9.html#SEC81

Verwandte Themen