2012-11-11 2 views
0

Heloo EveryBody, 나는 lex 언어로 된 간단한 코드를 가지고 있으며 "bison -d hello.l"로 실행하려고 시도하지만 오류가 발생합니다! 다음 오류가 발생합니다.간단한 Lex 예제에 어떤 문제가 있습니까?

누군가 내가 내가 뭘 잘못했는지 알려 줄 수 있습니까?

bison -d hello.l 

hello.l:4.1-5: syntax error, unexpected identifier 

코드 : 당신은 들소와 (F) 렉스 입력 파일을 컴파일하려고

%{ 
#include <math.h> 
%} 
DIGIT [0-9] 
ID  [a-z][a-z0-9]* 

%% 

    {DIGIT}+ { 
       printf("An integer: %s (%d)\n", yytext, 
         atoi(yytext)); 
       } 

    {DIGIT}+"."{DIGIT}*  { 
       printf("A float: %s (%g)\n", yytext, 
         atof(yytext)); 
       } 

    if|then|begin|end|procedure|function  { 
       printf("A keyword: %s\n", yytext); 
       } 

    {ID}  printf("An identifier: %s\n", yytext); 

    "+"|"-"|"*"|"/" printf("An operator: %s\n", yytext); 

    "{"[\^{}}\n]*"}"  /* eat up one-line comments */ 

    [ \t\n]+   /* eat up whitespace */ 

    .   printf("Unrecognized character: %s\n", yytext); 

    %% 

    int main(int argc, char **argv) 
     { 
     ++argv, --argc; /* skip over program name */ 
     if (argc > 0) 
       yyin = fopen(argv[0], "r"); 
     else 
       yyin = stdin; 

     yylex(); 
     } 

답변

1

. yylex 또는 flex를 사용하십시오.

편집이 : OK, 더 문제가 (난 당신의 코드를 컴파일하려고) : 그들의 앞에 어떤 공백으로

  1. 규칙은 라인의 처음부터 시작해야합니다 (에서 공백을 제거 라인 9, 14 등의 시작 ).

  2. 파일의 시작 부분에 %option noyywrap을 추가하십시오.

  3. flex filename.l으로 파일을 컴파일하십시오.

  4. 그런 다음 생성 된 .c 파일을 컴파일하십시오. 추가 헤더가 필요 없습니다.

+0

나는 CONST.H 파일을 생성하기 위해 bison을 사용합니다! lex.yy.c 파일을 컴파일하려고 할 때 "선언되지 않음 (이 함수에서 처음 사용)"과 같은 오류가 발생합니다! 웹에서 검색 할 때 Const.h 파일이 필요하다는 것을 알고 있으므로 해당 파일을 생성하고 싶습니다. 어떻게 할 수 있습니까? – Cert

+0

* 무엇이 * 선언되지 않았 음을 알면 매우 유용 할 것입니다. – JohnB

+0

9 C : \ Users \ Majid \ Desktop \ F \ hello.l'DIGIT '이 선언되지 않았습니다 (이 기능에서 처음 사용) – Cert

관련 문제