시작하기 전에
유닉스(UNIX®) 플랫폼에서 프로그램을 짜다 보면 일정한 형식을 따르는 텍스트나 구조를 자주 접한다. 프로그램에서 이러한 텍스트나 구조를 인식하려면 형식에 맞춰 텍스트를 분석하는 구문 분석기가 필요하다. 이 때 lex와 yacc을 사용하면 손쉽게 구문 분석 엔진을 만들 수 있다. 또한 이렇게 제작한 구문 분석 엔진을 프로그램에 접목하여 간단한 구성 파일을 분석하거나 심지어 자신만의 프로그래밍 언어까지 설계할 수 있다. 이 튜토리얼에서는 어휘 요소를 정의하는 방법, yacc 규칙을 작성하는 방법, 규칙 메커니즘을 사용해 다양한 구문 분석 엔진을 정의하고 제작하는 방법을 다룬다.
유닉스 플랫폼에서 텍스트를 판독하여 추출하는 방법은 많다. grep, awk, 펄 등 다양한 도구와 명령이 존재한다. 그런데 때로는 유연하면서도 구조적인 자료를 판독해 추출할 필요가 생긴다. 여기서 lex와 yacc이 진가를 발휘한다. awk, 펄, 셸, 기타 프로그래밍 언어 다수도 lex와 yacc으로 만든 구문 분석 엔진을 사용해 텍스트를 해석하고 이해하고 필요에 따라 자료 구조나 정보 구조에 맞게 변환한다.
lex는 어휘 분석기를 만들어 주는 도구로, 어휘 분석기는 주어진 텍스트에서 구조적인 방식으로 특정한 문자열을 식별한다. yacc은 문법 해석기를 만들어 주는 도구로, 일련의 어휘에서 처리를 위한 구조적인 형식(문법)을 인식한다.
이 튜토리얼에서는 먼저 계산기를 구현하면서 lex/yacc 사용법을 익힌다. 계산기 예제에서 lex와 yacc이 내놓는 정보를 좀 더 상세히 검토한 후 계산기를 확장하여 텍스트 구문 분석기를 만들어 본다.
이 튜토리얼에서 제공하는 예제를 실행하려면 다음 도구가 필요하다.
- lex: 대다수 유닉스 운영체제에서 표준으로 제공하는 도구다. GNU flex 도구도 같은 기능을 수행한다.
- yacc: 대다수 유닉스 운영체제에서 표준으로 제공하는 도구다. GNU bison 도구도 같은 기능을 수행한다.
- C 컴파일러: GNU CC를 포함하여 표준 C 컴파일러면 충분하다.
- make 도구: 예제 Makefile을 실행하려면 make 도구가 필요하다. make 도구와 Makefile을 사용하면 빌드가 쉬워진다.
GNU 도구는 GNU 웹 사이트나 지역 미러 사이트에서 내려 받는다.