2016-10-17 3 views
0

나는 C 코드의 조각을 구문 분석하려고 해요 :GnuCParser로 포인터 인수 찾기?

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

GnuCParser, pycparserext의 일부를 사용하여. this answer을 바탕으로

PtrDecl의를 볼 것으로 예상하지만, 여기에 내가 결과 파스 트리에 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()에 의해 인쇄 된 데이터에 const (또는 "pointeryness")의 흔적이 있습니다. 이 차이는 GnuCParser 때문에 발생합니까?

AST에서 baz의 유형을 어떻게 알 수 있습니까? 내 실제 C 코드는 GNU 파서가 필요하다. pycparserext 버전 2016.1을 사용하고 있습니다.

업데이트 : pycparserext issue on GitHub을 만들었습니다.

답변

0

는 여기 pycparserext에 무슨 문제가 확실하지 않다,하지만 난 바닐라 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'] 

합니다.

+0

맞아, 그게 내가 기대했던 것과 같다. 그렇다면 GnuCParser로 뭔가있는 것 같습니다. 이상한. – unwind

0

이것은 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 코드에는 미래에 이것을 잡기위한 테스트가 추가되었습니다.

매우 인상적입니다. :)