yywrap에 대한 정의되지 않은 참조


81

Flex (Lexical Analyzer)를 사용하는 간단한 "언어"가 있습니다. 다음과 같습니다.

/* Just like UNIX wc */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}

%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n        { chars++; lines++; }
.         { chars++; }
%%

int main()
{
    yylex();
    printf("%8d%8d%8d\n", lines, words, chars);
}

를 실행하면 flex count.l오류나 경고없이 모두 정상적으로 진행됩니다. 그러면 a를 시도 할 cc lex.yy.c때이 오류가 발생합니다.

우분투 @ EEEPC : ~ / 바탕 화면 $ CC을 lex.yy.c
/tmp/ccwwkhvq.o : 기능에서 yylex': lex.yy.c:(.text+0x402): undefined reference to'으로 yywrap
: 함수에서 /tmp/ccwwkhvq.o input': lex.yy.c:(.text+0xe25): undefined reference to으로 yywrap'
collect2 : 신분증 1 개 종료 상태를 반환

뭐가 잘못 되었 니?

답변:


126

스캐너는 파일 끝에서이 함수를 호출하므로 다른 파일을 가리키고 그 내용을 계속 스캔 할 수 있습니다. 이것이 필요하지 않다면

%option noyywrap

스캐너 사양에서.

비활성화하는 yywrap 것이 확실히 최선의 선택이지만, 플렉스에서 제공 하는 라이브러리 (예 :) -lfl의 기본 yywrap()기능 을 사용하기 위해 와 링크 할 수도 있습니다 . Posix는 링커 플래그 와 함께 라이브러리를 사용할 수 있어야 하며 기본 OS X 설치는 해당 이름 만 제공합니다.fllibfl.a-ll


1
추가 할 '% option noyywrap'은 정확히 어디에 있습니까? 정의 섹션에서 또는 명령 줄에서?
yamex5

.l파일 시작 부분에 추가 하고 lex수락했습니다! 그게 최고의 장소인지 잘 모르겠습니다. 상관 없을지도 몰라요.
Deepak

9

내 자신의 yywrap ()을 정의하는 것을 선호합니다. C ++로 컴파일하고 있지만 요점은 분명합니다. 누군가가 여러 소스 파일로 컴파일러를 호출하면 목록이나 배열에 저장 한 다음 새 파일을 계속 사용할 수 있도록 각 파일의 끝에 yywrap ()이 호출됩니다.

int yywrap() {
   // open next reference or source file and start scanning
   if((yyin = compiler->getNextFile()) != NULL) {
      line = 0; // reset line counter for next source file
      return 0;
   }
   return 1;
}

3

flex는 항상 개발 라이브러리와 함께 설치되는 것은 아닙니다 (개발 도구이기 때문에 이상합니다). 라이브러리를 설치하면 삶이 더 좋아집니다.

Redhat 기본 시스템에서 :

yum -y install flex-devel
./configure && make

데비안 기반 시스템

sudo apt-get install libfl-dev

2

추종자를위한 메모로서, flex 2.6.3에는 libfl.a가 "일반적으로"yywrap을 정의하지만 특정 경우에는 정의하지 않는 버그가 있으므로 이것이 귀하의 flex 버전인지 확인하십시오. 문제와 관련이있을 수 있습니다.

https://github.com/westes/flex/issues/154


-1
int yywrap(){return(1);}

프로그램 끝에서이 코드를 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.