Pycparser
https://github.com/albertz/pycparser
Ein C -Parser und Dolmetscher in Python. Enthält auch einen automatischen CTypes -Schnittstellengenerator.
Es ist lockerer als die C -Grammatik, dh es sollte ein Supersatz der C -Sprache im Allgemeinen unterstützen.
Ein Teil der Unterstützung kann zu diesem Zeitpunkt etwas unvollständig oder falsch sind, da ich den Sprachspezifikationen nicht wirklich strikt befolgt habe, sondern den Parser durch Iteration auf dem realen Quellcode verbessert habe.
Ähnliche Projekte
Parsers / ctypes -Schnittstellengeneratoren:
- Eli Benderskys Pycparser. Vervollständigen Sie den C99 -Parser in reinem Python. Es hängt von Python Lex-Yacc (Ply) ab. (Ich habe es noch nicht getestet. Scheint das vollständigste und professionellste Projekt zu sein. Wenn Sie keinen C -Dolmetscher wollen, ist dies wahrscheinlich das Projekt, das Sie verwenden sollten.)
- Pyclibrary (Github -Gabel). Ist ziemlich langsam und hat für mich nicht so gut funktioniert.
- Ctypesgen. Verwendet auch Lex+yacc.
- Codegen. Verwendet GCC-XML. Siehe unten über die Nachteile einer solchen Acroach.
Dolmetscher:
- Cinterpreter. Python.
- Cint. Nicht in Python. Wahrscheinlich der berühmteste.
- Ch. Nicht in Python. Ist nicht wirklich kostenlos.
- UPS -Debugger. Nicht in Python.
- Picoc. Nicht in Python. "Ein sehr kleiner C -Dolmetscher."
- Bic. Nicht in Python.
Warum dieses Projekt?
- Flexibler sein. Mit einem handgeschriebenen Parser ist es jetzt viel einfacher, Operationen auf bestimmten Ebenen des Parsingrohrs auszuführen.
- Ich wollte einen in sich geschlossenen Code haben, der auch leicht auf der Endbenutzerseite ausgeführt werden kann. Daher kann der Endbenutzer einfach die LIB und seine Header aktualisieren, und dann verwendet einige Anwendungen mit dieser Python Lib die aktualisierte LIB automatisch. Dies ist nicht möglich, wenn Sie die CTYPES-Schnittstelle statisch generiert haben (über ein GCC-XML-basiertes Tool oder so).
- Ich wollte PYSDL implementieren und wollte die SDL -Header nicht von Hand übersetzen. Außerdem wollte ich nicht vorhandene Tools verwenden, um dies zu einer weiteren Aufrechterhaltung der Arbeit zu einer weiteren Aufrechterhaltung zu vermeiden. Weitere Informationen finden Sie im Projekt.
- Diese Funktionalität könnte für viele andere C -Bibliotheken ähnlich verwendet werden.
- Eine Herausforderung für mich. Nur zum Spaß. :)
Beispiele
- Pysdl. Verwendet auch die automatische CTypes -Wrapper und ordnet es einem Python -Modul zu.
- Pycpython. Interpretieren Sie CPython in Python.
- Pylua. Interpretieren Sie Lua in Python.
Siehe auch die Tests/test_interpreter. {C, Py} 'Hello World' Beispiel.
Versuchen Sie es auch ./demos/interactive_interpreter.py --debug .
Aktueller Zustand
- Viele einfache C -Programme sollten jetzt analysiert und korrekt interpretiert werden.
- Ich bin mir ziemlich sicher, dass Funktionszeiger Typedefs falsch behandelt werden. ZB
typedef void f(); und typedef void (*f)(); sind momentan genauso. Siehe cpre3_parse_typedef und führen Sie einige Tests durch, wenn Sie dies beheben möchten. - Viele Funktionen aus der Standard -C -Bibliothek fehlen noch.
- Es könnte einige Fehler geben. :)
- C ++ wird noch nicht unterstützt. :)
- Der Codestil entspricht nicht an Pep8- und Standard -Python -Konventionen an vielen Stellen, da er ziemlich alt ist. Außerdem sollte es wahrscheinlich umstrukturiert werden, da es in einzelnen Dateien zu stark gewachsen ist. Ich repariere das langsam.
Wie funktioniert der Dolmetscher?
Dies ist wahrscheinlich etwas ungewöhnlich. Wir wickeln die wichtigsten Standard -C -Bibliotheksfunktionen direkt in die native LIBC über ctypes ein. Wir übersetzen den analysierten C -Code in einen äquivalenten Python AST (über ast ), wodurch ctypes stark verwendet werden. Dann führen wir diesen generierten Python -Code einfach aus. Aber wir können es auch abwerfen. So können wir C -Code in ein äquivalentes Python -Programm zusammenstellen.

--- Albert Zeyer, http://www.az2000.de