의 상단에
%{
int yylex();
%}
를 추가 할 수 있습니다 쉽게하지 않은이 문제의보다 정교한 버전에 대한 답변입니다 선언을 추가하여 해결했습니다.
GNU Bison은 Flex와 함께 작동하는 재진입 파서 생성을 지원합니다 (Flex의 %option bison-bridge re-entrant
사용). Berkeley Yacc는 호환 가능한 구현을 제공합니다.
다음은이 두 가지 파서 생성기에 대해 선언되지 않은 yylex
을 해결하는 방법에 대한 가이드입니다. 재 참가자와
, 렉서는,
yylex
의 선언이로 변신 "들소는 브리지"
int yylex(YYSTYPE *yylval, void *scanner);
당신이 당신의 Yacc에 파서의 %{ ... %}
초기 헤더 섹션에서이 프로토 타입을 놓고가 발생하는 경우 Bison 또는 Berkeley Yacc와 파서를 컴파일하면 컴파일러에서 YYSTYPE
이 선언되지 않는다고 불평 할 것입니다.
YYSTYPE
에 대한 전달 선언을 만들 수는 없습니다. 버클리 Yacc에서는 유니온 태그가 없기 때문입니다. Bison에서는 typedef union YYSTYPE { ... } YYSTYPE
이지만 Berkeley Yacc에서는 typedef { ... } YYSTYPE
: 태그가 없습니다.
하지만 Berkeley Yacc에서는 파서의 세 번째 섹션에 선언을 넣으면이 호출의 범위가 입니다! 버클리 Yacc에 대해 다음 작품 그래서 :이 들소와 함께 발생하면
%{
/* includes, C defs */
%}
/* Yacc defs */
%%
/* Yacc grammar */
%%
int yylex(YYSTYPE *, void *);
/* code */
, 문제가 계속 다음 yylex
전화의 범위에는 프로토 타입이 없다.
이 작은 수정은 GNU 들소 작동한다 :이
%{
/* includes, C defs */
#if YYBISON
union YYSTYPE;
int yylex(union YYSTYPE *, void *);
#endif
%}
/* Yacc defs */
%%
/* Yacc grammar */
%%
int yylex(YYSTYPE *, void *);
/* code */
당신이 이동합니다.
출처
2014-08-05 14:27:11
Kaz
오류가 발생하지 않았습니다. 경고입니다. 거의 자명하지 않습니다. 실행중인 yacc의 버전은 최신 C99 표준이 아닌 이전 C89 표준 (또는 이전 버전)을 따르는 코드를 생성합니다. –