2017-04-10 13 views
0

나는 컴파일 이론을 공부하고 있고 flex로 작업하는 방법과 몇 가지 문제가있다. flex - 진입 점 없음

나는 거기에 다음과 같은 데이터와 렉스 파일을 만든 :

%% 
"hello"  printf("GOODBYE"); 
. ; 
%% 

이 내가 생각할 수있는 가장 간단한 하나입니다. 내가 올바르게 이해하면 hello 토큰을 만날 때마다 GOODBYE를 출력하고 다른 모든 것은 무시합니다.

나는이 lex 파일에서 C 파일을 생성하기 위해 flex를 사용했는데, 이제이 C 코드를 컴파일하여이 문법에 대한 어휘 분석기를 얻어야합니다.

문제는 생성 된 C 코드에 진입 점이 없다는 것입니다. 컴파일되지 않습니다. .lex 파일이 올바르지 않습니까? 내가 뭔가를 오해하고 있니?

+0

자신 만의'main' 함수를 제공해야합니다. –

+0

main 함수를 정의해야합니다. [이 튜토리얼] (http://alumni.cs.ucr.edu/~lgao/teaching/flex.html) – LPs

+0

주요 기능을 제공하는 한 가지 방법은 flex의 런타임 라이브러리 libfl과 링크하는 것입니다. (사실 libfl과 연결되는 유일한 이유입니다.) –

답변

2

두 번째 파일 %% 다음에 자신의 main()을 선언하거나 .c를 다른 .c 파일과 연결하여 main()을 선언해야합니다.

%% 
"hello"  printf("GOODBYE"); 
. ; 
%% 

int main() 
{ 
    yylex(); 
    return 0; 
} 
+0

아, 알겠습니다. 이제 작동 중입니다. 친절하게 고마워요. –

1

문제는 생성 된 C 코드 엔트리 포인트가 없다는 것이다. 컴파일되지 않습니다.

아니요, 아니요, 링크입니다.

내 .lex 파일이 올바르지 않습니까?

번호

오전 뭔가 오해?

예.

"진입 점"은 링커의 말하기 기능 main()입니다. Flex는 어휘 분석기 기능만을위한 코드를 생성하므로 완전한 프로그램을 원한다면 main을 별도로 제공해야합니다. 대부분의 경우 렉서 기능은 렉서 기능 만이 플렉스에서 필요하거나 필요로하는 대형 프로그램의 컨텍스트에서 사용되기 때문에 적절합니다.

어휘 분석 규칙에 따라 프로그램에서 수행 할 작업이 모두 필요한 경우 0이 아닌 값을 반환 할 때까지 어휘 분석 함수 yylex()을 반복적으로 호출하는 주 기능이 필요합니다. 직접 작성할 수도 있지만 할 필요는 없습니다. flex는 런타임 라이브러리 libfl과 함께 제공됩니다.이 라이브러리의 목적은 정확히 main을 제공하는 것입니다. 컴파일/링크 명령 끝에 -lfl을 추가하면됩니다.