아주 단순한 Forth의 부분 집합을 위한 평가기를 구현해 보세요.
Forth는 스택 기반 프로그래밍 언어예요. Forth의 작은 부분 집합을 위한 아주 기본적인 평가기를 구현해 보세요.
평가기는 다음 단어들을 지원해야 해요:
+, -, *, / (정수 연산)DUP, DROP, SWAP, OVER (스택 조작)평가기는 또한 관례적인 문법인 : word-name definition ;을 사용해 새로운 단어를 정의하는 것도 지원해야 해요.
간단하게 유지하기 위해 지원해야 하는 유일한 데이터 타입은 최소 16비트 크기의 부호 있는 정수예요.
문법에는 다음 규칙을 사용하세요: 숫자는 하나 이상의 (ASCII) 숫자로 이루어진 연속이고, 단어는 숫자가 아닌 하나 이상의 문자, 숫자, 기호 또는 구두점으로 이루어진 연속이에요. (Forth는 아마 조금 다른 규칙을 사용하지만, 이 정도면 충분히 비슷해요.)
단어는 대소문자를 구분하지 않아요.
Forth에서 함수는 words라고 부르고, 데이터 스택 위에서 동작해요.
각 워드는 매개변수를 스택에서 가져와서 결과를 스택에 반환해요.
Forth 문서에는 워드가 실행되기 전과 실행된 후의 데이터 스택 상태가 항상 다음과 같은 형식으로 적혀 있어요: ( p1 p2 ... pN --- r1 r2 ... rN ).
p1부터 pN까지의 값은 호출 전 스택에 있는 워드의 매개변수를 나타내고(스택에는 여기에 표시되지 않은 다른 데이터가 더 있을 수 있어요), r1부터 rN까지의 값은 호출 후 스택에 있는 워드의 반환 값을 나타내요.
구분자 ---는 워드가 실행되기 전과 후의 스택 상태를 구분해요.
구현할 워드는 다음과 같이 정의돼요:
| 워드 | 스택 상태 | 설명 |
|---|---|---|
+ |
( a b --- sum ) |
sum = a + b |
- |
( a b --- diff ) |
diff = a - b |
* |
( a b --- prod ) |
prod = a * b |
/ |
( a b --- quot ) |
quot = a / b |
dup |
( a --- a a ) |
ToS에 있는 값을 복제해요 |
drop |
( a --- ) |
ToS에 있는 값을 버려요 |
swap |
( a b --- b a ) |
ToS에 있는 두 값을 서로 바꿔요 |
over |
( a b c --- a b c b ) |
두 번째 값을 ToS로 복사해요 |
온라인 Forth 인터프리터를 직접 써보고 싶거나 구현할 워드에 대해 더 알아보고 싶다면 Easy Forth를 한번 살펴봐요(특히 Adding Some Numbers, Defining Words, Stack Manipulation 섹션을요).