2

pycparser を使用すると、解析したい C コードに含まれるヘッダーで問題が発生しました。不思議な理由で、一部の「偽のヘッダー」は正常に機能し、他のものは同様に機能しません。たとえば、stdint.h をインクルードすると、pycparser は問題なくコードを解析できます。ただし、stdio.h で試してみると、エラーが発生します。そのため、pycparser で指定されたサンプル コード (サンプル フォルダー内の_gcc_E_libc.py を使用) は機能しません。

これは、引用されたサンプルコードで使用されているものです:

ast = parse_file(filename, use_cpp=True,
        cpp_path='gcc',
        cpp_args=['-E', r'-I../utils/fake_libc_include'])

これは私が得るエラーです:

    Traceback (most recent call last):
  File "/home/patatarte/pycparser/examples/using_gcc_E_libc.py", line 29, in <module>
    cpp_args=['-E', r'-I../utils/fake_libc_include'])
  File "/usr/lib/python3.4/site-packages/pycparser/__init__.py", line 93, in parse_file
    return parser.parse(text, filename)
  File "/usr/lib/python3.4/site-packages/pycparser/c_parser.py", line 138, in parse
    debug=debuglevel)
  File "/usr/lib/python3.4/site-packages/pycparser/ply/yacc.py", line 265, in parse
    return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc)
  File "/usr/lib/python3.4/site-packages/pycparser/ply/yacc.py", line 1047, in parseopt_notrack
    tok = self.errorfunc(errtoken)
  File "/usr/lib/python3.4/site-packages/pycparser/c_parser.py", line 1631, in p_error
    column=self.clex.find_tok_column(p)))
  File "/usr/lib/python3.4/site-packages/pycparser/plyparser.py", line 54, in _parse_error
    raise ParseError("%s: %s" % (coord, msg))
pycparser.plyparser.ParseError: /usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/include/stdarg.h:40:27: before: __gnuc_va_list

なぜこれが起こるのか、どうすれば解決できるのかを誰かが理解するのを手伝ってくれますか?

前もって感謝します !

4

1 に答える 1

3

偽のヘッダーには理由があります。Linux で pycparser にシステム ヘッダーを解析させることは可能ですが、手間がかかり、99.9% の確率で不必要です

解析しているコードに偽のヘッダーが実際に適切に含まれていると確信していますか?

これをデバッグする 1 つの方法は、最初gcc -Eに関連する (偽の) ヘッダーを使用してコードを前処理し、次に前処理されたファイルに対して pycparser を実行することです。これにより、問題を 2 つに分割し、問題がどこにあるかを正確に確認できます。

于 2015-01-21T13:53:11.457 に答える