Variablen binden mittels regulären Ausdruck



  • Hallo!

    Ich habe einen String, der wie folgt aussehen könnte:

    set(121,145)
    get(569.41)
    commit(asdf)

    Jetzt möchte ich z.B. ein String-Array und einen regulären Ausdruck, der mir die einzelnen Methoden-Aufrufe und Parameter eben in das String-Array speichert!

    Also z.B.

    static const boost::regex pattern_rw ("(set|get){1}[(][0-9][,][0-9][)]",boost::regex_constants::icase|boost::regex_constants::perl);
    

    soll mir bei dem String

    set(121,145)

    in das String-Array folgende Werte speichern:

    String-Array[0] = set
    String-Array[1] = 121
    String-Array[2] = 145

    Hat hier irgendjemand eine Idee wie das funktioniert? Oder wie könnte man sonst solche String am besten parsen?



  • Vielleicht frage ich mal andersrum.Was willst du erreichen?Eventuell geht es ja auch anders.



  • Naja ich habe halt eine Datei, in der gewissen Methodenaufrufe stehen, also z.B.

    get(<xxx>)
    rollbak(<xxx>)
    commit(<xxx>)
    set(<xxx>)

    Ich möchte jetzt eine Parser-Klasse schreiben, die diese Methoden enthält und eine Datei parst und diese Methoden aufruft. War das irgendwie verständlich?



  • Kurz und Knapp. Ist nicht möglich. Nachdem du kompiliert hast, sind die Methoden und Methodennamen usw nicht mehr existent.



  • OK, dann vielleicht das Problem ein wenig anders ausgedrückt:

    Ich habe eine Datei mit folgenden Befehlen:

    get(<xxx>)
    rollbak(<xxx>)
    commit(<xxx>)
    set(<xxx>)

    Diese Datei soll geparst werden und dann gewisse Aktionen durchgeführt werden, wie kann ich diese Datei mit den Befehlen am besten parsen?



  • Benutze eine der gebräuchlichen Skriptsprachen wie Lua oder Python.



  • Reinoslav schrieb:

    OK, dann vielleicht das Problem ein wenig anders ausgedrückt:

    Ich habe eine Datei mit folgenden Befehlen:

    get(<xxx>)
    rollbak(<xxx>)
    commit(<xxx>)
    set(<xxx>)

    Diese Datei soll geparst werden und dann gewisse Aktionen durchgeführt werden, wie kann ich diese Datei mit den Befehlen am besten parsen?

    Ganz einfach in 3 Schritten:
    1.) Nenne die Datei .cpp
    2.) Schicke sie durch einen Compiler und
    3.) führe das Ergebnis aus.

    😉

    Ich verstehe den Hang zum "Interpretieren" nicht so ganz ... in meiner Erfahrung gibt es kaum ein Problem, deren Lösung wirklich dauernd und weitgreifend Änderung der Ablaufsteuerung braucht.

    ... und da wo ich es gesehen habe, gab es im Ergebnis derart viele Schwierigkeiten, dass man doch wieder eine "Programmiersprache" (oder meinetwegen ein Framework mit ziemlich festen Regeln) erfand, um Stabilität und Nachvollziehbarkeit irgendwie gewährleisten zu können.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Ich verstehe den Hang zum "Interpretieren" nicht so ganz ... in meiner Erfahrung gibt es kaum ein Problem, deren Lösung wirklich dauernd und weitgreifend Änderung der Ablaufsteuerung braucht.

    Es geht um die bereits eingebauten und kinderleicht anwendbaren Features der Skriptsprachen. Wenn du die Zeile

    static const boost::regex pattern_rw ("(set|get){1}[(][0-9][,][0-9][)]",boost::regex_constants::icase|boost::regex_constants::perl);
    

    mal betrachtest, weißt Du vielleicht, wovon die Rede ist.



  • Nein, diese Datei soll als Skriptdatei verstanden werden und geparst werden, das ist zumindest mal meine Vorgabe. Und diese Befehle müssen von mir in irgendeiner Art und Weise geparst und interpretiert werden...



  • Labert doch keinen Müll (abgesehen von dem Skriptsprachen vorschlag, der war gut, aber ich glaube, dass der TO schon das Format für die Datei vorgegeben hat). Natürlich geht das und dein Ansatz mit dem regulären Ausdruck wäre durchaus eine praktikable Lösung, wenn auch unflexibel.

    Einfacher wäre es einen kleinen Parser zu schreiben, du liest zuerst den Funktionsnamen aus, je nachdem ob du Leerzeichen zulässt kannst du ja einfach bis zu ( lesen und hast den Funktionsnamen. Dann die Parameterliste ist ja wirklich einfach, einfach den String bis ) einlesen, Leerzeichen (falls erlaubt) entfernen und den String beim Komma splitten und schon hast du Funktionsname und alle Parameter.

    Die Funktionen selbst würde ich in einer std::map ablegen mit dem Funktionsnamen als Key und der zugehörigen Funktion als Value.



  • Danke für den Tip mit std::map. Ich habe mich jetzt in der Zwischenzeit mal mit dem boost::spirit Parser Framework beschäftigt. Scheint echt mächtig zu sein, aber für mein Vorhaben wohl zu umfangreich...


Anmelden zum Antworten