Re: [Python-de] Parsen einer Grammatik
Am 2. Januar 2013 11:44 schrieb Philipp Kraus <philipp.kraus@flashpixx.de>:
Am 02.01.2013 um 10:56 schrieb Sebastian Wiesner:
Am 2. Januar 2013 09:50 schrieb Philipp Kraus <philipp.kraus@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.
Am 02.01.2013 um 12:37 schrieb Sebastian Wiesner:
Am 2. Januar 2013 11:44 schrieb Philipp Kraus <philipp.kraus@flashpixx.de>:
Am 02.01.2013 um 10:56 schrieb Sebastian Wiesner:
Am 2. Januar 2013 09:50 schrieb Philipp Kraus <philipp.kraus@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
participants (2)
-
Philipp Kraus -
Sebastian Wiesner