if 조건 수식도 평가할 준비가 되었다면

재귀호출에 대한 탈출조건 문제도 해결되는것이므로

함수기능 구현에 착수


가. 함수를 정의하기

함수를 정의할때 만나는 키워드를 내멋대로 "def" 라고 하였다.

함수를 정의하려면 필요한것이

간단하게 생각해보면

이름, 파라미터, 함수몸통

이렇게 세가지가 있을것이다.

이 계산기에서는 무조건 괄호안에 세가지요소

(pre, infix, post) 를 가지므로 

나름 생각해본 함수정의 문법은  

((param1 함수이름 param2) def (함수몸통))

무조건 infix로 하자는 생각이 이런 X같은 문법을 만들어 버렸다.

가변인자로 할수 있으면 좋을텐데 2진트리 구조를 넘어서서

파라미터를 받기엔 아주 복잡해 지므로 우선 파라미터는 2개로 고정




이러한 트리구조가 형성이 될것이다.

그러면 이 트리를 입력으로 받는 EVAL함수에서는 뭘 해야 할지 생각해봤다.


1. 함수테이블이 있다고 가정할때 거기다가 name 을 루트로 하는 트리를 넣는다.(엄밀히 말하면 포인터이므로 가리킨다)

2. 요 name 루트는 몸통을 가져야 하는데 그 몸통은 def 루트의 오른쪽에 있는 트리이다.

3. name루트에서 함수몸통의 최상의 루트를 참조할수 있게한다.


1번에 의해 함수테이블 (포인터배열 또는 리스트?)

를 만들고 name루트를 참조하게 한다.

그리고 3번의 필요성에 의해서 Tree구조체는 하나의 필드가 더 추가됨

struct Tree
    char name[10] // 루트가 가지는 문자열
    Tree *left
    Tree *right
    Tree *ifs
    Tree *func  //새로 추가된 함수 필드 , 함수몸통 트리

(솔직히 함수이름이 나오면 ifs필드는 무조건 비어있으므로
굳이 func필드가 필요하지는 않을것)

그러면 함수몸통을 name루트의 func 필드에 참조하게 하면 

name루트는 함수 몸통을 가지게 된다.



엄밀히 말하면 몸통을 가져오는게 아니라 몸통을 참조한다.


그러면 함수정의과정이 끝난다.

주의할점은 def 루트에서 양 가지 연결을 반드시 끊어줘야 하는데

def루트가 계속 참조하고 있으면 이중으로 참조하게 되어 (name루트도 참조)

만일 def 트리과 함수선언 과정을 끝내고 다시 메모리 헤제시에

name루트의 func필드에 있는 함수몸통도 같이 지워버리므로 문제가 생긴다.

최종적으로 함수선언이 끝나게 되면



이러한 개념으로 될것이다..

실제 구현한 코드는

root->left->func = root->right;
table[table_index] = copy_tree(root->left); 
root->left->func = NULL;
                
printf("success declare '%s' func\n",
                        table[table_index]->name);
table_index++;

함수테이블을 배열로 만들었다.
Posted by 멍충한아싸

댓글을 달아 주세요