그래서 나는 아마도 이것이 일반적으로 가장 좋은 아이디어라고 생각하기 때문에 "답변"으로 ea 제안을 표시 할 것입니다. 비록 내가 그 라이브러리 제안은 테스트 실패에 의해 주도되었다 tdd 접근 방식에서 아주 잘 작동 할 것이라고 생각하지만, 나는 그것을 시도 끝낼 수 있습니다. 하지만 당분간은 대화 형 방식으로 작동하는 더 빠르고 더 진한 접근 방식이 필요합니다. (문제의 라이브러리는 다른 대화 형 프로그램을 위해 동적으로로드 된 플러그인이며 API 호출 순서를 리버스 엔지니어링하려고합니다 ...)
그래서 내가 끝낸 것은 pycparse를 호출하는 python 스크립트를 작성하는 것이 었습니다. 나는 다른 사람들을 돕기 위해 여기에 포함 시키겠다. 그러나 그것은 일반적이지 않다. (예를 들어, 모든 함수가 int를 반환한다고 가정하고 typedef 내부에서 func def를 피하기 위해 해킹을한다.)
from pycparser import parse_file
from pycparser.c_ast import NodeVisitor
class AncestorVisitor(NodeVisitor):
def __init__(self):
self.current = None
self.ancestors = []
def visit(self, node):
if self.current:
self.ancestors.append(self.current)
self.current = node
try:
return super(AncestorVisitor, self).visit(node)
finally:
if self.ancestors:
self.ancestors.pop(-1)
class FunctionVisitor(AncestorVisitor):
def visit_FuncDecl(self, node):
if len(self.ancestors) < 3: # avoid typedefs
print node.type.type.names[0], node.type.declname, '(',
first = True
for param in node.args.params:
if first: first = False
else: print ',',
print param.type.type.names[0], param.type.declname,
print ')'
print '{fprintf(stderr, "%s\\n"); return 0;}' % node.type.declname
print '#include "myheader.h"'
print '#include <stdio.h>'
ast = parse_file('myheader.h', use_cpp=True)
FunctionVisitor().visit(ast)
지금까지 질문을 한 것이 아니지만 지금 할 수있는 기존 도구를 묻는 것 같습니다. 불행히도 나는 어떤 도구를 모르지만, 파이썬 (또는 다른 고수준 언어) 구현을 수행하기에 충분할만큼 기본 소리가 들립니까? – Jite
질문을 명확히했습니다. 예, 제가 이것을 할 수있는 프로그램을 작성할 수 있습니다. 하지만 그것은 사소한 것이 아닙니다. 예를 들어 괜찮은 파서가 필요합니다. 헤더가 충분히 크고 충분히 복잡하기 때문에, ad-hoc regexp 기반 kludge는 시간 낭비가 될 것입니다. –
안녕하세요, 프로세스를 쉽게 반복 할 수 있어야합니까? 예를 들어, 새 버전의 API가 출시되면 스텁 구현을 업데이트 할 수 있기를 원하십니까? – OlduwanSteve