Wie eine Bison-Datei zu schreiben, um automatisch eine Token Aufzählung Liste in einer Datei C-Header definieren verwenden?
Frage
Ich versuche, einen Parser mit Bison / Yacc zu bauen, um die Lage sein, einen Strom von Token durch ein anderes Modul getan zu analysieren. Die Token werden bereits in einem Aufzählungstyp wie folgt aufgeführt:
// C++ header file
enum token_id {
TokenType1 = 0x10000000,
TokenType2 = 0x11000000,
TokenType3 = 0x11100000,
//... and the list go on with about 200/300 line
};
Ich habe durch die Dokumentation von Bison oft gegangen, aber ich konnte nicht eine bessere Lösung als das Kopieren jedes Token in der Bison-Datei wie folgt finden:
/* Bison/Yacc file */
%token TokenType1 0x10000000
%token TokenType2 0x11000000
%token TokenType3 0x11100000
//...
Wenn ich es so zu tun habe, wird es ziemlich hart wird die Datei, wenn die andere Modul Spezifikationsänderung (die passiert ganz oftenly) zu halten.
Könnten Sie mir bitte erklären, wie es zu tun, oder zeigen Sie mir in die richtige Richtung (eine Idee / Kommentar ist willkommen). Es würde helfen mir sehr! Danke im Voraus.
Lösung
Statt tun:
/* Bison/Yacc file */
%token TokenType1 0x10000000
%token TokenType2 0x11000000
%token TokenType3 0x11100000
//...
Sie müssen nur die Datei mit dem Token-Typ im Deklarationsteil enthalten
#include "mytoken_enum.h"
// ...
%token TokenType1
%token TokenType2
%token TokenType3
//...
EDIT: Dies kann nicht getan werden:
Wie Sie aus den Zahlen siehe oben, Bison nur Zahlen die Token sequentiell, und es verwendet wird, verschoben Parser-Lookup-Tabellen als Indizes, einfach für die Geschwindigkeit. So Bison nicht unterstützen, dass, ich fühle mich sicher, und es würde nicht einfach sein, mit dem passen Implementierungsmodell.
müssen nur Wrapper die reale Token yacc / Bison Token zu umwandeln (zB: über yylex ())
Andere Tipps
Die offensichtliche Methode wäre ein kleines Programm von einem Format in das andere zu konvertieren. Wenn Sie wirklich Veränderungen recht häufig machen, könnten Sie sogar betrachten die Namen und Werte in so etwas wie eine SQL-Datenbank gespeichert werden, und schreiben ein paar Abfragen für jedes Werkzeug der Ausgabe im richtigen Format zu erzeugen.
select token_name, '=' token_number ','
from token_table
select '%token ', token_name, ' ', token_number
from token_table
Die erste ein wenig massiert würde erfordern, wie zum Beispiel das Hinzufügen der ‚Enum token_id {“ am Anfang und ‚};.‘ Bis zum Ende, aber Sie die allgemeine Idee Natürlich gibt es viele Alternativen - - XML, CSV, etc., aber die allgemeine Idee bleibt das gleiche: zu speichern und bearbeitet so nah an Rohdaten wie möglich, und automatisieren Hinzufügen der zusätzliche „stuff“ notwendig, um die Werkzeuge zu halten glücklich
.