[Python-de] Parsen einer Grammatik

Sebastian Wiesner lunaryorn at gmail.com
Mi Jan 2 12:37:31 CET 2013


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.

>> Oder versuche, auf cppcheck aufzubauen, und dessen Quelltext um Deine
>> eigenen Prüfungen zu erweitern.
>
> Cppcheck ist nach meiner Meinung nicht das passende Tool, denn ich will ja nur eine
> "Stilüberprüfung" machen. Eine statische Code Analyse ist ja noch deutlich mehr.
> Mir reicht aktuell wirklich zunächst die Styleprüfung

cppcheck bietet Dir aber - hoffentlich, ich kenne dessen Quelltext
nicht - ein Framework, dass das Parsen von C++ übernimmt, und eine
einfache Schnittstelle für regelbasierte Quelltext-Überprüfung bietet.
 Das würde Dir viel Arbeit abnehmen.


Mehr Informationen über die Mailingliste python-de