【问题标题】:#include<header> with pycparser#include<header> 与 pycparser
【发布时间】:2023-03-04 23:48:01
【问题描述】:

使用 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


    【解决方案1】:

    假标题的存在是有原因的。虽然 可能 让 pycparser 解析 Linux 上的系统标头,但它需要工作并且在 99.9% 的情况下是不必要的。

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

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

    【讨论】:

    • 您好,我尝试仅使用gcc -E 并直接在c 代码中包含虚假标头,它可以正常工作!现在我不明白为什么-Ioption 失败了......另外,你能告诉我如何让 pycparser 解析“真正的”系统标头吗?谢谢!
    猜你喜欢
    • 2012-07-08
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2018-07-08
    • 2010-11-15
    相关资源
    最近更新 更多