Lex in C++ Klasse kapseln und ggf. als DLL verwenden
-
Hallo an alle,
folgende Idee:
Ich möchte eine C++-SQL-Parserklasse schreiben die Lex verwendet und einen übergebenen String analysiert. Diese Klasse sollte unabhängig von der Main-Funktion sein und zur Weitergabe geeignet sein.
Wie ich Reguläre Ausdrücke definiere weiß ich, aber ich scheitere daran wie ich Lex "nur" in der Klasse implementiere. Natürlich wäre es auch interessant eine weitere Klasse zu haben die ebenfalls Lex verwendet, aber eine andere Problematik bedient.
Ich entwickle gerade auf Windows, werde den Code aber für Linux brauchen.
Vielen Dank für eure Unterstützung.
PS: Die Klasse in eine DLL unterzubringen ist zweitrangig
PPS: Nur um mein Problem noch etwas klarer zu machen, es sollte am Ende ca. so aussehen:// main.cpp int main(void) { Parser parser(); parser.parse("SELECT X FROM Object"); return 0; }
-
Was heisst bei dir "nur in einer Klasse definieren"?
Ich selbst kenne Lex nicht, aber ich tippe mal darauf, dass es aus eienr Bibliothek oder einem Framework kommt.
Das heisst für dich, dass du die entsprechende Datei in deinen klassenheader inkludierst, dir einen Attribut vom typ Lex anlegst und dieses in deiner Klasse nutzen kannst, und zwar genau so wie du möchtest.Also so in etwa:
// Parser.h #include <Lex/Lex.h> class Parser { Lex myLex; public: Parser() : myLex(/*meine Grammatiken oder was*/) {} void parse(std::string const& command) { // ... auto tokens = this->myLex.parse(command); // ... } // ... }; // main.cpp #include "Parser.h" int main(void) { Parser parser(); parser.parse("SELECT X FROM Object"); return 0; }Kein Problem, oder?
-
Ich wollte schon sagen, dass Skym0sh0 falsch liegt, weil er nicht weiß, was Lex ist/tut. Aber dann hab ich erst deine ursprüngliche Frage gelesen und du hast anscheinend genausowenig Ahnung.
Du brauchst "Lex" nicht mehr. Das generiert dir C Quellcode, den du ganz normal kompilierst. Ich dachte, du willst dynamisch neue Grammatiken Parsen lassen, aber das willst du ja anscheinend gar nicht.
-
Oh ja, jetzt wo dus sagst.
Ich hab vorhin mal kurz gegooglet, da kam auf den ersten Blick vermeintlich nix ordentliches raus. Aber der Wikipedia Artikel auf den man stößt sagst ja...