Pycparser
https://github.com/albertz/pycparser
Pythonで書かれたcパーサーと通訳。また、自動CTypesインターフェイスジェネレーターも含まれています。
それはC文法よりもゆるいです、つまり、一般的にC言語のスーパーセットをサポートするはずです。
この時点では、この時点では少し不完全または間違っている可能性があります。なぜなら、私は言語仕様に厳密に従わなかったが、実際のソースコードの反復によりパーサーを改善したからです。
同様のプロジェクト
パーサー / ctypesインターフェイスジェネレーター:
- Eli BenderskyのPycparser。純粋なPythonでC99パーサーを完成させます。 Python lex-yacc(ply)に依存します。 (私はまだそれをテストしていません。最も完全で最もプロフェッショナルなプロジェクトのようです。Cインタープリターが欲しくない場合、これはおそらく使用すべきプロジェクトです。)
- ピリバリ(Github Fork)。非常に遅いので、私にとってはそれほどうまくいきませんでした。
- ctypesgen。 Lex+Yaccも使用します。
- codegen。 GCC-XMLを使用します。そのようなアプローチの欠点については、以下を参照してください。
通訳者:
- CINTERPRETER。 Python。
- cint。 Pythonではありません。おそらく最も有名なもの。
- ch。 Pythonではありません。本当に無料ではありません。
- UPSデバッガー。 Pythonではありません。
- ピコック。 Pythonではありません。 「非常に小さなC通訳者。」
- bic。 Pythonではありません。
なぜこのプロジェクト?
- より柔軟になります。手書きのパーサーで、解析パイプの特定のレベルで操作を行うのが今でははるかに簡単になりました。
- エンドユーザー側でも簡単に実行できる自己完結型コードが欲しいと思いました。したがって、エンドユーザーはLIBとそのヘッダーを更新するだけで、このPython LIBを使用していくつかのアプリケーションが更新されたLIBを自動的に使用します。これは、CTYPESインターフェイスを静的に生成した場合には不可能です(GCC-XMLベースのツールなどを介して)。
- 私はPysDLを実装したかったので、SDLヘッダーを手で翻訳したくありませんでした。また、既存のツールを使用してこれを行い、後で作業をさらに維持しないようにしたくありませんでした。詳細については、プロジェクトをご覧ください。
- この機能は、他の多くのCライブラリで同様に使用できます。
- 自分にとっての挑戦。ただ楽しみのために。 :)
例
- pysdl。また、自動CTypesラッパーを使用して、Pythonモジュールにマップします。
- Pycpython。 PythonでCpythonを解釈します。
- ピルア。 PythonでLuaを解釈します。
また、 tests/test_interpreterを参照してください。{c、py} 'hello world'の例。
また./demos/interactive_interpreter.py --debugを試してください。
現在の状態
- 多くの簡単なCプログラムは、解析され、正しく解釈する必要があります。
- 関数ポインターtypedefが誤って処理されることは確かです。例:
typedef void f();およびtypedef void (*f)();今同じです。 cpre3_parse_typedefを参照して、これを修正する場合はテストを行います。 - 標準のCライブラリからの多くの機能はまだ欠落しています。
- いくつかのバグがあるかもしれません。 :)
- C ++はまだサポートされていません。 :)
- コードスタイルは、非常に古いため、多くの場所でPEP8および標準のPythonコンベンションに準拠していません。また、単一のファイルではあまりにも大きくなったため、おそらく再構築されるべきです。私はこれをゆっくりと修正しています。
通訳はどのように機能しますか
これはおそらく少し珍しいことです。最も重要な標準Cライブラリ機能を、 ctypesを介してネイティブLIBCに直接包みます。解析されたCコードを同等ctypes Python AST( ast経由)に翻訳します。次に、この生成されたPythonコードを実行します。しかし、私たちはそれを捨てることもできます。したがって、Cコードを同等のPythonプログラムにコンパイルできます。

---アルバートゼイアー、http://www.az2000.de