Modern CPP
Posts 1-5 of 5
-
Dr. Colin HirschThe company name is only visible to registered members.PEGTL: Parser Bibliothek in C++0x
Hallo C++-Freunde,
um mich mit einigen Neuerungen von C++0x, vor allem den variadischen Templates, besser vertraut zu machen, habe ich fuer den "Parsing Expression Grammar"-Formalismus (PEGs) eine Bibliothek geschrieben, mit der Grammatiken einfach und direkt in den C++-Code eingebettet werden.
Der Source steht unter MIT-License, und ist zusammen mit der Doku und ein paar kleinen Beispielen auf
http://code.google.com/p/pegtl/ zu finden. Zum Ausprobieren wird der GCC ab Version 4.3, sowie ein halbwegs aktuelles Linux oder Mac OS X (anderes Unix oder *BSD sollte auch funktionieren) benoetigt.
Viel Spass und viele Gruesse,
Colin
- 01 Oct 2008, 10:16 pm
-
Jens Weller Premium Member Group moderatorThe company name is only visible to registered members.Re: PEGTL: Parser Bibliothek in C++0x
Finde die Idee nicht schlecht.
Allerdings ist das dann wohl sehr zeitaufwändig beim Kompilieren, so das bei größeren Parsern man wohl eher etwas anderes nehmen würde. Ist es möglich Parser zur Laufzeit zu ändern?
Zur Zeit arbeite ich mit spirit2, was sich auch an PEG orientiert.
Die Dateiendungen hh und cc finde ich etwas gewöhnungbedürftig.
- 02 Oct 2008, 11:21 am
-
Dr. Colin HirschThe company name is only visible to registered members.Re^2: PEGTL: Parser Bibliothek in C++0x
Der Aufwand beim Kompilieren ist ein Feature: Der C++-Compiler kuemmert sich um die ganze Optimierung ... was natuerlich nur funktioniert, weil die Grammatik fest in den C++-Source eingebettet ist. Dieser Ansatz funktioniert also nicht, wenn der Parser zur Laufzeit veraendert werden soll.
Es haengt also von der Anwendung ab, welche Bibliothek sich besser eignet, bzw. ueberhaupt eingesetzt werden kann. Im Vergleich etwa mit dem sehr leistungsfaehigen und flexiblen Boost::Spirit ist die PEGTL viel schlanker und spezialisierter, erzeugt dafuer aber sehr schnelle Parser.
Von der langen Compile-Zeit wuerde ich mich hingegen nicht abschrecken lassen, besser einmal beim Kompilieren etwas Rechenzeit investieren, statt spaeter bei jedem Aufruf des Parsers. (Ausser natuerlich man aendert wirklich staendig die Grammatik...)
- 02 Oct 2008, 6:20 pm
-
Jens Weller Premium Member Group moderatorThe company name is only visible to registered members.Re^3: PEGTL: Parser Bibliothek in C++0x
Dr. Colin Hirsch schrieb:
Der Aufwand beim Kompilieren ist ein Feature: Der C++-Compiler kuemmert sich um die ganze Optimierung ... was natuerlich nur funktioniert, weil die Grammatik fest in den C++-Source eingebettet ist. Dieser Ansatz funktioniert also nicht, wenn der Parser zur Laufzeit veraendert werden soll.
Ja, stimmt. Ein Feature einerseits, aber schon heute sehe ich bei Libs wie lambda oder spirit, das es die Compilezeit enorm in die höhe treibt.
Mit C++0x wird das ja nicht besser.
Was ist der Vorteil gegen über einer Regex, wenn es um leichte Parser geht?
Es haengt also von der Anwendung ab, welche Bibliothek sich besser eignet, bzw. ueberhaupt eingesetzt werden kann. Im Vergleich etwa mit dem sehr leistungsfaehigen und flexiblen Boost::Spirit ist die PEGTL viel schlanker und spezialisierter, erzeugt dafuer aber sehr schnelle Parser. für z.b.?
Ich sehe spirit als flexibels Werkzeug, welches aber schlecht zu debuggen ist.
Da wäre evtl. ein Angriffspunkt, denn C++0x erlaubt ja besseres "Template debuggen" durch Concepts etc.
Gibt es sowas wie bind z.b. für eure actions?
So das ich eine Klasse direkt über einen Parser generieren kann.
Von der langen Compile-Zeit wuerde ich mich hingegen nicht abschrecken lassen, besser einmal beim Kompilieren etwas Rechenzeit investieren, statt spaeter bei jedem Aufruf des Parsers. (Ausser natuerlich man aendert wirklich staendig die Grammatik...)
Naja, kommt auf die Abhängigkeiten an. Aber ab einer halben Stunde nervts. Gerade wenn man gerade die Grammatiken entwickelt und anpasst. Aber da dürfte sich mit C++0x sowieso was ändern, da das ja eher ein generelles Problem ist.
mfg.
Jens Weller
- 02 Oct 2008, 8:10 pm
-
Dr. Colin HirschThe company name is only visible to registered members.Re^4: PEGTL: Parser Bibliothek in C++0x
Ja, in C++ kompilieren braucht Zeit ... wenn das an einer Parser-Bibliothek liegt dann empfinde ich das jedoch als weniger schlimm. Im Gegensatz zu einer "fast ueberall" einsetzbaren Bibliothek wie etwa Boost::Lambda. Ein Lambda kann ueberall vorkommen, aber Parser habe ich meist nur wenige in einem Projekt.
(Diese Ueberlegung war mir schon wichtig, und waehrend die Grammatik selbst noch entwickelt wird muss man ja nicht staendig mit -O3 uebersetzen... Weitergehende Experimente zur Optimierung via Template-Meta-Programmierung musste ich aber abbrechen -- einer Sprache die keinen Speicher freigeben kann geht selbiger sehr schnell aus.)
Bei den ersten Anwendungen der PEGTL geht es uebrigens um sowas wie Config-Files, Script-Sprachen, DSLs, das wuerde man mit einer Regex nicht vernuenftig hinbekommen; im Sinne der moeglichen Komplexitaet der Grammatiken ist die PEGTL nicht "leicht". Binds gibt es dabei (noch) keine; hier ist die PEGTL "leicht(er)" (als Spirit).
Bei dem sich entwickelnden Programmierstil mit der PEGTL wird man vielleicht auch weniger welche benoetigen. Aber natuerlich ist die PEGTL noch recht neu, und es wird sich noch zeigen muessen, welche Erweiterungen sinnvoll sind bzw. natuerlich dazu passen. Bisher werden "actions", also letztlich beliebige, aber explizit vom Benutzer [der Bibliothek] geschriebene Funktionen, in die Grammatik eingebettet, um z.B. aus dem Parser heraus ASTs zu generieren.
- 02 Oct 2008, 11:33 pm
