FORCAL
시간 제한1초메모리 제한128 MB
입력 줄을 블록 단위로 읽고 각 줄에서 FORCAL 토큰(식별자, 리터럴, 기호, 예약어)을 인식해 하나씩 출력하며, 토큰이 아닌 문자열을 만나면 TOKEN ERROR를 출력하고 그 블록의 나머지를 건너뛴다.
문제
FORCAL은 컴파일러 구성에 관심 있는 프로그래머들, 특히 컴파일러 구성 과목을 듣는 학생들에게 잘 알려진 작은 프로그래밍 언어이다. FORCAL의 문법은 다음과 같이 정의된다.
- 유일한 자료형은 정수이다.
- 모든 식별자(identifier)는 암묵적으로 선언되며 길이는 최대 32자이다. 식별자는 영문자, 숫자, 밑줄(
_)로 이루어지고, 적어도 한 글자는 숫자가 아니어야 한다. - 리터럴(literal)은 최대 8자리의 숫자로 이루어진 문자열이다.
- 주석(comment)은
--로 시작하여 그 줄의 끝까지 이어진다. - 문장(statement)에는 두 종류가 있다.
- 대입문:
식별자 := 식(expression)형태이며, 식은 식별자, 리터럴, 연산자+와-, 그리고 괄호로부터 다음 규칙에 따라 만들어진다.- 모든 식별자와 리터럴은 식이다.
a,b가 식이면a + b,a - b,+a,-a,(a)도 식이다.
- 입출력문:
read(식별자 목록)과write(식 목록)이며, 목록의 항목은 쉼표로 구분한다.
- 대입문:
begin,end,read,write는 예약어이다.- 모든 문장은 세미콜론(
;)으로 끝난다. - FORCAL은 대소문자를 구분하지 않는다. 예를 들어
BegIN과beGin은 같은 키워드이다. - FORCAL의 토큰(token)은 식별자, 리터럴, 기호
+-():=;,중 하나, 또는 예약어이다.
참고:
- 대입 연산자
:=는 하나의 토큰이다. - 토큰과 토큰 사이에는 공백, 탭, 줄바꿈을 넣을 수 있다.
- 주석의 어떤 부분도 토큰이 아니다.
- 연속한 두 토큰이 모두 식별자, 리터럴, 예약어이면 반드시 공백, 탭, 또는 줄바꿈으로 구분해야 한다.
- 어떤 토큰도 공백, 탭, 줄바꿈을 포함할 수 없다.
여러 줄의 텍스트를 읽어 그 안의 FORCAL 토큰을 인식하는 프로그램을 작성하라.
입력
입력은 여러 개의 블록으로 이루어진다. 각 블록은 여러 줄의 텍스트이며, 하나의 빈 줄로 끝난다.
출력
각 입력 줄에 대해 다음과 같이 출력한다. 건너뛰는 중이 아닌, 비어 있지 않은 줄은 왼쪽에서 오른쪽으로 훑으며, 인식한 각 FORCAL 토큰을 한 줄에 하나씩, 입력에 나타난 형태 그대로(대소문자 보존) 출력한다. FORCAL 토큰도, 주석도, 공백(스페이스나 탭)도 아닌 문자열을 만나는 즉시 TOKEN ERROR를 한 줄로 출력하고 현재 블록의 나머지를 건너뛴다. 모든 빈 줄, 그리고 이미 TOKEN ERROR가 발생한 블록에서 건너뛰게 된 모든 줄은 각각 하나의 빈 줄로 출력한다. 각 블록은 빈 줄로 끝나므로, 결과적으로 각 출력 블록 뒤에는 적어도 하나의 빈 줄이 놓인다.