1

我正在尝试解析这段 C 代码:

void foo(const int *bar, int * const baz);

使用GnuCParser, 部分pycparserext

基于这个答案,我希望看到一些PtrDecls,但这是我从ast.show()生成的解析树中得到的:

FileAST:
  Decl: foo, [], [], []
    FuncDecl:
      ParamList:
        Decl: bar, ['const'], [], []
          TypeDeclExt: bar, ['const']
            IdentifierType: ['int']
        Decl: baz, [], [], []
          TypeDeclExt: baz, []
            IdentifierType: ['int']
      TypeDecl: foo, []
        IdentifierType: ['void']

请注意baz,“指向的常量指针int”如何const在由ast.show(). 这种差异是因为GnuCParser?

如何baz从 AST 中找出类型?我的实际 C 代码需要 GNU 解析器。我正在使用 pycparserext 版本 2016.1。

更新:我在 GitHub 上创建了一个 pycparserext 问题

4

2 回答 2

1

这是由于 pycparserext 中的一个错误,它现在已由维护者修​​复,并且问题中提到的问题已关闭。该修复程序在 2016.2 版中。

现在的输出是:

>>> from pycparserext.ext_c_parser import GnuCParser
>>> p=GnuCParser()
>>> ast=p.parse("void foo(const int *bar, int * const baz);")
>>> ast.show()
FileAST:
  Decl: foo, [], [], []
    FuncDecl:
      ParamList:
        Decl: bar, ['const'], [], []
          PtrDecl: []
            TypeDecl: bar, ['const']
              IdentifierType: ['int']
        Decl: baz, [], [], []
          PtrDecl: ['const']
            TypeDecl: baz, []
              IdentifierType: ['int']
      TypeDecl: foo, []
        IdentifierType: ['void']

显然这包含更多Ptr节点,这是一个非常好的迹象。pycparserext 代码还添加了一个测试以在将来捕获此问题。

非常令人印象深刻。:)

于 2016-10-19T08:03:05.047 回答
1

我不确定这里的 pycparserext 有什么问题,但是如果我通过 vanilla pycparser运行它,我会得到:

FileAST: 
  Decl: foo, [], [], []
    FuncDecl: 
      ParamList: 
        Decl: bar, ['const'], [], []
          PtrDecl: []
            TypeDecl: bar, ['const']
              IdentifierType: ['int']
        Decl: baz, [], [], []
          PtrDecl: ['const']
            TypeDecl: baz, []
              IdentifierType: ['int']
      TypeDecl: foo, []
        IdentifierType: ['void']

对于这个输入,这看起来完全合理。

于 2016-10-18T03:46:00.580 回答