코드 형식 정리

아직 제출이 없습니다시간 제한2초메모리 제한128 MB

문제

프로그래머들은 올바른 코드 형식을 두고 자주 의견이 갈립니다. 새 팀이 프로젝트에 투입되면 기존 소스 코드를 자신들의 스타일에 맞게 다시 정리하고 싶어 하는 경우가 많고, 일관성 없는 형식은 모두의 작업을 어렵게 만듭니다. 이런 이유로 코드 포매팅 도구 시장이 활발히 형성되었습니다.

당신은 Salvation이라는 코드명을 가진 새 포매팅 도구의 개념 증명(proof-of-concept) 작업에 참여하고 있습니다. 목표는 실용성이 아니라, 고급 언어의 코드를 파싱하고 형식을 정리할 수 있음을 보여 주는 것입니다. 당신이 할 일은 TRIVIAL(The Rival Implementation-Agnostic Language)이라는 언어의 포매터를 작성하는 것입니다. 이 언어는 어휘 구조와 문법 구조가 매우 단순합니다. 키워드와 제어 구조가 전혀 없으며, 모든 구성 요소는 함수 호출 또는 클로저로 표현됩니다.

어휘 구조는 식별자, 여는/닫는 괄호와 중괄호, 쉼표, 세미콜론으로 이루어집니다. 식별자는 숫자 0-9와 라틴 문자 a-z, A-Z로만 구성됩니다. 어휘 토큰은 공백으로 구분될 수 있으며, 파일의 앞뒤에 오는 공백도 허용됩니다. 공백은 스페이스, 탭 문자(ASCII 코드 9), 줄 구분자(ASCII 13과 10의 쌍)로 이루어질 수 있습니다.

유효한 TRIVIAL 프로그램은 다음 생성 규칙(production)으로부터 유도됩니다:

Program    ::= Block
Block      ::= '{' Statements '}'
Statements ::= Statement | Statement Statements
Statement  ::= Expression ';'
Expression ::= identifier [ '(' Arguments ')' ] [ Block ]
Arguments  ::= Expression | Expression ',' Arguments

올바르게 형식이 정리된 TRIVIAL 프로그램은 추가로 다음 규칙을 만족합니다:

  • 빈 줄이 없습니다.
  • 탭 문자를 사용하지 않습니다.
  • 파일의 첫 문자는 여는 중괄호 {이며 그 앞에 어떤 공백도 없고, 마지막 문자는 닫는 중괄호 }이며 그 뒤에 어떤 공백도 없습니다.
  • 각 줄 앞에는 4N4N개의 스페이스가 붙습니다. 여기서 NN들여쓰기 레벨이라고 부릅니다.
  • 프로그램의 첫 줄과 마지막 줄의 들여쓰기 레벨은 0입니다.
  • 중괄호 {...}로 둘러싸인 블록 본문을 이루는 줄들은 그 블록을 여는 줄보다 들여쓰기 레벨이 1 더 큽니다.
  • 한 줄 안에서는 어떤 공백도 허용되지 않으며, 단 두 경우에만 스페이스 한 칸이 반드시 들어갑니다: 여는 중괄호 { 앞, 그리고 쉼표 , 뒤.
  • 마지막 줄을 제외한 모든 줄은 세미콜론 ; 또는 여는 중괄호 {로 끝납니다. 이 두 문자는 어떤 줄의 중간이나 시작에도(마지막 줄 포함) 절대 나타날 수 없습니다.
  • 닫는 중괄호 }는 오직 줄의 맨 앞, 들여쓰기 스페이스 바로 뒤에만 나타납니다.

올바르게 형식이 정리된 TRIVIAL 프로그램의 모습은 예제 케이스를 참고하세요.

입력

입력에는 유효한 TRIVIAL 프로그램 하나가 주어집니다. 그 크기는 2000바이트를 넘지 않습니다.

출력

입력으로 주어진 프로그램을 올바르게 형식이 정리된 TRIVIAL 코드로 출력하세요.