살아가는 이야기
Bison error: unknown type name 본문
Bison이라는 컴파일러 제작 도구가 있다. Yacc의 GNU 버전인데 -dy 옵션을 주면 Yacc과 같은 방식으로 동작한다. 그런데 사용자 정의 타입에 대해 다음과 같은 오류가 나오는 경우가 있다.
error: unknown type name 타입이름
여기서 "타입이름"은 사용자가 나름 정의한 타입으로서 통상 헤더파일에 정의되어 있다. 이 헤더파일을 type.h라고 하자. 분명 type.h에서 "타입이름"을 정의했고 이것을 다음과 같이 Bison 입력 파일에 명시했는데도 이런 오류가 나오는 경우가 있다.
%{ // Bison input
#include <stdio.h>
#include "type.h"
%}
원인은 Bison이 아니고 Flex 입력이다. 위와 같이 정의해 둔 경우에 bison -dy 옵션으로 y.tab.h를 자동 생성하게 되는데, 이 파일을 통상 Flex 입력 파일에서 다음과 같이 #include한다.
%{ // Flex input
#include <stdlib.h>
#include "y.tab.h"
#include "type.h"
%}
이 때 다음과 같이 "y.tab.h" 전에 "type.h"를 #include하도록 바꾸어야 위와 같은 오류가 발생하지 않는다.
%{ // Flex input
#include <stdlib.h>
#include "type.h"
#include "y.tab.h"
%}
생각해 보면 y.tab.h에서 "타입이름"을 사용하기 때문에 당연하지만 원인을 모를 때에는 난감하기 그지없다. 역시 프로그래밍에서는 순서가 중요하다.