드디어 방향을 정했습니다.


식별자는 다음과 같이 4종류가 있습니다

타입: 대문자로 시작, 밑줄문자 없음, 괄호 안 붙음.

술어: 대문자로 시작, 밑줄문자 없음, 괄호 붙어야함.

생성자: 대문자 없음, 밑줄문자 있어도 됨, 괄호 붙어야함.

변수: 대문자 없음, 밑줄문자 있어도 됨, 괄호 안 붙음.


모든 생성자는 문자열을 값으로 가집니다.

생성자들의 결합인 항도 문자열을 값으로 가집니다.

문자열 "succ(zero())"는 그냥 문자열입니다.

문자열 'succ(zero())'는 항의 값입니다.

* 연산자로 두 문자열을 접속할 수 있습니다.


술어에게 문자열을 주어 그것을 호출합니다.

술어가 문자열을 받아 호출되면

파서가 술어의 타입을 보고 문자열을 항으로 바꾼 뒤

패턴 매칭을 하고 항을 묶습니다.


코드는 (타입 정의, 술어 선언 또는 술어 정의)의 반복입니다.

다음은 예시코드입니다. "-" 뒤에는 주석이 옵니다.


Nat - 타입 정의

{

    succ(n: Nat) = "s" * 'n'.

    zero() = "z".

}

- 'succ(zero())' = "sz".


Main(Nat). - 술어 선언


-이하 술어 정의

/ Main(zero()). - 첫번째 항에 zero()가 묶이면 참이라는 뜻입니다.

Main('n') / Main(succ(n)). - 첫번째 항에 succ(n)이 묶이면 Main('n')이 참일 때 참이라는 뜻입니다.


이때 인터프리터에게 Main("ssz").라고 물으면 yes라고 답합니다.


여기서 멤버함수를 넣을까 말까 고민 중입니다.

여러분의 많은 관심 바랍니다.