【问题标题】:pycparser error by using preprocessor output使用预处理器输出的pycparser错误
【发布时间】:2013-09-17 13:23:55
【问题描述】:

我使用 pycparser 来解析 c 代码,并且对于我的测试文件,它可以正常工作。我对 cpp 和头文件有一些问题,所以我使用外部 cpp 并将预处理器的输出提供给 pycparser。使用我的测试文件,一切正常,但使用来自真实软件项目的文件,我得到一个错误。

ast = parse_file("layer2.c.o", use_cpp=False)

错误信息:

  File "/usr/local/lib/python2.7/dist-packages/pycparser/c_parser.py", line 1613, in p_error
column=self.clex.find_tok_column(p)))
  File "/usr/local/lib/python2.7/dist-packages/pycparser/plyparser.py", line 54, in _parse_error
    raise ParseError("%s: %s" % (coord, msg)) raise ParseError("%s: %s" % (coord, msg))

pycparser.plyparser.ParseError: /usr/include/stdint.h:58:1: before: __extension__

有人知道这个问题吗?

【问题讨论】:

    标签: python header-files pycparser


    【解决方案1】:

    请参阅FAQ 关于__extension__。一般来说,我看到您正在尝试解析包含的标准标题。如果您改用 pycparser 附带的“假”C 头文件,您的生活会轻松很多。 Details here.

    【讨论】:

    • 它适用于 _fake_defines.h 和 _fake_typedefs.h 的假标头。项目中的所有其他头文件也是问题的必要原因。我的第一个工作是为项目中的每个头文件创建一个伪造的头文件,但是当时一些 typedef 不可用。我可以将它们复制到 _fake_typdefs.h 但是当我更改为另一个项目时,我总是必须更改文件。该项目还使用套接字库,并且其中的一些定义在假标头中不可用。我只想找出调用特定函数的文件和行。
    • @harald:没有办法告诉 pycparser 哪些标识符是类型。您可以为自己的项目扩展假标题,或为每个项目设置一个。
    • 由于我对数据类型或其他任何信息不感兴趣。是否可以修改解析器以使其忽略此类错误?当我删除用于测试的 typedef 时,我收到以下消息: File "/usr/local/lib/python3.2/dist-packages/pycparser/plyparser.py", line 54, in _parse_error raise ParseError("%s: % s" %(坐标,味精))
    • @harald:这篇文章应该可以帮助你理解解析器在这里面临的问题:eli.thegreenplace.net/2011/05/02/…
    • 谢谢。你知道任何其他能够避免这个问题的解析器或者是我自己编写解析器的唯一可能性吗?
    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多