인터프리터

사칙연산과 비교, if/else 분기와 while 반복, print 출력을 갖춘 작은 정수 프로그램을 실행하는 인터프리터를 작성합니다.

보통6시뮬레이션구현문자열스택아직 제출이 없습니다시간 제한1초메모리 제한256 MB

문제

아래에 설명한 작은 프로그래밍 언어의 인터프리터를 작성한다.

자료형

이 언어의 자료형은 32비트 부호 있는 정수 하나뿐이다.

값을 참거짓으로 읽는 연산자와 문(!, &&, ||, if, while)은 0을 거짓으로 보고 나머지 값을 모두 참으로 본다.

참거짓을 결과로 내는 연산자(!, <, <=, >, >=, ==, !=, &&, ||)는 거짓이면 0을, 참이면 1을 돌려준다.

변수

변수 이름은 a부터 z까지의 소문자 한 글자다. 모든 변수는 프로그램이 시작할 때 0으로 초기화된다.

공백

단순한 문(set, print)과 복합문을 이루는 각 부분(if, else, end if, while, end while)은 각각 한 줄을 차지한다. 빈 줄은 없다.

토큰(연산자, 변수 이름, 키워드, 상수) 앞뒤에는 공백이나 탭이 얼마든지 올 수 있지만 토큰 안에는 오지 않는다. 공백이 반드시 있는 자리는 영숫자 토큰 두 개가 나란히 놓일 때뿐이다.

문은 다음 중 하나다.

else가 있는 if

if expression
    statements
else
    statements
end if

expression이 참(0이 아닌 값)이면 첫 번째 블록의 문장을 실행하고, 아니면 두 번째 블록의 문장을 실행한다. 블록은 비어 있어도 된다.

else가 없는 if

if expression
    statements
end if

expression이 참이면 블록의 문장을 실행하고, 아니면 블록을 건너뛴다.

while

while expression
    statements
end while

expression을 계산한다. 참이면 블록의 문장을 실행한 다음 while 문의 처음으로 돌아가 expression을 다시 계산한다. 거짓이면 블록을 건너뛴다.

대입

set name = expression

name이 가리키는 변수에 expression의 결과를 넣는다.

출력

print expression

expression의 결과를 표준 출력에 한 줄로 쓴다.

식은 변수 이름, 정수 상수(값이 0 이상 23112^{31}-1 이하인 숫자 나열), 또는 아래 표에 있는 연산이다.

연산자마다 묶이는 순서가 다르다. 1+2*31+(2*3)과 같고, 1*2+3(1*2)+3과 같다.

같은 우선순위 안에서 이항 연산자는 왼쪽부터 묶이고 단항 연산자는 오른쪽부터 묶인다. 1+2-3(1+2)-3과 같고, !-x!(-x)와 같다.

우선순위연산자설명
7()묶기
6-단항 마이너스 (부호 반전)
!논리 부정 (not)
5*곱셈
/정수 나눗셈
%나머지
4+덧셈
-뺄셈
3<작다
<=작거나 같다
>크다
>=크거나 같다
2==같다
!=다르다
1&&논리곱 (and)
0||논리합 (or)

나눗셈 /는 몫을 0 방향으로 버리고, 나머지 %는 왼쪽 피연산자의 부호를 따른다. 즉 -7/2-3이고 -7%2-1이다.

최종 값과 중간 값은 모두 32비트 부호 있는 정수 범위에 들어가므로 넘침을 따로 검사하지 않아도 된다. /% 모두 0으로 나누는 일은 일어나지 않는다.

입력

입력은 프로그램 하나 이상으로 이루어진다. 각 프로그램은 그 프로그램의 줄 수 NN (1N501 \le N \le 50)이 적힌 줄로 시작하고, 이어지는 NN개의 줄이 프로그램이다. 한 줄의 길이는 100자를 넘지 않는다. 0이 적힌 줄이 나오면 입력이 끝난다.

출력

프로그램의 print 문이 만들어 낸 값만 실행 순서대로 한 줄에 하나씩 출력한다.