ㄱ, ㄴ 두 개의 스택을 사용하여 테이프를 구현한다.
<-- v -->
a .. b c d .. e
| ㄱ | | ㄴ |
a: ㄱ 스택의 맨 아래
c: ㄱ 스택의 맨 위 (= 항상 현재 위치)
d: ㄴ 스택의 맨 위
e: ㄴ 스택의 맨 아래
<
: c를 ㄴ 스택의 맨 위로 옮기면(삭싼
) b가 현재 위치가 됨.>
: d를 ㄱ 스택의 맨 위로 옮기면(산싹
) d가 현재 위치가 됨.
단, 아직 접근한 적 없는 곳으로 데이터 포인터를 이동하려 하면 값을 0으로 초기화 해주어야 한다.
이때 아희의 stack underflow 처리 동작(반대 방향으로 움직임)을 이용한다.
따라서 <
는 샥바싼
, >
는 샨바싹
으로 변환할 수 있다.
그리고 실행 전에 현재 포인터가 가리키는 값을 0으로 초기화(삭바
)한다.
삭
: ㄱ 스택을 선택.밪반타
: 1을 만든다.다
또는타
: 각각+
,-
.
:삭빠맣
(ㄱ 선택, 중복, 문자 출력),
:삭바밯
(ㄱ 선택, 뽑기, 문자 읽기)
삭뺘우차(루프 몸통)
차
에서 스택 맨 위의 값이 0이면 우
로 가서 루프를 탈출한다.
그리고 0이 아니면 루프 몸통으로 진입, 루프 몸통의 끝에 가면 wrapping되어 다시 루프를 실행한다.
루프가 중첩될 경우 코드를 어떻게 배치할지가 관건일 듯.
위에는 변환을 간단하게 하기 위해 모든 코드 조각을 스택 선택 명령으로 시작했지만, 스택을 굳이 바꾸지 않아도 되는 경우가 대부분일 것이다.
필요없는 경우에 스택 선택 명령을 생략하면 코드 크기가 줄어들 것임.