kompilieren von flex und bison in cpp
In der Regel, wenn wir kompilieren .l und .y Dateien, die wir erhalten .tab.h,.tab.c und .yy.c-Dateien. Allerdings brauche ich für die Verwendung in einer C++ - Umgebung mit Typen, die es nur in C++. Wie wollen Sie ändern Ihren code so, wie dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kompilieren Sie den generierten Dateien, die mit Ihr vertrauenswürdiger C++ - compiler, so dass Sie nicht haben, um das ganze umzuschreiben.
Wenn Sie gehen wollen "volle c++", halten Lesen.
Für Flex, müssen Sie angeben %option c++ in der Datei.
Sie können auch ändern Sie die generierte C++ - lexer-Namen mit --yyclass=NAME Befehl Linie argument.
Für Bison, Folgen Sie einfach dieser Anleitung (Auszug aus Bison-Handbuch)
P. S: beachten Sie, dass c++ und reentrant Optionen sind sich gegenseitig in der Flex.
Können Sie angeben, Ausgabe-Dateinamen mit Kommandozeilen-flags, so dass Sie nicht brauchen, um Ihren code so modifizieren, auf alle zu produzieren
.cc
Dateien, die sparen Sie einige Komplikation mit makefiles oder gleichwertig.Solange Ihre Aktionen und andere code Blöcke sind gültige C++ - code, und Sie enthalten keine nicht-POD-Typen in der semantischen union direkt (Zeiger sind in Ordnung, smart-Pointer, nicht), solltest du nichts ändern müssen.
Können Sie auch das C++ - templates in flex und bison, aber ich habe im Allgemeinen festgestellt, es einfacher zu halten mit den C-Vorlagen, die kompiliert einwandfrei mit C++.
Ich würde versuchen, dieses tutorial für Flex/Bison in C++: http://www.jonathanbeard.io/tutorials/FlexBisonC++
Das code-repository auf dem neuesten Stand und kompatibel mit den neuesten C++ - Compiler:
https://github.com/jonathan-beard/simple_wc_example
Speziell würde ich einen Blick auf die Beispiele
denen ein string (C++ - Typ) übergeben wird aus dem parser (.yy-Datei) hier:
Grundsätzlich so lange wie der C++ - Binär-weiß, wie behandeln Sie das Objekt, dann wird alles gut funktionieren. Um herauszufinden, warum das funktioniert, würde ich auf jeden Fall überprüfen Sie heraus die GitHub-repository und spielen mit dem code ein wenig.
Hoffe, das hilft. -J