Using the lex Program with the yacc Program

Sie können das Programm lex auch mit einem Parsergenerator wie dem Befehl yacc verwenden. Der Befehl yacc generiert ein Programm, das als Parserbezeichnet wird und die Konstruktion von mehr als einer Worteingabe analysiert.

Dieses Parserprogramm funktioniert gut mit den lexikalischen Analyseprogrammen, die der lex -Befehl generiert. Die Parser erkennen viele Grammatiktypen ohne Berücksichtigung des Kontexts. Diese Parser benötigen einen Vorprozessor, um Eingabetoken wie den Vorprozessor zu erkennen, den der Befehl lex erzeugt.

Das Programm lex erkennt nur erweiterte reguläre Ausdrücke und formatiert sie wie in der Eingabedatei angegeben in Zeichenpakete, die als Tokensbezeichnet werden. Wenn Sie das Programm lex verwenden, um eine lexikalische Analysefunktion für einen Parser zu erstellen, partitioniert die (mit dem Befehl lex erstellte) lexikalische Analysefunktion den Eingabedatenstrom. Der Parser (aus dem Befehl yacc ) ordnet den resultierenden Teilen eine Struktur zu. Sie können auch andere Programme zusammen mit den Programmen verwenden, die von den lex -oder yacc -Befehlen generiert wurden.

Ein Token ist die kleinste unabhängige Bedeutungseinheit, die entweder vom Parser oder vom lexikalischen Analyseprogramm definiert wird. Ein Token kann Daten, ein Sprachschlüsselwort, eine Kennung oder andere Teile einer Sprachsyntax enthalten.

Das Programm yacc sucht nach einer Subroutine der lexikalischen Analysefunktion mit dem Namen yylex, die vom Befehl lex generiert wird. Normalerweise ruft das Standardhauptprogramm in der lex -Bibliothek die Subroutine yylex auf. Wenn jedoch der Befehl yacc installiert ist und sein Hauptprogramm verwendet wird, ruft das Programm yacc die Subroutine yylex auf. In diesem Fall gilt Folgendes:tokenWert zurückgegeben wird, sollte jede lex -Programmregel wie folgt enden:
return(token);
Der Befehl yacc weist jedem Token, das in der yacc -Grammatikdatei definiert ist, über eine Vorprozessoranweisung #define einen ganzzahligen Wert zu. Das lexikalische Analyseprogramm muss Zugriff auf diese Makros haben, um die Tokens an den Parser zurückzugeben. Verwenden Sie die Option yacc -d, um eine Datei y.tab.h zu erstellen, und nehmen Sie die Datei y.tab.h in die lex-Spezifikationsdatei auf, indem Sie die folgenden Zeilen in den Definitionsabschnitt der lex-Spezifikationsdatei einfügen:
%{
#include "y.tab.h"
%}
Alternativ können Sie die Datei lex.yy.c in die Ausgabedatei yacc einschließen, indem Sie die folgende Zeile nach der zweiten Zeile hinzufügen:%%(Prozentzeichen, Prozentzeichen) Begrenzer in der Grammatikdatei yacc :
#include "lex.yy.c"

Die Bibliothek yacc sollte vor der Bibliothek lex geladen werden, um ein Hauptprogramm abzurufen, das den yacc -Parser aufruft. Sie können lex -und yacc -Programme in jeder Reihenfolge generieren.