GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

eliben

pycparser – 🐍 純粋なPythonで完全なC99パーサ

投稿日:

🐍 純粋なPythonで完全なC99パーサ

pycparser v2.18

著者: エリ・ベンダースキー

1はじめに

1.1 pycparserとは何ですか?

pycparserは純粋なPythonで書かれたC言語のパーサーです。 これは、Cソースコードを解析する必要のあるアプリケーションに簡単に統合できるように設計されたモジュールです。

1.2それは何のために良いですか?

Cコードを解析する必要があるもの。 以下は、実際のユーザレポートから取得したpycparserの使用例です。

  • Cコード難読化ツール
  • さまざまな特殊なCコンパイラのフロントエンド
  • 静的コードチェッカー
  • 自動ユニットテストの検出
  • C言語に特殊な拡張機能を追加する

pycparserの最も一般的な使い方の1つはcffiライブラリです。この関数は、C関数や型の宣言を解析してFFIを自動生成します。

pycparserは純粋なPythonで書かれているという点でユニークです。これは実験やチューニングが容易な非常に高度な言語です。 LexとYaccに精通している人には、 pycparserのコードは分かりやすいでしょう。 また、Pythonインタプリタ以外の外部依存関係もなく、インストールとデプロイが非常に簡単です。

1.3 pycparserはどのバージョンのCをサポートしていますか?

pycparserは完全なC99言語をサポートすることを目指しています(標準ISO / IEC 9899による)。 C11の一部の機能もサポートされており、より多くの機能をサポートするパッチも歓迎されています。

pycparserは非常に少数のGCC拡張をサポートしていますが、GCC-ismsを多く使ってコードを解析するように設定するのはかなり簡単です。 詳細はFAQを参照してください。

1.4 pycparserはどのような文法に従いますか?

pycparserは、C99標準(ISO / IEC 9899)のAnnex Aで提供されているC文法に非常によく似ています。

1.5 pycparserはどのようにライセンスされていますか?

BSDライセンス

1.6連絡先の詳細

pycparserの問題や機能要求の報告については、問題を開いたり、プルリクエストを送信してください。

2インストール

2.1前提条件

  • pycparserは、LinuxとWindowsの両方で、Python 2.7、3.3-3.6でテストされました。 これは、それ以降のバージョン(2.xと3.xの両方のライン)でも動作するはずです。
  • pycparserには外部依存関係はありません。 唯一のnon-stdlibライブラリはPLYです。これはpycparser/plyバンドルされています。 現在のPLYバージョンは3.10で、 http: //www.dabeaz.com/ply/から取得しました

pycparser (およびPLY)は文法仕様にdocstringsを使用しています。 -OO Pythonインストール(Python -OOオプションを使用する場合など)では、 -OOをインスタンス化して使用することができません。 この問題を回避するには、PLY解析テーブルが通常モードで事前生成されていることを確認してください。 しかし、これは公式にサポートされている/テストされた動作モードではありません。

2.2インストールプロセス

pycparserのインストールは非常に簡単です。 パッケージをダウンロードして解凍したら、標準のpython setup.py installを実行するだけです。 セットアップスクリプトはpycparserモジュールをPythonのインストールライブラリのsite-packagesします。

pycparserPython Package Index (PyPI)にリストされているので、好きなPythonのパッケージング/配布ツールを使用してインストールすることができます。

> pip install pycparser

2.3既知の問題

  • 新しいバージョンのpycparserを既存のバージョンにインストールしたユーザーには、新しくインストールしたライブラリを使用して問題が発生しました。 これは、古いバージョンの.pycファイルとして保存されている解析テーブルと関係があります。 アップグレード後にpycparserから説明できないエラーが発生した場合は、Pythonのsite-packages pycparserディレクトリを削除するか、またはインストールした場所を削除して削除してから、再度インストールしてください。

3

3.1 Cプリプロセッサとの相互作用

コンパイル可能にするためには、CプリプロセッサcppによってCコードを前処理する必要があります。 cppは、 #define #include#defineようなプリプロセッサディレクティブを処理し、コメントを削除し、コンパイルのためにCコードを準備するその他の小さなタスクを実行します。

Cコンパイラのように、Cコードpycparserのもっとも平凡な断片だけでは、正しく機能するには前処理されたCコードを受け取らなければなりません。 pycparserパッケージからトップレベルのparse_file関数をインポートすると、PATH内にあるか、パスを指定する限り、 cppと対話します。

また、 cpp代わりにgcc -Eまたはclang -E使用することもできます。 詳細については、 using_gcc_E_libc.py例を参照してください。 Windowsユーザーは、このWebサイトから Windows版Clangのバイナリビルドをダウンロードしてインストールすることができます。

3.2標準のCライブラリヘッダはどうですか?

Cコードはstdio.hような標準のCライブラリからのさまざまなヘッダファイルを#includeます。 (ある程度の努力を払って) pycparserを使ってCコンパイラの標準ヘッダを解析することができますが、 utils/fake_libc_include用意されている “fake”標準を使う方がずっと簡単utils/fake_libc_include これらは標準のCヘッダーファイルで、それを使用するファイルの有効な解析を可能にするために必要なものだけが含まれています。 ボーナスとして、最小限であるため、大きなCファイルの解析パフォーマンスを大幅に向上させることができます。

ここで理解すべきポイントは、 pycparserは実際に型のセマンティクスに気にしないということです ソースで遭遇したトークンが以前に定義されたタイプであるかどうかを知る必要があります。 これは、Cを正しく解析できるようにするために不可欠です。

詳細については、 このブログ記事を参照してください。

3.3基本的な使い方

pycparserの使用例については、ディストリビューションのexamplesディレクトリを見てください これらはあなたを始めるのに十分なはずです。

3.4高度な使い方

pycparserのパブリック・インタフェースは、 pycparser/c_parser.pyコメントとともに十分に文書化されています。 パーサーによって作成されたさまざまなASTノードの詳細については、 pycparser/_c_ast.cfg参照してください。

ここにFAQあります いずれにせよ、あなたはいつも私に助けのための電子メールを落とすことができます。

4変更

pycparserを変更する際に注意すべき点がいくつかあります。

  • pycparserのASTノード用のコードは_ast_gen.pyによって構成ファイル_c_ast.cfgから自動的に生成されます。 ASTの設定を変更する場合は、コードを再生成してください。
  • pycparserの最適化モードを理解していることを確認してくださいCParserクラスのコンストラクタでdocstringを読む必要があります。 開発のためには、文法を変更するときにYaccテーブルとLexテーブルを再生成するように、最適化せずにパーサを作成する必要があります。

5パッケージ内容

pycparserパッケージを解凍すると、次のファイルとディレクトリが表示されます。

README.rst:
このREADMEファイル。
ライセンス:
pycparserライセンス
setup.py:
インストールスクリプト
例/:
pycparserの使用例のあるディレクトリ
pycparser /:
pycparserモジュールのソースコード。
テスト/:
ユニットテスト。
utils / fake_libc_include:
最小限の標準Cライブラリには、任意のCコードを解析できるようにするファイルが含まれています。
utils / internal /:
私自身のための内部ユーティリティ。 あなたはおそらくそれらを必要としません。

6貢献者

発見したバグに関する問題を開いたり、パッチを提出したりすることによって、 pycparserに貢献した人もいます。 貢献者のリストは、ソース配布のCONTRIBUTORSファイルにあります。 pycparserをGithubに移動した後、私はGithubが貢献を追跡する上でより良い仕事をするので、このリストの更新をやめました。

7 CIステータス

pycparserには、便利なTravis CIプロジェクトを使用して自動テストが有効になっています。 最新のビルドステータスは次のとおりです:

AppVeyorはWindows上でのテストの実行にも役立ちます。







-eliben

執筆者: