2016-06-27 2 views
0

현재 I/O 용으로 주어진 함수에서 변수 종속성을 찾기 위해 프로젝트를 진행하고 있으며 Pycparser로 작업하도록 선택했습니다. 내 코드는 현재 방문자 클래스가 하나 뿐이며 노드 클래스가 몇 개 있습니다. AST를 통과하고 각 변수 할당, 선언, 입력, 출력 및 If 문에 대한 노드를 만듭니다.Pycparser를 사용하여 변수 종속성 파싱

a = b + c/2; 

는 이름의 노드를 만들 것 'A'와 'B'와 'C'의 가장 최근의 노드에 연결 :이 노드는 자신의 종속성을 예를 들어, 저장되어있는 목록 - 속성이 있습니다.

내 질문은 여기에서입니다. 출력 변수를 연결하는 방법에 대한 일반적인 아이디어가 있습니까?

return b; 

이 코드는 최신 인스턴스 인 'b'와 별개로 종속성에 대한 정보를 제공하지 않습니다. 그러나 내가 얻을 수있는 모든 솔루션은 'b'의 이전 노드도 추가합니다. 예 :

b = 3; 
b = b + 4; 

나는 출력 의존성을 위해 이들 'b'노드를 모두 원하지 않습니다. 하지만 여러 경로가 If 문에서 가져온 경우 각 경로에서 가장 최근의 경로 만있는 경우 여러 노드가 필요할 것입니다. 모호한 질문이 있으면 추천 할 수있는 변수 종속성을 찾는 방법이나 출처가 있습니까? 간단히 말해서,이 프로젝트가 달성해야하는 것은 출력 x에 대한 것입니다 (다중 출력이있을 수 있습니다). 어떤 입력이 의존하고 있는지 알아 내고 싶습니다. 이것은 다른 변수에 따라 여러 시나리오가 될 수 있습니다. 다른 의존성의 예 :

int function(int a, int b, int c, int d, bool z){ 
    int x; 
    if(z){ 
     x = a + b; 
    } 
    else{ 
     x = c + d; 
    } 

    return x; 

답변

0

나는 내가 사용하려고 시도했던 방법으로는 달성하려는 것이 불가능하다는 것을 알았습니다. AST와 Pycparser가 제공 할 수있는 것은 변수의 값을 결정하는 데 사용되는 모든 변수입니다.

내 문제를 해결하려면 CFG (컨트롤 흐름 그래프)와 데이터 흐름을 만들어야합니다. 그러나 이것은 또 다른 방법과 결과입니다.