Wie eine Bison-Datei zu schreiben, um automatisch eine Token Aufzählung Liste in einer Datei C-Header definieren verwenden?

StackOverflow https://stackoverflow.com/questions/2115253

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.

War es hilfreich?

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

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