2009-03-30 2 views
4

얼마나 쉬운 방법으로 파이썬를 사용 의견 엔티티 이름을 C로 작성된 .H 파일을 구문 분석하는?Python을 사용하여 주석 파일의 .h 파일을 구문 분석하는 쉬운 방법은 무엇입니까?

이미 개발 된 단어 파일에 내용을 추가로 작성한다고 가정합니다.

소스 설명은 간단한 태그 스타일 규칙을 사용하여 형식이 지정됩니다. 주석 태그는 하나의 엔티티 주석을 다른 주석 및 문서화되지 않은 주석과 쉽게 구별하는 데 사용됩니다. 주석은 여러 줄 형식 일 수 있습니다. 각 주석은 엔티티 정의에 따라 그대로 유지됩니다.

//ENUM My comment bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla 
//  could be multi-line. Bla bla bla bla bla bla bla bla bla. 
enum my_enum 
{ 
    //EITEM My enum item 1. 
    //  Just could be multi-line too. 
    MY_ENUM_ITEM_1, 

    //EITEM My enum item 2 
    MY_ENUM_ITEM_2, 
}; 

//STRUCT My struct 
struct my_struct { 

    //MEMBER struct member 1 
    int m_1_; 
}; 

//FUNC my function 1 description. 
//  Could be multi-line also. 
//INPUT arg1 - first argument 
//RETURN pointer to an allocated my_struct instance. 
my_struct* func_1(int arg1); 

이 구문 분석의 결과로 코드 및 주석 트리가 나옵니다.

타사 라이브러리를 사용하지 않고 을 신속하게 만들려면 어떻게해야합니까??

답변

3

다음은 빠르고 더러운 해결책입니다. 문자열에 주석을 처리하지는 않지만 헤더 파일에만 적용되므로 문제가되지 않습니다.

S_CODE,S_INLINE,S_MULTLINE = range (3) 
f = open (sys.argv[1]) 
state = S_CODE 
comments = '' 
i = iter (lambda: f.read (1), '') 
while True: 
    try: 
     c = i.next() 
    except StopIteration: 
     break 
    if state == S_CODE: 
     if c == '/': 
      c = i.next() 
      if c == '*': 
       state = S_MULTLINE 
      elif c == '/': 
       state = S_INLINE 
    elif state == S_INLINE: 
     comments += c 
     if c == '\n': 
      state == S_CODE 
    elif state == S_MULTLINE: 
     if c == '*': 
      c = i.next() 
      if c == '/': 
       comments += '\n' 
       state = S_CODE 
      else: 
       comments += '*%s' % c 
     else: 
      comments += c 
print comments 
+0

그냥 궁금 해서요. 지금 이걸 작성 했습니까? –

+0

예 .. 죽일 시간이 좀 있었어요. 방금 5 분이 걸렸어. – eduffy

+0

'c =='\ n ': state == S_CODE'의 버그를 알고 있어야합니다. – klimkin

4

:

이없는 경우, 좀 더 강력한 대안이있다. 몇 번 이상.

다음은 Python으로 작성된 C 언어의 파서입니다. 이것을 시작하십시오.

http://wiki.python.org/moin/SeeGramWrap

다른 파서. 그 점프 - 오프 포인트로

http://nedbatchelder.com/text/python-parsers.html

당신은 아마 어떤 ANSI C Yacc에 문법을 다운로드하고 너무 많은 문제없이 PLY의 형식으로 재 작업 및 사용할 수

http://wiki.python.org/moin/LanguageParsing

.

+0

다른 하나는 http://code.google.com/p/pycparser/입니다. 나는 "신속하고 제 3 자 라이브러리없이"달성 할 수 있다고 생각하지 않는다. C는 문자열 매칭이나 정규식과 같은 순진한 방법으로 파싱을 할 수없는 복잡한 문법을 ​​가지고있다. – bobince

+0

"제 3 자 라이브러리를 사용하지 않고"고려 사항을 이해하지 못합니다. 그것은 모두 오픈 소스입니다. 제 3 자 문제, 우려 사항 또는 문제점은 무엇입니까? –

관련 문제