FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: Markus Bloch am 11 April 2013, 20:23:09

Titel: Hilfe beim Parsen von Define-Strings
Beitrag von: Markus Bloch am 11 April 2013, 20:23:09
Hallo zusammen,

irgendwie stehe ich gerade auf dem Schlauch. Ich will einen Modul-Define-String parsen z.B. so aussieht:


name PRESENCE shellscript "/opt/script.sh -arg1 -arg2" variable1 variable2


name PRESENCE {perlfunction("arg1 with spaces", "arg2");;} variable1 variable2


In beiden Fällen kann man den String nicht nach Whitespaces trennen, da diese ja durchaus variabel sind. Ich will also den Inhalt zwischen " und zwischen { oder } in einer Variable speichern.

Für das erste Beispiel eignet sich das Perl Standardmodul Text::ParseWords aber das funktioniert nicht für {}.

Gibt es hier ein allgm. Vorgehensweise oder wie lässt sich das am besten machen

Vielen Dank

Gruß
Markus
Titel: Aw: Hilfe beim Parsen von Define-Strings
Beitrag von: Markus Bloch am 12 April 2013, 23:53:44
Hat sich erledigt, ich habs mit Regex gelöst.
Titel: Aw: Hilfe beim Parsen von Define-Strings
Beitrag von: Dr. Boris Neubert am 13 April 2013, 11:45:30
Zitat von: Markus Bloch schrieb am Fr, 12 April 2013 23:53Hat sich erledigt, ich habs mit Regex gelöst.

Hallo Markus,

hast Du die Muße, die ich nicht habe?

Wir würden an sich gerne in FHEM einen echten Parser verwenden, weil das Parsen über Regexps uns einschränkt und Konstrukte wie ;; statt ; nötig macht, was nicht nur für Einsteiger verwirrend ist.

Ich hatte vor einigen Wochen Parse::RecDescent als Modul vorausgewählt (siehe Thread dazu). Das Package hat keine Abhängigkeiten und könnte in FHEM/lib mitgeliefert werden.

Es müßte vorab getestet werden, welchen Speicherverbrauch eine Verwendung erzeugt. Wenn das Ergebnis zu Rudis Zufriedenheit ausfällt, könnten wir eine Grammatik für FHEM-Kommandos schreiben und die FHEM-Kommandos fortan mit Parse::RecDescent parsen. Das wäre ein echter Befreiungsschlag.

Ich würde bei der Entwicklung mithelfen. Alleine kann ich das derzeit wegen einer Reihe anderer Betätigungen nicht leisten.

Viele Grüße
Boris