살아가는 이야기

Bison error: unknown type name 본문

컴퓨터, 풀어그림

Bison error: unknown type name

우균 2016. 11. 10. 08:45

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에서 "타입이름"을 사용하기 때문에 당연하지만 원인을 모를 때에는 난감하기 그지없다. 역시 프로그래밍에서는 순서가 중요하다.


Comments