2012-07-20 3 views
1

C 소스 파일이 있고 함수 내에서 특정 로컬 변수를 찾아 전역으로 만들려는 경우 - 다른 도구가 C 파일 (작성하지 않은 도구)을 처리 할 수 ​​있도록하려는 경우, 이 작업을 수행하는 가장 쉬운 방법은 무엇입니까? 내가 정규식을 사용하여 생각하고 있었지만, 심지어 그것의 자신의 문제를 소유하고있다. Java에서 미니 C 파서를 작성하는 것과 같습니다. 많은 작업 : SC 소스 파일 구문 분석

더 쉽게 만들 수있는 라이브러리가 있습니까?

예를 들어 변수 "i"를 전역 변수로 만들고 싶다고합시다. 사용자는 함수 이름과 변수 이름을 지정합니다 (변수의 유형은 아니며 "int").

정규식을 사용하여 함수를 찾을 수 있습니다. 하지만 거기에서 나는 최고의 접근 방식이 무엇인지 모릅니다. ... CDT 플러그인이 도움이 될까요?

예 :

가 변환

/* 
    * add.c 
    * a simple C program 
    * 
    */ 

#include <stdio.h> 
#define LAST 10 

int main() 
{ 
    int i = 0; 
    int sum = 0; 

    for (i = 1; i <= LAST; i++) { 
     sum += i; 
    } /*-for-*/ 
    printf("sum = %d\n", sum); 

    return 0; 
} 
: 당신이 그런 변환을 할 수있는 방법을 마련 할 수있는 경우에도

/* 
    * add.c 
    * a simple C program 
    * 
    */ 

#include <stdio.h> 
#define LAST 10 

int i = 0; 

int main() 
{ 

    int sum = 0; 

    for (i = 1; i <= LAST; i++) { 
     sum += i; 
    } /*-for-*/ 
    printf("sum = %d\n", sum); 

    return 0; 
} 
+0

'나는'글로벌이되어'합계 '가 아닌 이유에 대한 규칙이 있습니까? –

+0

사용자가 변수 "i"(합계가 아닌)를 모니터링하려고하고 C 소스 파일을 전달할 도구는 전역 변수 만 모니터링합니다. 따라서 나는 글로벌하게 만들어야하며 합계는 글로벌하게 만들어서는 안된다. – BigBug

+0

사용자는 명령 줄 인수를 통해 "i"를 모니터링하도록 지정하므로 어떤 변수가 변경 될지 알 것이다. – BigBug

답변

1

가장 먼저 요구되는 것은 프로그램의 의미에 부정적인 영향을 미치지 않으면 서 언제 이것이 필요한지와 이유, 그리고 언제 그렇게 안전한지를 식별하는 방법입니다. 이것은 정말로 나쁜 생각입니다. 분명히 당신에게 과제를 준 사람들은 구현의 복잡성, 막대한 의미심장 한 의미의 효과에 대해 전혀 몰라요. 나는 그러므로 그들이 결국에는 당신을 내버려 둘 수있는 적절한 명세를 내놓을 수 없을 것이라고 짐작하고있다.

또한이 논의에 특히 주목할 것입니다. 특히 Ira Baxter의 의견입니다. 필자는 생계를위한 컴파일러를 만들었다. 포럼에서 배우거나 묻는 일은 아닙니다.

+0

그래, 전적으로 동의합니다. 응답 주셔서 감사합니다 .. – BigBug

1

, 나는 그것이 아니다 생각 좋은 생각. 당신이 건설과 파괴를 돌아 다니기 때문에 프로그램은 똑같이 유지되지 않습니다. 또한 모든 유형이 기본 구성 가능하거나 복사 가능하지는 않으므로 일반적으로 변환이 불가능합니다.

몇 가지 간단한 유형에만 관심이 있으십니까? 그런 다음이를 솔루션의 일부로 만듭니다. 원래 코드가 생성 되었습니까? 그렇지 않으면 이름으로 로컬 객체를 식별하는 방법을 어떻게 신뢰할 수 있습니까? 동일한 이름이 다른 유형의 객체에도 사용될 수 있습니다.

+0

나는 그것이 좋은 생각이 아니라는 것에 전적으로 동의합니다. 그러나 나는 선택의 여지가 없습니다 ... 그래서 ... 내가 할 수있는 최선의 방법이 될 수도 있습니다. – BigBug

+0

" in this "과 같이 자격을 부여하여 이름을 식별 할 수 있습니다. 이 여러 번 발생하면이를 구별 할 방법이 필요합니다. 비슷한 일을하고 때로는 고유하게하기 위해 줄 번호 한정자를 추가합니다. –

+0

응답을 주셔서 감사합니다. – BigBug

1

간단한 예제 만 수행하면 Perl 또는 일부 Java 정규식으로 해킹 할 수 있습니다. 실제 파서가 필요하기 때문에 복잡한 프로그램에서는 안정적으로 작동하지 않습니다.

우리의 DMS Software Reengineering Toolkit 및 그 C Front End을 사용하여 매우 안정적으로 사용할 수 있습니다.

DMS는 프로그래밍 언어 설명에 따라 매개 변수화 된 범용 프로그램 분석 및 변환 기능을 제공합니다. DMS의 C Front는 정확한 구문이 C (GCC와 MS를 포함한 C의 다양한 방언)에서 무엇인지 DMS에 설명합니다. 사실상 추상 구문 트리를 생성하는 완전한 구문 분석기를 제공합니다 (역으로 : AST의 C 코드 생성기). 이렇게하면 DMS가 전처리를 포함하여 C 소스 파일을 정확하게 읽을 수 있습니다.

구문 분석 된 코드를 AST 형식으로 사용하면 함수 정의 및 특히 대상 변수를 찾기 위해 DMS 함수 및/또는 패턴을 작성할 수 있습니다. 그런 다음 DMS 코드 또는 변경 가능한 소스 - 소스 변환을 사용하여 함수에서 변수를 들어 올리거나 코드를 삽입하여 해당 변수의 상태 변화를 추적하여 볼 수 있습니다.

따라서 DMS와 일부 사용자 정의 코드를 사용하여 원하는 효과를 얻을 수 있습니다. 여러분이 제공 한 예제는 아마도 DMS로는 매우 간단하지만, 학습 곡선은 많이 될 것입니다. DMS는 복잡하다. 다루는 언어는 복잡하기 때문에 사용법을 배워야한다. 그래서, 이것은 초보자를위한 오후의 운동이 아닙니다.

참고 : 사전 처리 된 프로그램에는이 작업을 수행해야합니다. 그렇지 않으면 일반적으로 신뢰할 수있는 구문을 분석 할 수 없습니다. 따라서 이것은 컴파일하기 직전에해야 할 일이며, 최종 코드의 일부가되어서는 안됩니다.

코드를 영구적으로 변경하려면 처리 전 처리 코드을 구문 분석해야합니다. 그것은 훨씬 더 열심히 heckuva입니다. DMS의 C 프런트 엔드는 전 처리기 지시문이 "구조화 된"정도까지이를 수행 할 수 있습니다. 그들 중 약 95 %가 그렇습니다. 이제는 새로운 문제가 생깁니다. 구조화되지 않은 파일을 수정하거나 (일회성 수동 변경) "불운"으로 파싱 할 수없는 파일을 거부하십시오.

DMS 대신 GCC를 사용할 수 있습니다. 결국 그것은 매우 잘 테스트 된 C 파서를 가지고있다. 하지만 수정 된 C 코드를 생성하는 데는 도움이되지 않습니다. 또 다른 대안은 꽤 좋은 대안으로 빠르게 올라오고있는 Clang입니다. 나는 그것이 C++을 파싱 할 것이라고 생각한다. C 또는 특히 최종 사용자가 사용하고있는 C의 방언 (당신이 말하지 않은)에 대해서는 확실하지 않습니다. 그것은 DMS와 같은 AST와 일할 수도있는 코드에 "패치"를 생성하는 체계의 일종을 가지고 있습니다.