일지

인터프리터...5

niamdank 2020. 10. 24. 12:28

모델 인터프리터 처리계 개발 목표

  • 인터프리터의 기본 기능을 직접 구현한다.
    • 어휘 분석 루틴
    • 구문 분석 루틴
  • 프로그래밍 언어에 필요한 기능을 구현한다.
    • 변수 처리
    • 배열 처리
    • 제어문 처리
    • 함수 처리
  • 코드의 가독성을 최우선으로 한다.

 

BBI 인터프리터의 언어 사양

책에서는 Basic과 Ruby를 닮은 Interpreter라는 의미를 담은 BBI 인터프리터를 개발한다.

  • 변수 선언하지 않고 이용할 수 있으며 최초 대입 시 형과 초기값이 결정된다.
    • 초기화되지 않은 변수 사용 시 에러가 발생한다.
    • 글로벌 변수를 설정할 수 있다.
    • 1차원 배열을 지원한다.
    • 변수를 선언 후 사용하도록 옵션을 지원한다.
  • 함수 함수를 생성해 사용할 수 있도록 한다.
    • return 문을 사용해 값을 반환한다.
    • return 문이 없는 경우 기본 값을 반환한다.
  • 연산자 변수의 연산을 위한 연산자들을 지원한다.
    • 단항 연산자
      + (양수) - (음수) ! (부정)  
    • 이항 연산자
      + (덧셈) - (뺄셈) * (곱셈) / (나눗셈)
      \ (정수 나눗셈) % (정수 나머지)    
      < (왼쪽이 작다) <= (왼쪽이 작거나 같다) > (왼쪽이 크다) >= (왼쪽이 크거나 같다)
      == (같다) != (같지 않다) && (AND) || (OR)
  • 내장 함수 구현하지 않고 사용할 수 있는 함수가 존재한다.
    • print 함수
    • println 함수
    • input 함수
    • toint 함수
  • 제어문 조건 제어문과 반복 제어문을 구현한다.
    • if 문
    • while 문
    • for 문
  • 분기문 분기를 태울 수 있는 구문을 구현한다.
    • break 문 반복 처리를 종료한다.
    • return 문 함수를 종료한다.
    • exit 문 프로그램을 종료한다.
  • 주석 // 를 이용해 행 끝까지 주석으로 처리한다.
  • 실행 방법 main 함수가 존재하면 main함수를 실행하고 없으면 처음부터 실행한다.
    • 실행 중 함수 정의가 나오면 함수 정의는 건너뛰고 실행한다.
    • 프로그램 끝에 도달하면 종료한다.
    • exit 문을 만나면 즉시 종료한다.

 

BBI 인터프리터 프로그램 예제

덧셈 프로그램

sum = 0
println "수치를 입력해 주세요. 0을 입력하면 종료합니다."
n = input()
while n != 0
	sum = sum + n
	println "	>", sum
	n = input()
end

 

소수를 구하는 프로그램

func is_prime(n) // n이 소수라면 참을 반환한다.
	return 0 ? n < 2
	return 1 ? n == 2
	return 0 ? n % 2 == 0
	i = 3
	while i * i <= n
		if n % i == 0
			return 0
		end
		i = i + 2
	end
	return 1
end

// main 함수
func main()
	for n = 1 to 1000
		if is_prime(n)
			print n, " "
		end
	end
	println ""
end

 

퀵 소트 프로그램

var $d[9]

func main()
	$d[0] = 60
	$d[1] = 20
	$d[2] = 10
	$d[3] = 90
	$d[4] = 50
	$d[5] = 30
	$d[6] = 0
	$d[7] = 40
	$d[8] = 80
	$d[9] = 70

	quick_sort(0, 9)
	for i = 0 to 9
		print $d[i], " "
	end
	println ""
end

func quick_sort(top, last)
	key = $d[(top + last) \ 2]
	i = top - 1
	j = last + 1
	while 1
		i = i + 1
		while $d[i] < key
			i = i + 1
		end
		j = j - 1
		while $d[i] > key
			j = j - 1
		end
		break ? i >= j
		wk = $d[i]
		$d[i] = $d[j]
		$d[j] = wk
	end
	if top < i - 1
		quick_sort(top, i - 1)
	end
	if j + 1 < last
		quick_sort(j + 1, last)
	end
end