코드의 자료구조가 이해되지 않습니다.
글쓴이: rlj1202 / 작성시간: 일, 2019/06/09 - 7:32오후
https://swtch.com/~rsc/regexp/nfa.c.txt
위 주소의 코드를 보고 있었는데 이해가 되지 않는 부분이 두군데 있습니다. 일단 코드를 보면
/* * Since the out pointers in the list are always * uninitialized, we use the pointers themselves * as storage for the Ptrlists. */ union Ptrlist { Ptrlist *next; State *s; }; /* Create singleton list containing just outp. */ Ptrlist* list1(State **outp) { Ptrlist *l; l = (Ptrlist*)outp; l->next = NULL; return l; }
State의 정의 부분은 다음과 같습니다.
typedef struct State State; struct State { int c; State *out; State *out1; int lastlist; };
일단, Ptrlist의 목적은 이름에서 알 수 있듯이 무언가의 리스트 이겠거니 싶었습니다. 그런데 Ptrlist는 union 타입이란 말이죠? 이해가 되지 않아서 그림을 그려봤는데 더 이해가 되지 않습니다.
음... union 타입이니까 Ptrlist의 맴버 변수 타입인 Ptrlist* 혹은 State* 둘 중 하나만 의미가 있겠다고 생각했습니다. 그렇게 생각하고 그림을 그려보았습니다. 만약 제가 그림을 제대로 그렸다면??? 저 자료구조는 전혀 리스트가 아닙니다. 그냥... 삼중 사중 포인터라는 느낌밖에 없습니다.
일단 그렇다 치고 list1() 함수도 이해할 수 없었습니다. 주석으로는 새로운 리스트를 만든다는데 함수에서 하는 일이라고는 그냥 type conversion 밖에 없습니다. 게다가 State** 를 Ptrlist* 로 캐스팅합니다. 이것도 이해가 안되서 그림을 그려봤는데 더 이해가 되지 않습니다.
일단 State** 값을 매개변수로 받았고 그 값을 Ptrlist* 변수에 넣었으니 결과는 위와 같을 것이라고 생각했습니다. 그렇다면 State* == Ptrlist 라는 것인가요???
kldp회원분들께 코드 해석을 ㅇ...요청드립니다.
Forums:
무며
automata state machine 이론 같네요
네, 오토마타를 공부하면서 찾은 코드입니다.
네, 오토마타를 공부하면서 찾은 코드입니다.
질문글 덕분에 신기한 코드 저도 배워가네요.
질문글 덕분에 신기한 코드 저도 배워가네요.
말로 설명하기는 힘든데, 예를 들어 "a|b" 라는 정규식을 NFA로 변환할 때
위와 같이 변환되겠죠.
그러면 state1 의 out 과 state2 의 out 필드가 동일하게 Match state 를 가리켜야 하는데, 두 out 필드를 보관하는 일과, 일괄적으로 Match를 가리키게 하는 과정을 저 Ptrlist 리스트를 써서 하고 있네요.
"a|b"를 일단 후위표기힌 "ab|"로 바꾼 다음에, a, b, |를 각각 읽은 시점에 스택에 들어가 있는 Frag구조체의 out 필드는 저 state1과 state2의 out 필드의 리스트입니다.
좋은 하루 되세요!
그림으로 그려보고나서 답변을 이해했네요. 그러니까,
그림으로 그려보고나서 답변을 이해했네요. 그러니까, 말그대로 State* 주소값 리스트(Ptr list) 인데, union을 사용해서 일종의 State*와 Ptrlist*를 alias로 만들었다? 고 볼 수 있는 것 같네요. 정말... 공간 활용을 제대로 한 것 같아요.
덕분에 저도 좋은거 배워 갑니다.
덕분에 저도 좋은거 배워 갑니다.
댓글 달기