소개글
이 프로그램은 C & C++로 작성된 것이 아닌, 리눅스상의 Lex & Yacc을 이용한 것임을 밝힙니다.
Lex & Yacc의 버전은 flex와 bison을 기준으로 합니다.
입력으로 C언어의 일부 기능만을 사용하는 Mini C를 받습니다. 그 후 토큰 분리 및 트리 출력을 합니다. 마지막으로 연산 결과를 출력합니다.
연산가능한 연산자는 아래와 같습니다.
"else, if, int, return, void, while, exit;, ==, !=, <, >, <=, >=, !, &&, ||, ++, --, +=, -=, *=, /=, %=, =, -, +, *, /, %"
## 포함 자료 ##
프로그램소스 + 예제소스 + 문서 + 결과화면 이미지
컴파일 실행환경
◇ 실행 방법
- flex와 bison을 기준으로 함.
① 제출된 압축파일의 압축을 풀어 모든 파일을 리눅스 상의 같은 Directory에 위치 시킨다.
② Linux/Unix shell command상에서 make 명령어를 수행시켜 ‘MiniC’라는 실행 파일을 생성한다.
③ 아래와 같은 방법으로 Mini C Interpreter에 동봉된 Mini C 예제 코드를 입력으로 준다.(단, read()함수의 이용 시 ‘<’ 명령 대신 직접 Console을 통해 소스 코드를 입력해야 한다. – Yacc Spec. 참조)
## 실행명령 =>‘./MiniC < 파일명.mc’##
④ 입력으로 주어진 Mini C 예제 코드에 대한 Parse Tree와 그 실행 결과가 출력된다.
본문내용
◇ Spec. for Lex
- 수업 교재 부록 A에 정의된 Mini C의 Keyword 및 연산자 중 ‘const’ Keyword를 제외한 모든 Keyword 및 연산자를 구현 하였음. (기타 구현과 관련된 세부 사항은 소스 코드의 주석을 참조)
◇ Spec. for Yacc
- 배열 표현과, 변수 선언 시 초기화, ‘const’ Keyword 관련 부분을 제외한 모든 부분(함수 구현)을 구현 하였으며 수업 교재에서 제시된 코드를 참조하여 새롭게 재작성 하였음. 한가지 언급 할 것은 Yacc 소스 코드의 컴파일 시 shift/reduce 충돌이 하나 존재하는 것으로 나오는데 이는 selection_stmt의 IF문과 IF ELSE사이에서 발생하는 것으로, 교재에 제시된 모범 예제의 같은 기능을 수행하는 부분에서도 이와 같은 충돌이 존재하고 있다. 그 충돌을 수정하려 하였으나 굳이 하지 않아도 default Rule의 적용 등으로 자체 해결되고 있었고 그 수정에 드는 코드 처리 등 효율 면에서 떨어지기에 굳이 하지 않았다. 교재 모범 예제의 작성자도 같은 의도에서 굳이 수정하지 않았을 것으로 판단된다. (기타 구현과 관련된 세부 사항은 소스 코드의 주석을 참조)
※ 제약조건1 : 함수 구현시 main의 상단에 위치해야지만 입력 프로그램 실행이 가능하다. 아래에 존재할 경우 파싱트리까지는 출력이 되지만, main에서 함수의 존재 여부를 알 수 없어서 호출이 불가능하다.
※ 제약조건2 : 사용자의 입력을 받는 read()가 포함된 입력 프로그램을 ‘$ ./MiniC < 파일명.mc’ 으로 실행을 할 경우, 파이프의 연결로 인해 입력 값을 Console로부터 받을 수 없게 된다. 따라서 read()가 제 기능을 수행하게 하려면 ‘$ ./MiniC’ 으로 실행을 하여 입력을 Console로부터 받게 한 후, 소스코드를 직접 Typing 해줘야 한다. (참고: Console 입력 시, MiniC의 수행 후 모든 소스코드를 입력한 다음 ‘exit;’를 쳐야 parsing이 시작된다)
압축파일 내 파일목록
Makefile
lex.l
factorial.mc
structFile.h
readme.txt
yacc.y
result.jpg
Mini C Interpreter 보고서.doc
참고 자료
없음