13 Stimmen

Implementierung eines C-Präprozessors in Python oder JavaScript?

Gibt es eine bekannte Implementierung des C-Präprozessortools, das entweder in Python oder JavaScript implementiert ist? Ich suche nach einer Möglichkeit, C- (und C-ähnlichen) Quellcode robust vorzubereiten und möchte in der Lage sein, zum Beispiel bedingte Kompilierung und Makros ohne Aufruf eines externen CPP-Tools oder einer nativen Codebibliothek zu verarbeiten. Ein weiteres potenzielles Anwendungsszenario ist die Vorverarbeitung innerhalb einer Webanwendung, innerhalb des Webbrowsers.

Bisher habe ich Implementierungen in Java, Perl und natürlich C und erneut C gefunden. Es könnte plausibel sein, eines der C-zu-JavaScript-Compiler zu verwenden, die jetzt verfügbar werden.

Die PLY (Python Lex und Yacc)-Tools enthalten einen in Python implementierten cpp.

7voto

Evan Plaice Punkte 13682

Schau dir pypreprocessor an

Es ist auch auf PYPI (Python Package Index) zu finden, sodass es direkt mit pip heruntergeladen werden kann.

Wenn Sie #define und #ifdef-Anweisungen verwenden möchten, um einfache bedingte Kompilierung durchzuführen, sollte dies Ihren Anforderungen entsprechen. Sie können es entweder als eigenständiges Skript ausführen und eine Eingabedatei (die in jeder Sprache vorliegen kann) angeben oder Sie können es als Python-Modul importieren und es zum Selbstverzehr von Python-Quellcode verwenden.

pypreprocessor unterstützt nicht:

  • Makroersetzungen
  • Logische Operationen (d. h. || &&)
  • Mathematische Operationen (d. h. + - * /)
  • Mehrzeilige Präprozessoranweisungen

Es ist ein Werkzeug, das speziell für die bedingte Kompilierung entwickelt wurde, nicht für Metaprogrammierung.

Hier ist ein Beispiel, wie Sie eine C-Datei mit pypreprocessor als eigenständiges Skript verarbeiten können:

from pypreprocessor import pypreprocessor

pypreprocessor.defines.append('debug')
pypreprocessor.input = 'input_file.c'
pypreprocessor.output = 'output_file.c'
pypreprocessor.removeMeta = True

pypreprocessor.parse()

Die Implementierung ist ziemlich einfach.

defines.append('debug'):

Hat die gleiche Wirkung wie das Hinzufügen einer '#define debug'-Direktive zur Datei. Dies ist nur eine bequeme Möglichkeit, defines festzulegen.

pypreprocessor.input = 'input_file.c':

Legt die Datei fest, die Sie verarbeiten möchten.

pypreprocessor.output = 'output_file.c':

Legt fest, wohin die Datei ausgegeben wird.

pypreprocessor.removeMeta = True:

Entfernt alle im File gefundenen Präprozessoranweisungen. Dies umfasst alle #define, #ifdef, #undefine, #else usw. aus der Quelldatei. Dies ist nützlich, um eine 'saubere' Produktionsversion des Quellcodes zu erstellen, die alle bedingten Codes und Direktiven, die nicht verwendet werden, enthält. Dieser Schritt ist ebenfalls vollkommen optional. Wenn Sie dies nicht hinzufügen, wird automatisch jeglicher Code auskommentiert, der nicht in eine definierte Bedingung fällt.

Zum Beispiel:

#define debug

#ifdef debug
print('dies wird im nachbearbeiteten Code erscheinen')
#else
#print('dies wird im nachbearbeiteten Code auskommentiert werden')
#endif

Wenn Sie beispielsweise Makroersetzung benötigen, um z. B. Quelltext von einer Sprache in eine andere zu ändern, wird dies von pyprocessor noch nicht unterstützt. In der Theorie würde es nicht viel Arbeit erfordern, um dies hinzuzufügen, aber der Lexer müsste zuerst erweitert werden, um Schlüsselwörter zu überspringen, die innerhalb von Textzeichenfolgen erscheinen.

Anmerkung: Es ist auch mit python2x und python3k kompatibel.

Haftungsausschluss: Ich bin der Autor von pypreprocessor.

5voto

vz0 Punkte 31299

Schau dir PLY an, eine Implementierung von Lex und Yacc in Python, die ein cpp-Tool, implementiert in Python, mit dem PLY Lexer enthält. Es gibt auch pycparser, ein Parser, der auf PLY für die C-Sprache aufbaut.

2voto

Neil Punkte 52506

Das Firefox-Bausystem macht etwas Ähnliches für sein Chrome. Eine Quelldatei mit dem Namen jar.mn listet alle benötigten XUL/JS-Dateien auf, und optional werden diese Dateien vor dem Versand vorverarbeitet. So ruft das Skript, das die Dateien verschickt, auch einen Mini-Präprozessor auf.

1voto

dan_waterworth Punkte 6101

Sie können möglicherweise eine Python-Bindung um den Clang C-Präprozessor erstellen.

0voto

ThiefMaster Punkte 297146

Wenn ANTLR mit Python/Javascript verwendet werden kann (letzteres bezweifle ich sehr), können Sie eine Grammatik von der ANTLR-Website erhalten: http://www.antlr.org/grammar/1166665121622/Cpp.tar

Wenn nicht, könnte es trotzdem ein guter Anfang sein - einfach konvertieren Sie es in eine Grammatik, die von Ihrem bevorzugten Parser-Generator verstanden wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X