앞서 살펴본것은

트리가 이상적으로 만들어졌을 경우를 가정한 것인데


실제로 C에서 수식입력을 문자열으로 밖에 받을수 없을것이다.

이러한 문자열들을

(수식1 함수 수식2) 

이러한 구조에 맞추어서

수식1, 함수, 수시2  라는 3가지의 요소로 뽑아내는 과정이 있어야 되고

이런 뽑아낸 요소들을 가지고 트리를 만드는 과정이 있어야 한다.


다음은 lexer 함수 문자열에서  세가지 요소로 분리해 낸다. (가장 최상위 함수를 기준으로)

((5 + 2) / (5 * 7)) 이라는 수식이 있으면

(5 + 2) 랑 '/' 랑 (5 * 7) 이 세가지를 분리해 내는것이다.




공백이나 탭에다가 "@" 문자를 집어넣어서 이것을 기준으로 토큰을 구분하는데

중첩된 괄호안에 공백도 있을수 있다. 이것들을 무시하기 위해서

어쨋거나 괄호가 짝이 맞다면 (가장 바깥쪽 괄호를 먼저 제거했을때) 

( 가 들어올때 1씩 증가
) 가 들어올때 1씩 감소

하게되면 짝이 맞았을때 0이 되고

이때야 비로소 공백일때 "@" 문자를 넣을수 있는것이다.



make_tree 함수는 lexer로 분리된 요소들을

트리형태로 만드는 역할을 하게 된다.

이 함수는 매우 쉽다.

네가지 규칙뿐이 없다.


1. 세가지 요소가 다 차는 경우는 가운데 infix가 함수인 경우이다.

2. 가운데만 있다면 그것은 숫자이다.

3. 그리고 if문이 있다면 "if" 문자열 바로 다음부터 조건식에 해당하는 부분을

다시 make_tree 한다.

4. 이 이외에는 전부 에러이다.


Posted by 멍충한아싸

댓글을 달아 주세요