Hilfe bei einfachem Parser

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hallo,

ich brauche für mein aktuelles Projekt Gestikk eine einfache Skriptsprache, die erörtern soll, ob bestimmte Voraussetzungen gegeben sind; dafür sollte sie ausgewählte Python-Funktionen aufrufen können.
Ich habe bereits einen Versuch gestartet: Hier der Code. Er ist nicht so schön anzusehen, aber er funktioniert wenigstens ;)
Derzeit funktioniert das so: Es wird ein ConditionHandler erstellt, dem mit add_callback Funktionen hinzugefügt werden. Später ruft man dann check auf, um einen bestimmten Ausdruck auf Wahrheit zu testen.
Wenn man mit add_callback die Funktionen 'active_window' hinzugefügt hat, kann der folgende Ausdruck ausgewertet werden:

Code: Alles auswählen

active_window Gnome or active_window 'Firefox Version 2.0'
. Dann wird die Funktion, die an 'active_window' gebunden ist einmal mit dem Argument 'Gnome' aufgerufen und einmal mit 'Firefox Version 2.0' aufgerufen.
Funktioniert soweit ganz gut, auch die Verkettung mit and, or und xor geht.

Nun habe ich aber das Problem, dass ich gerne verschachtelte Ausdrücke hätte, zum Beispiel:

Code: Alles auswählen

(active_window Gnome and application_running Nautilus) or active_window Firefox
Und daher meine Frage:
Hat da jemand eine Idee, wie ich das mit meinem derzeitigen Parser elegant lösen könnte? Oder einen völlig anderen, flexibleren Ansatz? Vielleicht sogar ein Modul, das das für mich erledigen kann? :D

Gruß,
Fred
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also evtl solltest Du mal einen Blick auf Parser-Generatoren werfen! Ist mit Sicherheit das felxibeslte und vor allem ein leicht erweiterebares System! Im wiki steht dazu afaik etwas.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Guck dir PyParsing an, für mich war es eine art Erleuchtung ;)
Man kann damit eine Sprache nahezu so bescheiben, wie man es mit der BNF tun würde
BlackJack

Bevor Du eine eigene kleine Sprache entwirfst, könntest Du überlegen gleich Python dafür zu verwenden.

Ansonsten ist etwas Scheme-artiges für solche Sachen recht simpel zu verarbeiten.

Code: Alles auswählen

(or (active_window 'Gnome') (active_window 'Firefox Version 2.0'))

(or (and (active_window 'Gnome') (application_running 'Nautilus'))
    active_window 'Firefox')
Wenn Du XML zum konfigurieren benutzt, bräuchtest Du keinen Parser schreiben.

Und man sollte Sonderfälle vermeiden. Zum Beispiel das man Argumente zu den Prädikaten mit und ohne Anführungszeichen schreiben kann. Es wird keinen umbringen die Anführungszeichen immer zu setzen und vereinfacht den Parser.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hallo,

erstmal danke für die Antworten. pyparsing hatte ich mir mal angesehen, aber irgendwie habe ich das nicht so richtig verstanden ;) Werde aber auf jeden Fall nochmal einen Blick drauf werfen.
BlackJack, zum Thema Python: Fände ich persönlich auch nicht schlecht, allerdings sagte man mir, sowas könne man nicht wirklich sicher gestalten. Das Risiko würde ich dann lieber nicht eingehen.
XML geht leider nicht, da das Ganze schon in XML eingebettet ist ;) Die Scheme-Sache sieht gut aus, gibts da denn was für Python?

Gruß Fred
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

fred.reichbier hat geschrieben:erstmal danke für die Antworten. pyparsing hatte ich mir mal angesehen, aber irgendwie habe ich das nicht so richtig verstanden ;) Werde aber auf jeden Fall nochmal einen Blick drauf werfen.
Pyparsing oder wenn du eine formale Grammatik aufstellst dann ist PLY noch ziemlich zu empfehlen. Du kannst dir auch Pysec ansehen, aber das ist dann schon recht heavyweight :)
fred.reichbier hat geschrieben:BlackJack, zum Thema Python: Fände ich persönlich auch nicht schlecht, allerdings sagte man mir, sowas könne man nicht wirklich sicher gestalten. Das Risiko würde ich dann lieber nicht eingehen.
Hmm, was meinst du? Dass dann beliebige Funktionen ausgeführt werden könnten? Ja, das stimmt.
fred.reichbier hat geschrieben:XML geht leider nicht, da das Ganze schon in XML eingebettet ist ;) Die Scheme-Sache sieht gut aus, gibts da denn was für Python?
Ein Scheme in Python? Wird immer mal wieder implementiert... (siehe reddit) alternativ kannst du auch ein C-Modul für Python schreiben, das Guile einbettet, eine Scheme-Abart, die speziell für embedden gedacht ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

fred.reichbier hat geschrieben: XML geht leider nicht, da das Ganze schon in XML eingebettet ist ;)
Wieso kann man das dann nicht erweitern? Ist doch eigentlich der logischste Schritt:

Code: Alles auswählen

<foo:block operator="or">
  <foo:block operator="and">
    <foo:order key="active_window" value="Gnome"/>
    <foo:order key="active_window" value="Nautilus"/>
  </foo:block>
  <foo:order key="active_window" value="Firefox"/>
</foo:block>
Wenn Du das XML drum herum eh schon parst, sollte das doch so kein Problem sein!
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hallo,

danke nochmal für die Hilfe. Ich habe jetzt mit pyparsing angefangen, und jetzt, nachdem ich es verstanden habe und im #python.de Hilfe bekommen habe (danke nochmal an GrindCore ;)), finde ich es ziemlich passend.

Hyperion: Nette Idee, aber das ist mir irgendwie zu viel Arbeit :p
Gruß,
Fred
Antworten