#include <header> with pycparser </header>

时间:2015-01-20 14:37:07

标签: pycparser

使用pycparser我遇到了我要解析的C代码中包含的头文件的问题。出于一些神秘的原因,一些“假标题”工作正常,其他一些也不起作用。例如,如果我包含stdint.h,pycparser可以毫无问题地解析代码。但是,如果我尝试使用stdio.h,我会收到错误。 因此,使用pycparser(示例文件夹中的using_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

有人可以帮我理解为什么会这样,以及我如何解决它?

提前致谢!

1 个答案:

答案 0 :(得分:2)

虚假标题是有原因的。虽然可能使pycparser解析Linux上的系统头,但它需要工作,99.9%的时间是不必要的。

您确定假标题实际上已正确包含在您正在解析的代码中吗?

调试此方法的一种方法是首先使用gcc -E和相关(伪)标头预处理代码,然后在预处理文件上运行pycparser。这使您可以将问题分成两部分,并准确查看问题所在。