컴파일러는 C 언어 같은 고급언어로 작성된 프로그램을 어셈블리 언어나 기계어 같은 저급언어 프로그램으로 번역하는 소프트웨어이다.
Yacc와 Lex라는 오픈소스를 활용하여 C언어 컴파일러를 제작하였다. 컴파일러는 LR파싱이라는 기법을 사용하여 문법을 파싱하는데, LR파싱에 대한 내용도 이해를 해야 한다.
Yacc, Lex
Recursive-descent parsing기법을 활용한 프로그램이다. 또한 이 프로그램에선 구조체를 활용하여 정수와 실수를 구분한다.
hw2는 LR파싱에 대한 이해를 돕기 위한 프로그램이다. LR파싱을 하려면 action 테이블 go_to 테이블 그리고 문법이 필요하다. 스택을 하나 정의를 하고 스택에 yyParse를 통해 읽어낸 값을 넣는다 그리고 스택 탑과 action 테이블의 관계를 비교한 후 Reduce인지 Shift인지 판단 후 해당 동작에 맞게 수행하면 된다.
hw3는 yacc와 lex를 사용하여 C언어 파싱 프로그램을 제작하는 것이다. 이를 하기 위해서는 C언어 문법에 대한 정확한 이해가 필요하다 해당 과제에서는 단순히 C언어 문법에 맞는지 틀리는지만 판단을 한다.
hw4는 신텍스분석기에 대한 내용이다 참고로 64비트의 기계에서 수행하기 때문에 YYSTYPE_IS_DECLARED 라던지 YYSTYPE등을 선언 하였다.
hw5는 시멘틱분석기에 대한 내용이다 신텍스분석기를 돌린 후 해당 문법들이 시멘틱에 적합한지 판단하고 허용되는 연산이면 경고메시지를 내보내고 처리해주고 허용 안되는 연산이면 에러 메시지를 내보내고 작업을 종료한다.
hw6는 코드 생성기에 대한 내용이다 말 그대로 신텍스분석기 및 시멘틱분석기를 돌린 후 나오는 심볼 테이블에 대해서 어셈블러 코드를 생성하는 것이다. 또한 이를 가볍게 테스트 하기 위한 인터프리터 프로그램도 포함 되어 있다.
C언어 컴파일러를 만들기 위해서는 C언어의 문법을 정확히 알아야 한다. 또한 C언어만의 여러 특성(전방참조 등)을 정확히 이해해야 완벽한 컴파일러 제작이 가능하다