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':
‘으로 yywrap
lex.yy.c:(.text+0x402): undefined reference to
: 함수에서 /tmp/ccwwkhvq.oinput':
으로 yywrap’
lex.yy.c:(.text+0xe25): undefined reference to
collect2 : 신분증 1 개 종료 상태를 반환
뭐가 잘못 되었 니?
답변
스캐너는 파일 끝에서이 함수를 호출하므로 다른 파일을 가리키고 그 내용을 계속 스캔 할 수 있습니다. 이것이 필요하지 않다면
%option noyywrap
스캐너 사양에서.
비활성화하는 yywrap
것이 확실히 최선의 선택이지만, 플렉스에서 제공 하는 라이브러리 (예 🙂 -lfl
의 기본 yywrap()
기능 을 사용하기 위해 와 링크 할 수도 있습니다 . Posix는 링커 플래그 와 함께 라이브러리를 사용할 수 있어야 하며 기본 OS X 설치는 해당 이름 만 제공합니다.fl
libfl.a
-ll
답변
내 자신의 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;
}
답변
flex는 항상 개발 라이브러리와 함께 설치되는 것은 아닙니다 (개발 도구이기 때문에 이상합니다). 라이브러리를 설치하면 삶이 더 좋아집니다.
Redhat 기본 시스템에서 :
yum -y install flex-devel
./configure && make
데비안 기반 시스템
sudo apt-get install libfl-dev
답변
추종자를위한 메모로서, flex 2.6.3에는 libfl.a가 “일반적으로”yywrap을 정의하지만 특정 경우에는 정의하지 않는 버그가 있으므로 이것이 귀하의 flex 버전인지 확인하십시오. 문제와 관련이있을 수 있습니다.
https://github.com/westes/flex/issues/154
답변
int yywrap(){return(1);}
프로그램 끝에서이 코드를 사용하십시오.