[Python-de] Parsen einer Grammatik

Philipp Kraus philipp.kraus at flashpixx.de
Mi Jan 2 12:51:19 CET 2013


Am 02.01.2013 um 12:37 schrieb Sebastian Wiesner:

> Am 2. Januar 2013 11:44 schrieb Philipp Kraus <philipp.kraus at flashpixx.de>:
>> 
>> Am 02.01.2013 um 10:56 schrieb Sebastian Wiesner:
>> 
>>> Am 2. Januar 2013 09:50 schrieb Philipp Kraus <philipp.kraus at flashpixx.de>:
>>>> Hallo,
>>>> 
>>>> ich suche eine Möglichkeit eine Grammatik zu definieren und zu parsen. Im
>>>> speziellen geht es darum, dass ich für C++ & C Code Dateien einen Styleguide
>>>> definieren kann und diesen mit Hilfe eines Python Scriptes überprüfe. Was
>>>> bietet Python an Möglichkeiten um eine Grammatik zu definieren bzw. zu
>>>> verarbeiten. Reguläre Ausdrücke sind definitiv ein Ansatz, reichen aber
>>>> nicht aus, um z.B. Blockstrukturen zu prüfen. Für mich relevant sind z.B.
>>>> Funktions-, Namespace-, Methoden-, Variablenbenennung, Einrückung,
>>>> Kommentierung, Präprozessoranweisungen, if-then-else / case Strukturen (z.B.
>>>> kein If (i==0) oder ein case ohne default).
>>> 
>>> Ich rate Dir davon ab, C oder C++ selbst zu parsen.  Beide Sprachen
>>> sind kontextsensitiv, komplex und ungeheuer aufwendig zu parsen.
>> 
>> Genau das ist die Problematik, die ich sehe und darum vermeiden will, einen eigenen
>> Parser / Lexer zu schreiben.
> 
> Die Krux ist die Grammatik, nicht der Lexer oder Parser.  Mir ist
> keine einigermaßen vollständige und korrekte C++-Grammatik bekannt,
> und angesichts der ungeheuren Komplexität von C++ bin ich geneigt
> anzunehmen, dass es eine solche auch nicht gibt.  Nach meiner Kenntnis
> nicht einmal im GCC oder in Clang, denn zumindest ersteres
> implementiert C++ ad hoc und nicht entlang einer formalen Grammatik.
> 
> Ohnehin sprengt C++ - da kontextsensitiv mit diversen Abhängigkeiten
> zwischen Parser, Typprüfung, Variablenumgebung, etc. - die Grenzen der
> meisten Parsergeneratoren.

Ich habe dazu folgenden Artikel gefunden http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/
Wenn ich Python via CLang Bindings mir schon mal Methoden, Typen und Namespaces liefern
lassen kann, dann kann ich diese überprüfen, ob z.B. Namesregeln eingehalten sind.
Bei den Präprozessordefinitionen müsste ich noch mal schauen, aber jedenfalls die grobe Benennung
würde via reguläre Ausdrücke gehen. Dokumentation kann man mit Doxygen prüfen.
Ich würde dann jeden Quellcode einfach via CLang verarbeiten und dann z.B. per Funktionen entsprechende
Funktionsprüfungen implementieren.

Das ganze als Builder in Scons (www.scons.org) eingebaut, sollte dann auch entsprechend eine Möglichkeit
bieten das ganze in Projekten einfach zu verwenden

Danke

Phil


Mehr Informationen über die Mailingliste python-de