Python Parsergeneratoren

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Python Parsergeneratoren

Beitragvon Leonidas » Montag 22. Oktober 2007, 18:41

Hallo!

Ich bin dabei eine Programmiersprache zu implementieren und suche im Moment Tools die mir dabei helfen. Optimalerweise bräuchte ich Python-Equivalents zu JLex oder JFlex und CUP.

Bisher habe ich die Wiki-Seite LanguageParsing gefunden, aber darüber hinaus echt wenig, daher würde es mich freuen wenn ihr mir ein paar Tipps in die richtige Richtung geben könntet.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Montag 22. Oktober 2007, 19:25

Ich hab mir dir bis jetzt noch nicht wirklich angetan, weil die meisten *grausigen* Code generieren. Warum nicht Parser selber schreiben? :-)
TUFKAB – the user formerly known as blackbird
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Montag 22. Oktober 2007, 20:40

Weil das zwar ne gute Übung ist, aber mit der Zeit langweilig wird? :D
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

Beitragvon BlackJack » Montag 22. Oktober 2007, 21:03

Wenn ich einen Parser brauche verwende ich gerne PyParsing.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 22. Oktober 2007, 21:23

mitsuhiko hat geschrieben:Warum nicht Parser selber schreiben? :-)

Weil das mit Hand schreiben zwar nett ist, aber wie ich in der letzten Zeit gemerkt habe, sehr leicht zu Fehlern führt, dass man etwas übersetzt, etc. Das wäre eben ein Fall wo Unit-Testing *sehr* nützlich ist.

Ich habe von mitsuhiko noch Ned Batchelders Parserliste bekommen.

Was auf den ersten Blick so brauchbar aussah:
  • pyparsing - BlackJacks Empfehlung
  • ZestyParser - ist vielleicht mächtiger als pyparsing, aber die Syntax gefällt mir nicht besonders.
  • yeanpypa (eine Mischung aus pyparsing und boost::spirit)
  • SPARK (ist nun tatsächlich in Python enthalten - habe es geprüft) allerdings ist das letzte Release von 2002 und die Dokumentation ist nicht so berauschend. Es gibt allerdings einen Charming Python-Artikel von David Mertz
  • Plex - vom Pyrex-Autor, recht aktuell aber leider nur ``lex``-Funktionalität, eine ``yacc/bison``-Kombi wäre praktischer.
  • PLY von David Beazley, einer eher bekannten Person in der Python-Welt, auch ziemlich aktuell
  • aperiot recht neue Software, sieht auf den ersten Blick brauchbar aus.
  • Toy Parser Generator
  • Parsing - scheint zumindest von den Spezifikationen ganz brauchbar zu sein. Kaum Dokumentation :(
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Montag 22. Oktober 2007, 22:42

birkenfeld hat geschrieben:Weil das zwar ne gute Übung ist, aber mit der Zeit langweilig wird? :D

Das mag schon sein aber ich hab noch nichts in Python gefunden, dass einen schönen Syntax Baum und sauberen Quellcode liefert :-)
TUFKAB – the user formerly known as blackbird
Jona
User
Beiträge: 94
Registriert: Sonntag 23. September 2007, 23:25

Beitragvon Jona » Dienstag 23. Oktober 2007, 09:15

was ist mit javaCC?
Granino
User
Beiträge: 19
Registriert: Freitag 10. August 2007, 15:40

Beitragvon Granino » Dienstag 23. Oktober 2007, 16:18

mitsuhiko hat geschrieben:Ich hab mir die bis jetzt noch nicht wirklich angetan, weil die meisten *grausigen* Code generieren. Warum nicht Parser selber schreiben? :-)


Darüberhinaus zeigen Parser- oder Codegeneratoren ein grausiges Fehlerverhalten. Ein gutes Beispiel ist Python selbst. Wohl in der Hälfte aller Fälle führen einen die Fehlermeldungen in die Irre.

Beim rekursicen Abstieg (recursive descent) hat man das Fehlerverhalten dagegen voll im Griff.

Gruß Granino
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 23. Oktober 2007, 19:33

Jona hat geschrieben:was ist mit javaCC?

Generiert soweit ich sehe nur Java-Code. Da kann ich auch Bison-in-a-box nehmen, das aus dem Bison-C Python übersetzt ;)

Alternativ auch ANTLR oder SableCC, die beide Python-Output (experimentell) unterstützen. Aber ich sehe eigentlich keinen Grund, eine Java-Software unnötigerweise ins Boot zu holen, da ich mit keinem dieser Tools Erfahrung habe habe ich somit auch keinen Vorteil dass ich es schon kenne.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Dienstag 23. Oktober 2007, 19:49

Granino hat geschrieben:Darüberhinaus zeigen Parser- oder Codegeneratoren ein grausiges Fehlerverhalten. Ein gutes Beispiel ist Python selbst. Wohl in der Hälfte aller Fälle führen einen die Fehlermeldungen in die Irre.


Was meinst du denn damit?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 23. Oktober 2007, 23:11

Ok, soweit ich sehe kommen zwei in die engere Auswahl: PLY (weil es scheinbar extra für diesen Zweck geschrieben wurde) und pyparsing (weil es eine bessere Syntax als ZestyParser & Co hat + zudem Dokumentation).

Aperiot ist wegen der Codegeneration weggefallen, yeanpypa wegen der geringen Verbreitung, ZestyParser wegen der auf den ersten Blick echt unübersichtlichen API, SPARK weil mir die API da auch nicht gefällt und es unmaintained ausschaut, Plex wegen der geringen Verbreitung, TPG weden der API, Parsing wegen der geringen Verbreitung.

Schade, dass modelnine nichts mehr in die Richtung macht, sein Pyrr hätte eine brauchbare Alternative sein können. :(
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Mittwoch 24. Oktober 2007, 11:56

birkenfeld hat geschrieben:
Granino hat geschrieben:Darüberhinaus zeigen Parser- oder Codegeneratoren ein grausiges Fehlerverhalten. Ein gutes Beispiel ist Python selbst. Wohl in der Hälfte aller Fälle führen einen die Fehlermeldungen in die Irre.


Was meinst du denn damit?


Code: Alles auswählen

[(foo])

Da kommt zb nur ein allgeimeiner "Syntax Error". Allerdings können auch generierte Parser schöne Debug Meldungen haben ;-)
TUFKAB – the user formerly known as blackbird
BlackJack

Beitragvon BlackJack » Mittwoch 24. Oktober 2007, 13:40

Das ist aber keine Meldung, die in die Irre führt. Es wird ganz deutlich auf die erste schliessende, eckige Klammer verwiesen und genau da liegt auch das Problem.
Granino
User
Beiträge: 19
Registriert: Freitag 10. August 2007, 15:40

Beitragvon Granino » Mittwoch 24. Oktober 2007, 18:49

@ Birkenfeld,
ein kleines Beispiel:

x = {2*3 + 4**5)

mit der Fehlermeldung: 'invalid Syntax' vor dem x.

Bei einem längeren Programmtext ist insbesondere für den Anfänger nicht klar, ob er den Fehler vor dieser Zeile oder ab dieser Zeile suchen muss.

Beim Parsen nach dem 'recursive descent' kann eine präzisere Meldung ausgegeben werden. Daneben wird die exakte Position (Spalte) markiert.
Weiterer Vorteil: Enthält ein längeres Programm gleich N Fehler, wird die Syntaxanalyse an der nächst möglichen Textpassage wieder aufgenommen. Mit etwas Glück werden in einem Durchgang alle N Fehler gemeldet.

Gruß Granino
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Mittwoch 24. Oktober 2007, 18:57

Hi

Also bei mir zeigt er den Fehler bei der runden Klammer:

Code: Alles auswählen

>>>x = {2*3 + 4**5)
  File "<console>", line 1
    x = {2*3 + 4**5)
                   ^
SyntaxError: invalid syntax


Genau da wo er ist

*edit* ein angezeigter Fehler ist mir eigentlich lieber als 10 Folgefehler

Gruss

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder