2014-07-25 3 views
0

파서를 생성하고 생성하는 데 사용하는 두 개의 파일이 있습니다.C 파일을 컴파일하는 중 오류가 발생했습니다. YaCC 및 Lex가 생성되었습니다.

파일 1 : drive.l

%{ 
#include<stdio.h> 
#include<string.h>  
#include"y.tab.h" 
/* 
#define START 1 
#define STOP 2 
#define FWD  3 
#define BACK 4 
#define UP  5 
#define DOWN 6 
#define TURN 7 
#define LEFT 8 
#define RIGHT 9 
#define SET  10 
#define VAR  11 
#define DEGREE 12 
#define EQUAL 13 
    */ 
struct VarTab{ 
    char VarName[50]; 
    int Id; 
    struct Vartab* next; 
    }; 
struct DegTab{ 
    int Deg,Min,Sec; 
    int Id; 
    struct DegTab* next; 
    }; 

struct VarTab* VHead=NULL; 
struct DegTab* DHead=NULL; 
int VTop = 0; 
int DTop =0; 
%} 

delim   [ \t] 
ign    {delim}+ 
var    [a-zA-Z]+[a-zA-Z0-9]+ 
num    [0-9] 
degree   {num}+((\.{num})|(\.{num}\.{num}))? 

%% 
{ign}   /**/ 
\n    {printf("\n");} 
START   {printf("<STR> ");return(START);} 
STOP   {printf("<STP> ");return(STOP);} 
FWD    {printf("<FWD> ");return(FWD);} 
BACK   {printf("<BAK> ");return(BACK);} 
UP    {printf("<UP> ");return(UP);} 
TURN   {printf("<TUR> ");return(TURN);} 
LEFT   {printf("<LFT> ");return(LEFT);} 
RIGHT   {printf("<RGT> ");return(RIGHT);} 
SET    {printf("<SET> ");return(SET);} 
=    {printf("<EQL> ");return(EQUAL);} 
{var}   {printf("<VARIABLE> ");RegVar();return(VAR);} 
{degree}  {printf("<DEG> ");RegDeg();return(DEGREE);} 
%% 


int RegVar(){ 
    /* 
    int i; 
    char var[50]; 
    char* rd = yytext; 
    for(i=0;i<=yyleng;i++){ 
     var[i-1] = *rd; 
     i++; 
     rd++; 
     } 
    var[i-1]='\0'; 
    VTop++; 
    struct VarTab* tmp; 
    tmp->Id = VTop; 
    strcpy(tmp->VarName,var); 
    tmp->next = NULL; 
    if(VHead==NULL) 
     VHead = tmp; 
    else{ 
     struct VarTab* parse = VHead; 
     while(parse->next!= NULL) 
      parse = parse->next; 
     parse->next = tmp; 

     }*/ 
    return VTop; 
    } 

int RegDeg(){ 
    /* 
    int D=0,M=0,S=0; 
    int st = 0; 
    int i; 
    char* rd; 
    for(i=1;i<=yyleng;i++){ 
     if(st==0){ 
      if(*rd != '.') 
       D = (D*10) + (*rd - 48); 
      else 
       st =1; 
      i++; 
      rd++; 
      } 
     if(st==1){ 
      if(*rd!='.') 
       M = (M*10) + (*rd -48); 
      else 
       st =2; 
       rd++; 
       i++; 
      } 
     if(st==2){ 
      if(i<=yyleng){ 
       S = (S*10) + (*rd -48); 
       rd++; 
       i++; 
      } 
      } 
     } 

     DTop++; 
     struct DegTab* tmp; 
     tmp->Deg = D; 
     tmp->Min = M; 
     tmp->Sec = S; 
     tmp->Id = DTop; 
     tmp->next = NULL; 
     if(DHead == NULL) 
      DHead = tmp; 
     else{ 
      struct DegTab* parse; 
      parse = DHead; 
      while(parse->next!=NULL) 
       parse = parse->next; 
      parse->next = tmp; 

      }*/ 

파일 2 : drive.y

%{ 
#include<stdio.h> 
#include<string.h>  

/*#define START 1 
#define STOP 2 
#define FWD  3 
#define BACK 4 
#define UP  5 
#define DOWN 6 
#define TURN 7 
#define LEFT 8 
#define RIGHT 9 
#define SET  10 
#define VAR  11 
#define DEGREE 12 
#define EQUAL 13 
*/ 
void yyerror(const char *str) 
{ 
     fprintf(stderr,"error: %s\n",str); 
} 

int yywrap() 
{ 
     return 1; 
} 

main() 
{ 
     yyparse(); 
} 



%} 

%token TURN START STOP FWD BACK UP DOWN LEFT RIGHT SET VAR EQUAL DEGREE 

%% 

command : 
      /*Empty*/ 
      | statuscode 
      | valuecode 
      | motioncode 
      ; 
statuscode: 
      START 
      { 
       printf("Started.\n"); 
      } 
      | STOP 
      { 
       prinf("Stoping.\n"); 
      } 
      | UP 
      { 
       prinf("Up phase.\n"); 
      } 
      | FWD 
      { 
       print("Forward.\n"); 
      } 
      | BACK 
      { 
       printf("Backward.\n"); 
      } 
      ; 
valuecode: 
      SET VAR EQUAL DEGREE 
      { 
       printf("Initialized a variable:\n"); 
      } 
      ; 
motioncode: 
      TURN direction 
      { 
       printf("OK \n"); 
      } 
      ; 
direction: 
      LEFT DEGREE 
      { 
       printf("Turning left with value - "); 
      } 
      | RIGHT DEGREE 
      { 
       printf("tunring Right with value -"); 
      } 
      | LEFT VAR 
      { 
       printf("Turning Left with Variable -"); 
      } 
      | RIGHT VAR 
      { 
       printf("Turning Right with Variable\m"); 
      } 
      ; 


%% 

나는 다음 명령을 사용하여 코드를 컴파일하기 위해 노력하고 수신 오류입니다.

$lex drive.l 
$ yacc -d drive.y 
$ cc lex.yy.c y.tab.c -o ex -lfl 
drive.y: In function ‘yyparse’: 
drive.y:98:24: warning: unknown escape sequence: '\m' [enabled by default] 
/tmp/ccMVHgWf.o: In function `yyparse': 
y.tab.c:(.text+0x35e): undefined reference to `prinf' 
y.tab.c:(.text+0x36c): undefined reference to `prinf' 
y.tab.c:(.text+0x37a): undefined reference to `print' 
collect2: error: ld returned 1 exit status 

오류를 찾을 수 없습니다. 누군가이 문제를 해결할 수 있다면 도움이 될 것입니다.

답변

1

적어도 3 오류를 쉽게 발견됩니다

  • 당신은 경고를 얻을 수 있도록 cc 명령 줄에서 -Wall를 사용하는 것을 잊었다 (또는 컴파일러는 경고를 가능하게하기 위해 사용하는 무엇이든)의

  • 한 당신 문자열 (98 행에있는 문자열)은 의미가없는 \m의 이스케이프 시퀀스를 갖습니다. 아마도 의미가 있습니다 \n

  • prinf (정의되지 않음)을 2 곳에서 호출하려고했습니다. 아마도 printf에 전화 할 예정이었습니다. 또한 정의되지 않은 print을 한 번 호출하려고 시도합니다.

+0

나는 prinf 자체를 호출하는 것이지만 프로토 타입을 추가하는 것을 잊어 버렸다. 감사. – BMC