使用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
有人能帮我理解为什么会发生这种情况,以及我如何解决它吗?
提前感谢!
出现假标题是有原因的。虽然让pycparser在Linux上解析系统头文件是可能的,但99.9%的时间都是不必要的。
你确定假标题真的被正确地包含在你正在解析的代码中吗?
一种调试方法是首先用gcc -E
和相关(假(头对代码进行预处理,然后在预处理的文件上运行pycparser。这样可以将问题一分为二,并查看问题的确切位置。