FORCAL

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

문제

FORCAL은 컴파일러 구성에 관심 있는 프로그래머들, 특히 컴파일러 구성 과목을 듣는 학생들에게 잘 알려진 작은 프로그래밍 언어이다. FORCAL의 문법은 다음과 같이 정의된다.

  • 유일한 자료형은 정수이다.
  • 모든 식별자(identifier)는 암묵적으로 선언되며 길이는 최대 32자이다. 식별자는 영문자, 숫자, 밑줄(_)로 이루어지고, 적어도 한 글자는 숫자가 아니어야 한다.
  • 리터럴(literal)은 최대 8자리의 숫자로 이루어진 문자열이다.
  • 주석(comment)은 --로 시작하여 그 줄의 끝까지 이어진다.
  • 문장(statement)에는 두 종류가 있다.
    • 대입문: 식별자 := 식(expression) 형태이며, 식은 식별자, 리터럴, 연산자 +-, 그리고 괄호로부터 다음 규칙에 따라 만들어진다.
      1. 모든 식별자와 리터럴은 식이다.
      2. a, b가 식이면 a + b, a - b, +a, -a, (a)도 식이다.
    • 입출력문: read(식별자 목록)write(식 목록)이며, 목록의 항목은 쉼표로 구분한다.
  • begin, end, read, write는 예약어이다.
  • 모든 문장은 세미콜론(;)으로 끝난다.
  • FORCAL은 대소문자를 구분하지 않는다. 예를 들어 BegINbeGin은 같은 키워드이다.
  • FORCAL의 토큰(token)은 식별자, 리터럴, 기호 + - ( ) := ; , 중 하나, 또는 예약어이다.

참고:

  • 대입 연산자 :=는 하나의 토큰이다.
  • 토큰과 토큰 사이에는 공백, 탭, 줄바꿈을 넣을 수 있다.
  • 주석의 어떤 부분도 토큰이 아니다.
  • 연속한 두 토큰이 모두 식별자, 리터럴, 예약어이면 반드시 공백, 탭, 또는 줄바꿈으로 구분해야 한다.
  • 어떤 토큰도 공백, 탭, 줄바꿈을 포함할 수 없다.

여러 줄의 텍스트를 읽어 그 안의 FORCAL 토큰을 인식하는 프로그램을 작성하라.

입력

입력은 여러 개의 블록으로 이루어진다. 각 블록은 여러 줄의 텍스트이며, 하나의 빈 줄로 끝난다.

출력

각 입력 줄에 대해 다음과 같이 출력한다. 건너뛰는 중이 아닌, 비어 있지 않은 줄은 왼쪽에서 오른쪽으로 훑으며, 인식한 각 FORCAL 토큰을 한 줄에 하나씩, 입력에 나타난 형태 그대로(대소문자 보존) 출력한다. FORCAL 토큰도, 주석도, 공백(스페이스나 탭)도 아닌 문자열을 만나는 즉시 TOKEN ERROR를 한 줄로 출력하고 현재 블록의 나머지를 건너뛴다. 모든 빈 줄, 그리고 이미 TOKEN ERROR가 발생한 블록에서 건너뛰게 된 모든 줄은 각각 하나의 빈 줄로 출력한다. 각 블록은 빈 줄로 끝나므로, 결과적으로 각 출력 블록 뒤에는 적어도 하나의 빈 줄이 놓인다.