2

前処理された C コード (「gcc -E」によって生成された結果) で pycparser を使用する必要があります。ただし、現在、理解または解決できない問題に直面しています。

提供されたサンプル year2.c と func_defs.py を使用しています。これを変更して、さまざまなプリプロセッサと偽のライブラリを使用しても無駄です。おそらく、これを調べて、問題を再現/解決できるかどうかを確認できる人もいます。必要なすべてのコードを追加します。

エラーは year2.c (通常のサンプル ファイル) と year2.i ('gcc -E' 出力) を使用して生成されました。前者はプリプロセッサ/fakelib の両方のバリアントで動作しましたが、後者には有用な結果はありませんでした。

関連するすべてのエラー、使用されたスクリプト (最後のバリエーションのみではありますが)、および year2.c ファイルと year2.i ファイルを含む bitbucket リポジトリを作成しました。

エラーとサンプルレポ

御時間ありがとうございます。

4

2 に答える 2

5

あなたが得ているエラーは次のとおりです。

pycparser.plyparser.ParseError: /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h:40:27: before: __gnuc_va_list

エラーの原因として示された行 ( stdarg.h:40):

typedef __builtin_va_list __gnuc_va_list;

gcc では__builtin_va_list、その名前が示すように、コンパイラに組み込まれています。したがって、その型の宣言は必要ありません (または許可されません)。

型名を別の識別子と区別できない場合、文法には多くのあいまいさがあるため、C コンパイラがシンボルテーブルベースの手法を使用して型名を解析することは非常に一般的です。このようなパーサーは、宣言されていない識別子は型名ではないと想定し、型名で__builtin_va_listない場合はtypedef構文エラーです。

したがって、使用している pyparser 文法は gcc の組み込み型について認識していないと思います (そして、なぜそうすべきなのでしょうか?)。

あなたの fakelib には同じヘッダー ファイルが含まれているようです。偽造するのは難しいので、それは驚くべきことではありませんstdarg.h。技術的にはライブラリ ヘッダーですが、これは、独立した (標準ライブラリではない) 実装であっても、コンパイラによって提供される必要があるヘッダーの小さなセットの一部です: <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>、および <stdnoreturn.h>(C11 標準、条項 4、段落 6)。外部ライブラリがコンパイルされたコードの性質を十分に認識して適切に定義する方法がないため、これらはコンパイラによって実装される必要があります。

pyparsed 出力から必要なものに応じて、次のような の定義を含めることにより、pyparser でこれを回避できる場合があります__builtin_va_list

typedef struct __builtin_va_list { } __builtin_va_list;

__builtin_va_list組み込みの gcc データ型は 1 つだけではありませんが、他のデータ型に遭遇することはないかもしれません。したがって、達成しようとしていることを達成するまで、このソリューションを数回繰り返す必要がある場合があります。

于 2015-03-11T16:33:49.517 に答える