2017-12-09 21 views
1

나는 들소 코드 헤더 썼다 :헤더 파일을 Bison의 .tab.h에 저장하는 방법?

%{ 
#include "foo.h" 
%} 

을 그리고 헤더에 '푸'라는 이름의 구조체를 정의했다. Bison에서 토큰 유형으로 사용하고 싶습니다.

%define api.value.type union 
%token <Foo*> bar 

은 그 때 나는 bison.tab.h 파일을 생성 -d 옵션을 사용합니다.

bison -d bison.y 

는 그러나 bison.tab.h에는 #include foo.h이없고, 노조 YYSTYPE을 정의하는 구조체 푸를 사용합니다. error: ‘Foo’ does not name a type

헤더 bison.tab.h에서 파일이나이 경우 다른 솔루션을 포함 할 수있는 방법이 있나요 :이 프로그램을 컴파일 할 때

//bison.tab.h 
union YYSTPE { 
    Foo* bar; 
    ... 
}; 

그것은 오류가 발생?

+0

bison.y를 공유 할 수 있습니까? –

+0

'% {'와'%}'사이에 넣은 것은 Bison에 의해 처리되지 않고, 생성 된 C 또는 C++ 소스 파일에 바로 복사됩니다. 그런 식으로 헤더 파일에 Bison 특정 명령문을 넣을 수는 없습니다. –

+0

"* 그러나 bison.tab.h에 #include foo.h가 없습니다. *"<= 귀하의'foo.h'와'bison.y'를 보여주십시오. 왜냐하면 현재 주어진 것으로부터 이것이 완료된 방법입니다. – dhke

답변

1

.c 및 .h 파일 (%union의 정의 이전)에 표시되는 포함 항목의 경우 %code requires { ... }을 사용해야합니다. %{ ... }은 코드를 .c 파일에만 삽입합니다.

다양한 %code 옵션에 대한 자세한 내용은 "Prologue Alternatives" chapter of the Bison docs을 참조하십시오.