2012-01-16 3 views
2

나는 렉스를 배우려고 노력하고있다. 나는 파일을 읽고 토큰을 인식하고자하는 간단한 프로그램을 가지고있다.렉스 - 토큰을 인식

지금은 오류가 발생합니다. 토큰을 인식하기 위해 파일에 한 줄 이상이 있기 때문에 문제가 있다고 생각하십니까? 여기

Keyword: fd 
Illegal: 3x00 
Keyword: bk 
Keyword: setc 
Number: 100 
Keyword: int 

내 프로그램입니다 : 여기

내가 달성하기 위해 노력하고 출력 파일 여기

fd 3x00 
bk 
setc 100 
int xy3 fd 10 rt 90 

입니다

여기
%{ 

/* Comment */ 

#include <stdio.h> 
#include <stdlib.h> 

%} 
%% 
fd      {printf("Keyword: fd\n");} 
[0-9][a-z][0-9]  {printf("Illegal: 3x00\n");} 
bk      {printf("Keyword: bk\n");} 
setc[0-9]    {printf("Keyword: setc\n Number: %s\n", yytext);} 
int     {printf("Keyword: int\n");} 
xy3     {printf("ID: xy3\n");} 
fd[0-9]    {printf("Keyword: fd\n Number %s\n", yytext);} 
rt[0-9]    {printf("Keyword: rt \n Number %s\n", yytext);} 
%% 

main(argc, argv) 
int argc; 
char** argv; 
{ 
    if(argc > 1) 
    { 

     FILE *file; 
     file = fopen(argv[1], "r"); 
     if(!file) 
     { 
      fprintf(stderr, "Could not open %s \n", argv[1]); 
      exit(1); 
     } 

     yyin = file; 

    } 

    yylex(); 

} 

나는 오류입니다 내가 컴파일하려고 할 때 :

In function 'yylex': 
miniStarLogo.l:11: error: expected expression before '[' token 
miniStarLogo.l:11: error: 'a' undeclared (first use in this function) 
miniStarLogo.l:11: error: (Each undeclared identifier is reported only once 
miniStarLogo.l:11: error: for each function it appears in.) 
miniStarLogo.l:11: error: expected ';' before '{' token 
miniStarLogo.l:13: error: expected expression before '[' token 
miniStarLogo.l:13: error: expected ';' before '{' token 

은 내 printf 문의 오류입니까? 는

내가 flex (2.5.35)와 gcc (4.6.1)와 맥 OS X (10.7.2)에 코드의 복사본을 컴파일
+0

컴파일러 오류 인 것 같습니다. 컴파일이나 실행에 문제가 있습니까? 그것은 컴파일 및 실행 나를 위해, 비록 당신이 원하는 출력되지 않습니다. – Kevin

+0

내가 컴파일하려고하면 오류가 발생합니다. 나는 cc lex.yy.c -o myprog -ll을 시도했다. –

+0

어떻게 컴파일하고 실행할 수 있었습니까? 어떤 명령을 사용 했습니까? –

답변

1

, 나는 C 컴파일러로부터받은 유일한 불만은하고 있었다 감사 비 프로토 타입 정의가 main()인데, 그 이유는 항상 해당 경고가 활성화되어 있고 yyunput() defined but not used (귀하의 잘못이 아님)에 대한 언급 때문입니다. 당신은 C를 배우고 있기 때문에

, 당신은 단지 표기법을 사용한다 :

int main(int argc, char **argv) 
{ 
    ... 
} 

또는 동등합니다.

는 또한 DOS 형식 (CRLF 라인 엔딩)에 miniStarLogo.l 파일을 변환, 두 flexgcc는 결과를 확인 할 듯 - 다소 놀랍게도. 귀하의 컴퓨터에서는 그렇지 않을 수도 있습니다. 내가 테스트 데이터의 코드를 실행하면

, 내가 가지고 :

Keyword: fd 
Illegal: 3x00 
0 
Keyword: bk 

setc 100 
Keyword: int 
ID: xy3 
Keyword: fd 
10 rt 90 

그래서, 당신은 지금까지 당신이 내 계산으로 할 필요가 어디 해제되지 않습니다.


혼란이 내 명령을 통치합니다. 나는 변두리 사기 -

$ flex miniStarLogo.l 
$ gcc -Wall -Wextra -O3 -g -o lex.yy lex.yy.c -lfl 
miniStarLogo.l:22: warning: return type defaults to ‘int’ 
miniStarLogo.l: In function ‘main’: 
miniStarLogo.l:42: warning: control reaches end of non-void function 
miniStarLogo.l: At top level: 
lex.yy.c:1114: warning: ‘yyunput’ defined but not used 
$ ./lex.yy <<EOF 
> fd 3x00 
> bk 
> setc 100 
> int xy3 fd 10 rt 90 
> EOF 
Keyword: fd 
Illegal: 3x00 
0 
Keyword: bk 

setc 100 
Keyword: int 
ID: xy3 
Keyword: fd 
10 rt 90 
$ 

는 (OK : 처음으로 주위에, 나는 rmk이고, rmk lex.yy LDLIBS=-lfl를 실행

나는 (흠, 그것은 GCC 4.2.1보다는 4.6.1이었다), 그러나 사용 make의 변형이며 디렉토리의 컴파일 규칙에 표시된 명령 줄을 사용하지만 컴파일을 다시 실행하여 위와 똑같은 오류 메시지를 올바르게 표시합니다.

패턴을 확장하여 ' 하나 이상의 '숫자는 [0-9] 대신 [0-9]+이됩니다. 일치하지 않는 문자를 다루는 규칙을 살펴 봐야 할 수도 있습니다. 개인적으로, 개행 직전에 공백을 피하기 위해 큰 고통을 겪었으므로, 내 기준을 충족시키기 위해 인쇄 서식을 강화해야 할 것입니다. 그러나, 그것은 프로그램을 실행시키는 것에 밀접하지 않습니다.

또한 파일을 DOS에서 Unix 줄 끝으로 변환해야하는 경우 컴퓨터에있는 경우 가장 쉬운 방법은 dos2unix입니다. 그렇지 않으면, 사용

$ tr -d '\015' <miniStarLogo.l> x 
$ od -c x 
0000000 % { \r \n \r \n / *  C o m m e n t 
... 
0001560 \n } \r \n 
0001564 
$ mv x miniStarLogo.l 
$ 

나는 조심스럽게 vim:set fileformat=dos를 사용하여 캐리지 리턴을 추가; vim:set fileformat=unix으로 실행 취소 할 수도 있습니다. 이것은 유닉스이므로 TMTOWTDI (Perl의 모토를 넘어서는 한 가지 방법이 있습니다.) 그리고 Perl을 사용하려고하지도 않습니다.

+0

퍼티를 사용하여 유닉스 서버에 로그인하고 있습니다. 나는 또한 안전한 포탄을 시도했다. 왜 내 컴퓨터에서 작동하지 않는지 모르겠다. –

+0

안녕하세요, 드디어 받았습니다. 모든 도움에 감사드립니다. 당신은 훌륭했습니다. 나는 vim에 파일을 만들어서 내가 왜 문제가 있는지 알지 못한다. 나는 그것을 실행 시키려고했지만 print f가 숫자를 표시하는 코드를 주석 처리해야했습니다. 로드 할 파일도 있습니다. 고맙습니다 –