When

시간 제한1초메모리 제한128 MB

문제

"When"은 기계 제어를 위한 이벤트 기반(event-driven) 언어입니다. 문장은 Set, Print, 그리고 복합 구조인 When 절, 이렇게 세 종류뿐입니다. 문법은 다음과 같으며, 키워드와 변수 이름의 대소문자는 구분하지 않습니다.

PROGRAM := WHEN | PROGRAM WHEN
WHEN := 'when ' EXPRESSION EOL STATEMENTS 'end when' EOL
STATEMENTS := STATEMENT | STATEMENTS STATEMENT
STATEMENT := PRINT | SET
PRINT := 'print '  EXPRESSION_LIST EOL
SET := 'set ' ASSIGNMENT_LIST EOL
EXPRESSION_LIST := EXPRESSION | EXPRESSION_LIST ',' EXPRESSION
ASSIGNMENT_LIST := ASSIGNMENT | ASSIGNMENT_LIST ',' ASSIGNMENT
ASSIGNMENT := VARIABLE '=' EXPRESSION
EXPRESSION := '(' EXPRESSION OP EXPRESSION ')' | VARIABLE | NUMBER
OP :=  '<' | '+' | '-' | 'and' | 'or' | 'xor'
VARIABLE := '$' NOT_DOLLAR_STRING '$'
NUMBER := DIGIT | NUMBER DIGIT
DIGIT := '0' | .. | '9'
NOT_DOLLAR_STRING := any sequence of printing characters (including blanks)
                     that does not contain a $ symbol.

작은따옴표로 둘러싸인 문자열은 그대로(리터럴로) 취급합니다. EOL은 줄의 끝을 뜻합니다.

말로 풀어 쓰면, 프로그램은 여러 개의 When 블록으로 이루어지며 각 블록은 Set 문과 Print 문을 담습니다. 키워드와 변수 이름은 대소문자를 구분하지 않습니다. 숫자 내부를 제외하면 어떤 리터럴의 앞이나 뒤에도 공백을 넣을 수 있습니다. 변수 이름 안에도 공백을 넣을 수 있으며, 비어 있지 않은 연속된 공백은 하나의 밑줄(_)로 취급합니다. 따라서 아래 세 표기는 모두 같은 변수를 가리킵니다.

$Remote Switch#1$
$Remote_Switch#1$
$Remote   switch#1$

모든 변수와 리터럴 값은 -1000000000 이상 1000000000 이하의 정수입니다. 모든 변수는 전역이며 처음에는 0입니다. 어떤 식(expression)도 이 범위를 벗어나는 값으로 평가되지 않음이 보장됩니다. 논리 연산자는 거짓이면 0, 참이면 1을 돌려주며, 0이 아닌 값은 모두 참으로 간주합니다.

When 프로그램을 실행한다는 것은 활성 상태인 When 절이 하나도 남지 않을 때까지 모든 활성 When 절을 실행하는 것을 뜻합니다. 활성 When 절 목록은 처음에는 비어 있으며, 이후 다음 단계를 반복합니다.

  • 프로그램에 나타난 순서대로, 현재 활성 상태가 아닌 모든 When 절의 조건을 평가합니다. 조건이 참이면 그 절을 활성 목록의 맨 뒤에 추가하고, 그 절의 첫 번째 문장을 "준비(ready)" 상태로 표시합니다. 활성 상태인 각 When 절은 정확히 하나의 "준비" 문장을 가집니다.
  • 이 단계 후 활성 목록이 비어 있으면 프로그램을 종료합니다.
  • "현재(current)" When 절(처음에는 활성 목록의 첫 번째 절)의 "준비" 문장을 실행합니다.
  • 그 절의 "준비" 표시를 다음 문장으로 옮깁니다. 방금 실행한 문장이 현재 절의 마지막 문장이었다면 그 절을 활성 목록에서 제거합니다.
  • "현재" 표시를 활성 목록의 다음 절로 옮기며, 끝을 지나면 처음으로 되돌아갑니다(순환).

다시 말해, 비활성 When 조건을 평가해 어떤 절이 활성 목록에 들어올지 정합니다. 그런 다음 현재 활성 When 절에서 문장 하나(Set 또는 Print)를 실행합니다. 그 문장이 해당 절의 마지막 문장이었다면 그 절은 활성 목록에서 빠집니다. 다음 반복에서는 그다음 활성 When 절에서 문장 하나를 실행하는 식으로 계속됩니다.

Set 문은 모든 대입을 동시에 수행합니다. 따라서

set $x$=$y$,$y$=$x$

$x$$y$의 값을 서로 맞바꿉니다. 같은 변수가 한 Set 문의 왼쪽에 두 번 나타날 수는 없습니다(즉 set $x$=1,$x$=2는 잘못된 문장입니다).

Print 문은 주어진 식들을 평가해 쉼표로 구분하여 출력하고, 그 뒤에 줄바꿈을 붙입니다. 따라서

print 1,(2+3)

는 출력에

1,5

라는 줄을 만듭니다.

입력

입력은 문법적으로 올바른 프로그램 하나로 이루어집니다. 이 프로그램은 Set 문을 100000개보다 많이, Print 문을 100000개보다 많이 실행하지 않는다고 가정해도 됩니다.

출력

주어진 프로그램을 실행하여 나오는 출력을 그대로 출력하십시오.