SlideShare a Scribd company logo
1 of 56
The Art of Computer Programming2.4 다중연결 구조 아키텍트를 꿈꾸는 사람들cafe.naver.com/architect1 현수명  soomong.net #soomong
다중연결구조 링크가 여러 개! COBOL 예제 	COBOL 상세규칙 	Algorithm A 	Algorithm B 	Algorithm C
다중연결 구조 링크필드가 여러개인 노드 ,[object Object]
 여러종류의 구조들이 동시에 나타나는 경우,[object Object],[object Object]
1 PURCHASES 	2 DATE 		3 DAY 		3 MONTH 		3 YEAR 	2 TRANSACTION 		3 ITEM 		3 QUANTITY 		3 PRICE 		3 TAX 		3 SHIPPER 			4 NAME 			4 ADDRESS 1 SALES 	2 DATE 		3 MONTH 		3 DAY 		3 YEAR 	2 TRANSACTION 		3 ITEM 		3 QUANTITY 		3 PRICE 		3 TAX 		3 BUYER 			4 NAME 			4 ADDRESS ,[object Object]
순서 : 외부 표현 순서기준.-변수Type : 여기서는 논외로 하자.
1 PURCHASES 	2 DATE 		3 DAY 		3 MONTH 		3 YEAR 	2 TRANSACTION 		3 ITEM 		3 QUANTITY 		3 PRICE 		3 TAX 		3 SHIPPER 			4 NAME 			4 ADDRESS 1 SALES 	2 DATE 		3 MONTH 		3 DAY 		3 YEAR 	2 TRANSACTION 		3 ITEM 		3 QUANTITY 		3 PRICE 		3 TAX 		3 BUYER 			4 NAME 			4 ADDRESS 개별 변수를 지칭 ,[object Object],	  PURCHASES 의 DAY 인지? DAY OF DATE OF SALES
1 PURCHASES 	2 DATE 		3 DAY 		3 MONTH 		3 YEAR 	2 TRANSACTION 		3 ITEM 		3 QUANTITY 		3 PRICE 		3 TAX 		3 SHIPPER 			4 NAME 			4 ADDRESS 1 SALES 	2 DATE 		3 MONTH 		3 DAY 		3 YEAR 	2 TRANSACTION 		3 ITEM 		3 QUANTITY 		3 PRICE 		3 TAX 		3 BUYER 			4 NAME 			4 ADDRESS NAME OF SHIPPER OF TRANSACTION OF PURCHASES NAME OF SHIPPER SHIPPER 는 오직 한부분에만 나오기 때문
COBOL 상세규칙 수준번호 level number 한 그룹의 항목은 같은 수준번호를 가짐 그 번호는 부모 그룹의 수준번호보다 작음 A0 OF A1 OF … OF An, n>=0 , 0<j<n 이런 조건을 만족하는 A0 은 오직 하나만 존재 한정 같은 이름 A0 가 여러장소에 나타난다면  한정을 통해서 지칭하는 방법이 있어야함
COBOL 상세규칙 MOVE CORRESPONDING A TO B 자료영역 A 에서 자료영역 B 로 대응되는 이름을 가진 모든 항목들을 옮긴다 MOVE CORRESPONDING DATE OF SALES TO  DATE OF PURCHASES  SALES 의 MONTH,DAY,YEAR 값을 PURCHASES 의 MONTH,DAY,YEAR 로 이동한다
COBOL 컴파일러 알고리즘 설계 연산1) 수준번호와 이름을 처리해서 연산2와 연산3에서 사용할수 있도록 컴파일러 내부의 표에 집어넣는다 연산2) 주어진 한정된 참조가 유효한지 판정하고, 유효하다면 해당자료 항목의 위치를 찾는다 연산3) 주어진 CORRESPONDING 문장이 지시하는 모든 대응 항목 쌍들을 찾는다
COBOL 컴파일러 알고리즘 설계 연산1) 수준번호와 이름을 처리해서 연산2와 연산3에서 사용할수 있도록 컴파일러 내부의 표에 집어넣는다 표에는 어떤 정보가 들어가야 할까? 연산2와 연산3에서 어떤 정보가 필요한지 먼저 체크되어야 결정가능!
COBOL 컴파일러 알고리즘 설계 연산2) 주어진 한정된 참조가 유효한지 판정하고, 유효하다면 해당자료 항목의 위치를 찾는다 연산3) 주어진 CORRESPONDING 문장이 지시하는 모든 대응 항목 쌍들을 찾는다 ,[object Object],-기호표에서 더 자세한 정보를 가진 자료표로의 링크가 필요 ,[object Object]
자료표에서 다시 기호표로 돌아가는 링크도 필요
하위 항목에 대한 링크도 필요
동등 항목에 대한 링크도 필요,[object Object]
COBOL 컴파일러 알고리즘 설계 1 SALES 2 DATE 2 TRANSACTION 3 MONTH 3 DAY 3 YEAR 3 MONTH Symbol Table PREV : 같은 이름을 가진 이전요소로의 링크 PARENT : 속해있는 상위 그룹으로 링크 NAME : 항목에 대한 기호표 요소로의 링크 CHILD : 첫째 하위 항목으로 링크 SIB : 같은 그룹의 다음 항목으로 링크
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 아…어떻게 설명을 해야할까요ㅜㅜ
어떻게 하면 알고리즘을 알기쉽게 잘  설명 할 수 있을까? 세부적으로 모든 구문을 설명 대략적인 과정을 설명 한줄 또는그림하나로 설명
Algorithm A (자료표구축) 왼쪽의 (L,P) 쌍들을 입력받아서 오른쪽의 자료표를 만든다 (L,P)
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 (0,Λ) 1 A    3 B        7 C        7 D    3 E
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (0,Λ) Q (L,P) (1,A) 1 A    3 B        7 C        7 D    3 E
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (0,Λ) Q (L,P) (1,A) 1 A    3 B        7 C        7 D    3 E
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (0,Λ) Q FIRST (L1,P1) (L,P) (1,A) (0, Λ ) 1 A    3 B        7 C        7 D    3 E
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (0,Λ) Q FIRST (L1,P1) (L,P) (1,A) (0, Λ ) 1 A    3 B        7 C        7 D    3 E
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (1,A) (0,Λ) Q FIRST (L1,P1) (L,P) (1,A) (0, Λ ) 1 A    3 B        7 C        7 D    3 E
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (1,A) (0,Λ) FIRST A1 Q (L1,P1) (L,P) (3,B) (0, Λ ) 1 A    3 B        7 C        7 D    3 E
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (1,A) (0,Λ) FIRST A1 Q (L1,P1) (L,P) (3,B) (0, Λ ) 1 A    3 B        7 C        7 D    3 E
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (1,A) (0,Λ) FIRST A1 Q (L1,P1) (L,P) (3,B) (1,A) 1 A    3 B        7 C        7 D    3 E
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (1,A) (0,Λ) FIRST A1 Q (L1,P1) (L,P) (3,B) (1,A) 1 A    3 B        7 C        7 D    3 E
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (3,B) (1,A) (0,Λ) FIRST A1 Q (L1,P1) (L,P) (3,B) (1,A) 1 A    3 B        7 C        7 D    3 E
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (7,D) (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 1 A    3 B        7 C        7 D    3 E (L1,P1) (L,P) (7,C) (7,D)
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (7,D) (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 D7 1 A    3 B        7 C        7 D    3 E (L1,P1) (L,P) (7,C) (7,C)
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (7,D) (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 D7 Q 1 A    3 B        7 C        7 D    3 E (L1,P1) (L,P) (3,E) (7,C)
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (7,D) (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 D7 Q 1 A    3 B        7 C        7 D    3 E (L1,P1) (L,P) (3,E) (7,C)
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 Symbol Table (7,D) (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 D7 Q 1 A    3 B        7 C        7 D    3 E (L1,P1) (L,P) (3,E) (7,D)
Algorithm A (자료표구축) A1. [초기화]  스택을 비우고 (0,Λ) 삽입 A2. [다음항목]  입력에서 다음 자료 항목 (L,P) 를 가져온다 	if( 더이상없음 ) then END! 	Q ← AVAIL A3. [이름 링크들을 설정]  	PREV(Q) ← LINK(P) 	LINK(P) ← Q 	NAME(Q) ← P A4. [수준들을 비교]  스택의 최상위 요소를 (L1,P1) 에 복사한다 	if( L1<L ) then  		CHILD(P1) ← Q 		if( P1 == Λ) then FIRST ← Q 		GOTO A6 A5. [최상위 수준을 제거]  	if( L1>L ) then  스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 		GOTO A5 	if( L1<L ) then 오류를 보고 	else  		SIB(P1) ← Q	 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정]  	PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가]  	(L,Q) 를 스택에 PUSH  	GOTO A2 (7,D) Symbol Table (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 D7 Q 1 A    3 B        7 C        7 D    3 E (L1,P1) (L,P) (3,E) (1,A)
Algorithm B (한정된 참조 점검) 이 참조가 유효한지를 점검하고 유효하다면 변수 Q 를 이 참조가 지칭하는 항목에 대한 자료표 요소의 주소로 설정한다 이런 서브루틴이  있다고 가정 서브루틴
Algorithm B (한정된 참조 점검) NAME OF SHIPPER OF TRANSACTION OF PURCHASES 이게 유효한가? 1 1 PURCHASES 	2 DATE 		3 DAY 		3 MONTH 		3 YEAR 	2 TRANSACTION 		3 ITEM 		3 QUANTITY 		3 PRICE 		3 TAX 		3 SHIPPER 			4 NAME 			4 ADDRESS 2 Q
Algorithm B (참조 점검) B1. [초기화]  B2. [끝인가?]  B3. [부합 완료?]  B4. [K를 증가]  B5. [트리를 따라 위로]  B6. [Ak가 부합하는가?]
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k:0~2 Q
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 0 Q : Λ
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 0 Q : Λ
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 0 Q : D
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 1 Q : D
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 1 Q : D
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 1 Q : D
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 1 Q : B
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 2 Q : B
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 2 Q : B
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 2 Q : B
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 2 Q : A
Algorithm B (참조점검) 1 A    3 B        7 C        7 D    3 E D OF B OF A k : 2 Q : A
Algorithm C (Corresponding 쌍들을 찾기) MOVE CORRESPONDING A TO B 자료영역 A 에서 자료영역 B 로 대응되는 이름을 가진 모든 항목들을 옮긴다 MOVE CORRESPONDING A TO H MOVE B OF A TO B OF H MOVE G OF F OF A TO G OF F OF H
Algorithm C (Corresponding 쌍들을 찾기) MOVE    TO 대응되는 이름을 가진 항목을 이동
Algorithm C (참조 점검) C1. [초기화]  C2. [기본항목인가?]  C3. [이름 부합]  C4. [계속 진행]  C5. [끝인가?]

More Related Content

More from hyun soomyung

Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Designhyun soomyung
 
Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10hyun soomyung
 
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)hyun soomyung
 
프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장hyun soomyung
 
[페차쿠차] 배움의 기술
[페차쿠차] 배움의 기술[페차쿠차] 배움의 기술
[페차쿠차] 배움의 기술hyun soomyung
 
실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부hyun soomyung
 
xUnitTestPattern/chapter8
xUnitTestPattern/chapter8xUnitTestPattern/chapter8
xUnitTestPattern/chapter8hyun soomyung
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법hyun soomyung
 
프로그램은 왜 실패하는가?
프로그램은 왜 실패하는가?프로그램은 왜 실패하는가?
프로그램은 왜 실패하는가?hyun soomyung
 
5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)hyun soomyung
 

More from hyun soomyung (15)

Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
MapReduce
MapReduceMapReduce
MapReduce
 
MongoDB
MongoDBMongoDB
MongoDB
 
Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10
 
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
스터디그룹 패턴 (A PATTERN LANGUAGE FOR STUDY GROUPS)
 
Clojure Chapter.6
Clojure Chapter.6Clojure Chapter.6
Clojure Chapter.6
 
프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장프로그래머의 길,멘토에게 묻다 2장
프로그래머의 길,멘토에게 묻다 2장
 
[페차쿠차] 배움의 기술
[페차쿠차] 배움의 기술[페차쿠차] 배움의 기술
[페차쿠차] 배움의 기술
 
실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부
 
xUnitTestPattern/chapter8
xUnitTestPattern/chapter8xUnitTestPattern/chapter8
xUnitTestPattern/chapter8
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법
 
프로그램은 왜 실패하는가?
프로그램은 왜 실패하는가?프로그램은 왜 실패하는가?
프로그램은 왜 실패하는가?
 
Erlang
ErlangErlang
Erlang
 
5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)
 
이산수학 Ch.5
이산수학 Ch.5이산수학 Ch.5
이산수학 Ch.5
 

The Art of Computer Programming 2.4 다중연결구조

  • 1. The Art of Computer Programming2.4 다중연결 구조 아키텍트를 꿈꾸는 사람들cafe.naver.com/architect1 현수명 soomong.net #soomong
  • 2. 다중연결구조 링크가 여러 개! COBOL 예제 COBOL 상세규칙 Algorithm A Algorithm B Algorithm C
  • 3.
  • 4.
  • 5.
  • 6. 순서 : 외부 표현 순서기준.-변수Type : 여기서는 논외로 하자.
  • 7.
  • 8. 1 PURCHASES 2 DATE 3 DAY 3 MONTH 3 YEAR 2 TRANSACTION 3 ITEM 3 QUANTITY 3 PRICE 3 TAX 3 SHIPPER 4 NAME 4 ADDRESS 1 SALES 2 DATE 3 MONTH 3 DAY 3 YEAR 2 TRANSACTION 3 ITEM 3 QUANTITY 3 PRICE 3 TAX 3 BUYER 4 NAME 4 ADDRESS NAME OF SHIPPER OF TRANSACTION OF PURCHASES NAME OF SHIPPER SHIPPER 는 오직 한부분에만 나오기 때문
  • 9. COBOL 상세규칙 수준번호 level number 한 그룹의 항목은 같은 수준번호를 가짐 그 번호는 부모 그룹의 수준번호보다 작음 A0 OF A1 OF … OF An, n>=0 , 0<j<n 이런 조건을 만족하는 A0 은 오직 하나만 존재 한정 같은 이름 A0 가 여러장소에 나타난다면 한정을 통해서 지칭하는 방법이 있어야함
  • 10. COBOL 상세규칙 MOVE CORRESPONDING A TO B 자료영역 A 에서 자료영역 B 로 대응되는 이름을 가진 모든 항목들을 옮긴다 MOVE CORRESPONDING DATE OF SALES TO DATE OF PURCHASES SALES 의 MONTH,DAY,YEAR 값을 PURCHASES 의 MONTH,DAY,YEAR 로 이동한다
  • 11. COBOL 컴파일러 알고리즘 설계 연산1) 수준번호와 이름을 처리해서 연산2와 연산3에서 사용할수 있도록 컴파일러 내부의 표에 집어넣는다 연산2) 주어진 한정된 참조가 유효한지 판정하고, 유효하다면 해당자료 항목의 위치를 찾는다 연산3) 주어진 CORRESPONDING 문장이 지시하는 모든 대응 항목 쌍들을 찾는다
  • 12. COBOL 컴파일러 알고리즘 설계 연산1) 수준번호와 이름을 처리해서 연산2와 연산3에서 사용할수 있도록 컴파일러 내부의 표에 집어넣는다 표에는 어떤 정보가 들어가야 할까? 연산2와 연산3에서 어떤 정보가 필요한지 먼저 체크되어야 결정가능!
  • 13.
  • 14. 자료표에서 다시 기호표로 돌아가는 링크도 필요
  • 15. 하위 항목에 대한 링크도 필요
  • 16.
  • 17. COBOL 컴파일러 알고리즘 설계 1 SALES 2 DATE 2 TRANSACTION 3 MONTH 3 DAY 3 YEAR 3 MONTH Symbol Table PREV : 같은 이름을 가진 이전요소로의 링크 PARENT : 속해있는 상위 그룹으로 링크 NAME : 항목에 대한 기호표 요소로의 링크 CHILD : 첫째 하위 항목으로 링크 SIB : 같은 그룹의 다음 항목으로 링크
  • 18. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 아…어떻게 설명을 해야할까요ㅜㅜ
  • 19. 어떻게 하면 알고리즘을 알기쉽게 잘 설명 할 수 있을까? 세부적으로 모든 구문을 설명 대략적인 과정을 설명 한줄 또는그림하나로 설명
  • 20. Algorithm A (자료표구축) 왼쪽의 (L,P) 쌍들을 입력받아서 오른쪽의 자료표를 만든다 (L,P)
  • 21. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 (0,Λ) 1 A 3 B 7 C 7 D 3 E
  • 22. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (0,Λ) Q (L,P) (1,A) 1 A 3 B 7 C 7 D 3 E
  • 23. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (0,Λ) Q (L,P) (1,A) 1 A 3 B 7 C 7 D 3 E
  • 24. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (0,Λ) Q FIRST (L1,P1) (L,P) (1,A) (0, Λ ) 1 A 3 B 7 C 7 D 3 E
  • 25. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (0,Λ) Q FIRST (L1,P1) (L,P) (1,A) (0, Λ ) 1 A 3 B 7 C 7 D 3 E
  • 26. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (1,A) (0,Λ) Q FIRST (L1,P1) (L,P) (1,A) (0, Λ ) 1 A 3 B 7 C 7 D 3 E
  • 27. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (1,A) (0,Λ) FIRST A1 Q (L1,P1) (L,P) (3,B) (0, Λ ) 1 A 3 B 7 C 7 D 3 E
  • 28. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (1,A) (0,Λ) FIRST A1 Q (L1,P1) (L,P) (3,B) (0, Λ ) 1 A 3 B 7 C 7 D 3 E
  • 29. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (1,A) (0,Λ) FIRST A1 Q (L1,P1) (L,P) (3,B) (1,A) 1 A 3 B 7 C 7 D 3 E
  • 30. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (1,A) (0,Λ) FIRST A1 Q (L1,P1) (L,P) (3,B) (1,A) 1 A 3 B 7 C 7 D 3 E
  • 31. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (3,B) (1,A) (0,Λ) FIRST A1 Q (L1,P1) (L,P) (3,B) (1,A) 1 A 3 B 7 C 7 D 3 E
  • 32. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (7,D) (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 1 A 3 B 7 C 7 D 3 E (L1,P1) (L,P) (7,C) (7,D)
  • 33. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (7,D) (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 D7 1 A 3 B 7 C 7 D 3 E (L1,P1) (L,P) (7,C) (7,C)
  • 34. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (7,D) (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 D7 Q 1 A 3 B 7 C 7 D 3 E (L1,P1) (L,P) (3,E) (7,C)
  • 35. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (7,D) (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 D7 Q 1 A 3 B 7 C 7 D 3 E (L1,P1) (L,P) (3,E) (7,C)
  • 36. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 Symbol Table (7,D) (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 D7 Q 1 A 3 B 7 C 7 D 3 E (L1,P1) (L,P) (3,E) (7,D)
  • 37. Algorithm A (자료표구축) A1. [초기화] 스택을 비우고 (0,Λ) 삽입 A2. [다음항목] 입력에서 다음 자료 항목 (L,P) 를 가져온다 if( 더이상없음 ) then END! Q ← AVAIL A3. [이름 링크들을 설정] PREV(Q) ← LINK(P) LINK(P) ← Q NAME(Q) ← P A4. [수준들을 비교] 스택의 최상위 요소를 (L1,P1) 에 복사한다 if( L1<L ) then CHILD(P1) ← Q if( P1 == Λ) then FIRST ← Q GOTO A6 A5. [최상위 수준을 제거] if( L1>L ) then 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 GOTO A5 if( L1<L ) then 오류를 보고 else SIB(P1) ← Q 스택최상위 요소를 제거 스택의 최상위 요소를 (L1,P1) 에 복사한다 A6. [가족 링크들을 설정] PARENT(Q) ← P1 , CHILD(Q) ←Λ , SIB(Q) ←Λ A7. [스택에 추가] (L,Q) 를 스택에 PUSH GOTO A2 (7,D) Symbol Table (7,C) (3,B) (1,A) (0,Λ) FIRST A1 B3 C7 D7 Q 1 A 3 B 7 C 7 D 3 E (L1,P1) (L,P) (3,E) (1,A)
  • 38. Algorithm B (한정된 참조 점검) 이 참조가 유효한지를 점검하고 유효하다면 변수 Q 를 이 참조가 지칭하는 항목에 대한 자료표 요소의 주소로 설정한다 이런 서브루틴이 있다고 가정 서브루틴
  • 39. Algorithm B (한정된 참조 점검) NAME OF SHIPPER OF TRANSACTION OF PURCHASES 이게 유효한가? 1 1 PURCHASES 2 DATE 3 DAY 3 MONTH 3 YEAR 2 TRANSACTION 3 ITEM 3 QUANTITY 3 PRICE 3 TAX 3 SHIPPER 4 NAME 4 ADDRESS 2 Q
  • 40. Algorithm B (참조 점검) B1. [초기화] B2. [끝인가?] B3. [부합 완료?] B4. [K를 증가] B5. [트리를 따라 위로] B6. [Ak가 부합하는가?]
  • 41. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k:0~2 Q
  • 42. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 0 Q : Λ
  • 43. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 0 Q : Λ
  • 44. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 0 Q : D
  • 45. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 1 Q : D
  • 46. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 1 Q : D
  • 47. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 1 Q : D
  • 48. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 1 Q : B
  • 49. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 2 Q : B
  • 50. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 2 Q : B
  • 51. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 2 Q : B
  • 52. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 2 Q : A
  • 53. Algorithm B (참조점검) 1 A 3 B 7 C 7 D 3 E D OF B OF A k : 2 Q : A
  • 54. Algorithm C (Corresponding 쌍들을 찾기) MOVE CORRESPONDING A TO B 자료영역 A 에서 자료영역 B 로 대응되는 이름을 가진 모든 항목들을 옮긴다 MOVE CORRESPONDING A TO H MOVE B OF A TO B OF H MOVE G OF F OF A TO G OF F OF H
  • 55. Algorithm C (Corresponding 쌍들을 찾기) MOVE TO 대응되는 이름을 가진 항목을 이동
  • 56. Algorithm C (참조 점검) C1. [초기화] C2. [기본항목인가?] C3. [이름 부합] C4. [계속 진행] C5. [끝인가?]
  • 57. 이렇게 구축한 자료표에는 중복된 정보가 많다. 일부를 삭제하면 어떨까? PREV 링크 삭제 -검색의 효율이 중요한 COBOL 에서는 필수! PARENT 링크 삭제 -SIB 를 확장해서 스레드 링크를 포함시킨다면 삭제해도 될듯 ( TAG ) NAME 링크 삭제 -적합여부판단하는이름비교시다른방법이 필요함 결론적으로 5개 링크들 모두 필수는 아니다 그러나 알고리즘 속도면으로 보면 확실히 유용하다