= Principles of Programming Languages = HW #1 3/27/2002 == < 문 제 > == ※ 입력된 문장들이 제시된 문법(grammar)에 맞는지 판단하는 Recursive Descent Parsing 기법을 이용한 파서(parser)를 작성하시오. == < 일 정 > == * 제출일: 4월 10일(A반) * 데모 날짜: 4월 10일(A반) * 제출물 * Internal/external documentations * 프로그램 소스코드 및 실행파일이 든 디스켓 == < 문 법 > == {{{~cpp | | | | | | | | | | → any decimal numbers → any names conforming C identifier → ? → < → > → == → : → = → ; → + → - → * → / → ( → ) }}} == < 세부 사항 > == * 입력: INPUT.TXT로 이름지어진 텍스트 파일 * 출력: 주어진 문법에 따라 INPUT.TXT에 저장되어 있는 문장을 분석한다. 파싱(parsing)되는 중간과정을 <처리 예>와 같이 출력하고, 문법에 적합하면 “Yes,” 입력된 문장이 적합하지 않으면 오류 메시지와 “No”를 출력한다. * 처리 조건 * 각 파싱(parsing) 함수는 리턴하기 직전에 해당 non-terminal이 검색되었음을 알리는 메시지를 출력하여야 한다. {{{~cpp 예) void expression(void) { ... printf(" parsed.\n"); } }}} * 의 경우에는 찾아진 lexeme을 함께 출력한다. {{{~cpp 예) void identifier(void) { ... printf(": %s parsed.\n",token_string); } }}} * 입력 스트림에서 ASCII 코드로 32 이하인 것은 모든 white-space로 간주하며, white-space는 각 token을 구별하는 용도 이외에는 모두 무시한다. * 어휘분석기(lexical analyzer)의 소스코드는 정수 변수 next_token, 문자열 변수 token_string, 함수 lexical()을 포함하여야 한다. 함수 lexical()은 입력 스트림을 분석하여 하나의 lexeme을 찾아낸 뒤, 그것의 token type을 next_token에 대입하고, lexeme 문자열을 token_string에 저장하는 함수이다. * 문장이 문법에 적합하지 않으면 관련 오류 메시지를 출력한다. 그 다음 오류를 발생시킨 lexeme을 제거 또는 첨가한 후, 파싱을 재개한다. 예를 들어, x = a + + b일 경우, “+” 연산자가 한 개가 더 존재하므로 오류 메시지를 출력한다. 그 다음, “+”기호를 제거한 후 파싱을 계속한다. * 기타 구현 시 요구되는 세부 사항은 직접 결정하고, internal document에 기술한다. * 데모 시 디스켓에 실행파일을 미리 준비한다(데모 시에 컴파일하는 경우는 감점처리함). == < 처리 예 > == * 입력: target = operand1 + operand2 * 428 * 출력 {{{~cpp : target parsed. parsed. : operand1 parsed. parsed. parsed. parsed. : operand2 parsed. parsed. parsed. : 428 parsed. parsed. parsed. parsed. parsed. parsed. parsed. parsed. parsed. Yes!! }}} * 입력: target = operand1 + + operand2 * 출력 {{{~cpp : target parsed. parsed. : operand1 parsed. parsed. parsed. parsed. ERROR : plus-operator : operand2 parsed. parsed. parsed. parsed. parsed. parsed. parsed. parsed. No!! }}} * 입력: target = op1 > op2 ? op3 : op4 * op5 * 출력 {{{~cpp : target parsed. parsed. : op1 parsed. parsed. parsed. : op2 parsed. parsed. : op3 parsed. parsed. : op4 parsed parsed. parsed. parsed. : op5 parsed. parsed. parsed. parsed. parsed. parsed. parsed. parsed. YES!! }}} * 입력: target = op1 > op2 ? op3 * 출력 {{{~cpp : target parsed. parsed. : op1 parsed. parsed. parsed. : op2 parsed. parsed. : op3 parsed. ERROR : colon parsed. parsed. parsed. parsed. parsed. parsed. parsed. NO!! }}} ---- ["ProgrammingLanguageClass"]