2013-07-17 2 views
2

C 코드에서 루프의 실행 시간을 계산해야합니다. 이전에 주석을 감지하여 루프 전후에 "gettimeofday"를 추가하는 파이썬 스크립트를 작성해야합니다. 루프 후에.파이썬 스크립트를 사용하여 C 코드에 행 추가하기

int main(int argc, char** argv) { 
    int i,j; 
    int M = argv[0][0] * 10000; 
    int res = argc; 

    // loopId = 1; depth = 1; outermost 
    for (i=0; i<M; i++) { 
    // loopId = 2; depth = 2; innermost 
    for (j=0; j<M; j++) { 
     res *= 7 % 71; 
    }  
    // end loop (loopId = 2) 
    // loopId = 3; depth = 2; innermost 
    for (j=0; j<M; j++){ 
     res += 9 % 91; 
    } 
    // end loop (loopId = 3) 
    } 
    // end loop (loopId = 1) 

    return res; 
} 
+0

파이썬으로해야합니까? 이것은 C에서 매우 쉽게 수행 할 수 있거나 파이썬 비트가 연습용으로 의도 되었기 때문에? 또한 "루프 앞뒤의 주석을 감지"한다는 것은 무엇을 의미합니까? 파이썬에서 C를 임베드하지 않습니까? 파이썬을 사용하여 C 텍스트 파일을 파싱하는 것처럼 들린다. – Nobilis

+0

C에서'clock()'을 사용하지 않는 이유는 무엇입니까? – LotusH

+0

@Nobilis : 저는 C 소스 코드 _ _를 편집하는 스크립트를 작성하려고합니다. 파이썬에서하기가 쉽고 C로하기가 어렵습니다. – abarnert

답변

1
import sys, re 

expS=re.compile(r'\s*//\s*loopId = (\d+); depth = \d+; \w+') 
expE=re.compile(r'\s*//\s*end loop \(loopId = (\d+)\)') 
lines, varcnt = [], 0 
with open(sys.argv[1]) as f: 
    for line in f: 
     line = line.rstrip() 
     lines += [ line ] 
     m = re.match(expS, line) 
     if m: 
      varcnt += 1 
      loopid = int(m.group(1)) 
      lines += [ 'gettimeofday(&tv[{}], 0);'.format((loopid-1)*2) ] 
      continue 
     m = re.match(expE, line) 
     if m: 
      loopid = int(m.group(1)) 
      sid, eid = (loopid-1)*2, (loopid-1)*2+1 
      lines += [ 'gettimeofday(&tv[{}], 0);'.format(eid) ] 
      lines += [ 'printf("Id {}: %ld\\n", tdiff_xxx(&tv[{}],&tv[{}]));'.format(
       loopid, sid, eid) ] 

print '#include <sys/time.h>' 
print 'struct timeval tv[{}];'.format(varcnt*2) 
print 'long tdiff_xxx(struct timeval *t0, struct timeval *t1) {' 
print ' return (t1->tv_sec-t0->tv_sec)*1000000 + t1->tv_usec-t0->tv_usec;' 
print '}' 
for l in lines: print l 
-1

어떤 코드 변환 도구에 대한 기본 개념은 간단하다 : 여기

이 코드 라인으로 소스 라인을 통해

으로 반복 (또는 토큰 토큰, 또는 어떤이의 적절한-하지만 귀하의 샘플을 주어, 선은 괜찮습니다). 새 파일에 행을 복사하고, 추가 된 새로운 행을 추가하고 나중에 필요한 모든 정보를 추적하십시오.

다음은 골격 사용할 수있다 :

rloop = re.compile(r'…') 
rendloop = re.compile(r'…') 

with open('old.c') as oldc, open('new.c', 'w') as newc: 
    loops = {} 
    for line in c: 
     mloop = rloop.match(line.strip()) 
     if mloop: 
      loops[m.groups(1)] = m.groups() 
      newc.write(appropriate start-of-loop code) 
     newc.write(line) 
     mendloop = rendloop.match(line.strip()) 
     if mendloop: 
      matching_start = loops[m.groups(1)] 
      newc.write(appropriate end-of-loop code) 

시작하기에 충분해야. 특정 질문이있는 경우 할 수있는 일을하고 특정 질문을하십시오.

정규 표현식을 사용하는 방법을 모르는 경우 rloop.match 호출을 명시 적 문자열 해석 코드로 바꿀 수 있습니다. 조금 더 장황해질 것입니다.

+0

이것은 다소 나쁜 조언입니다. 실제 파서 (pycparser (https://pypi.python.org/pypi/pycparser)와 같은)를 사용하지 않을까요? – JBernardo

+0

그것은 약간의 운동이며 목적은 c 텍스트 파일을 구문 분석하고 c 파일에 루프를 측정하는 데 필요한 줄을 직접 추가하는 것입니다 (gettimeofday를 사용해야 함). – Sara4391

+0

모든 루프 전과 후의 코멘트가 목적에 맞게 추가되어 gettimeofday로 대체합니다. – Sara4391

관련 문제