2015-01-20 5 views
0

을 사용했습니다. 구문 분석하려는 C 코드의 pycparser에 포함 된 헤더에 문제가 발생했습니다. 일부 신비한 이유 때문에 일부 가짜 헤더가 제대로 작동하고 다른 헤더도 제대로 작동하지 않습니다. 예를 들어, stdint.h를 포함하면 pycparser는 문제없이 코드를 파싱 할 수 있습니다. 그러나 stdio.h로 시도하면 오류가 발생합니다. 따라서 예제 코드에서 pycparser (using_gcc_E_libc.py)와 함께 제공된 예제 코드가 작동하지 않습니다!#include pycparser를 사용하여

이 인용 된 예제 코드에 사용되는 것입니다 :

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 
그거야?

미리 감사드립니다.

답변

2

이유 때문에 가짜 헤더가 있습니다. 가능하면 pycparser가 Linux의 시스템 헤더를 구문 분석하는 데는 작업이 필요하며 99.9 %의 시간이 필요하지 않습니다.

파싱중인 코드에 실제로 가짜 헤더가 제대로 포함되어 있습니까?

이 오류를 디버그하는 한 가지 방법은 코드를 gcc -E 및 관련된 (위조 된) 헤더로 먼저 전처리 한 다음 전처리 된 파일에서 pycparser를 실행하는 것입니다. 이를 통해 문제를 2 개로 나누고 문제가있는 곳을 정확히 볼 수 있습니다.

+0

안녕하세요, 나는'gcc -E' 만 사용하고 가짜 헤더를 C 코드에 직접 포함 시키려고했습니다! 이제'-I 옵션이 실패한 이유를 이해할 수 없습니다 ... 또한, pycparser가 "실제"시스템 헤더를 구문 분석 할 수있는 방법을 알려주시겠습니까? 감사 ! – patatarte