2013-05-08 4 views
1

간단한 계산기 용 파서를 만들고 싶지만 간단한 입력에 대해 오류가 발생합니다. 플렉스 파일이Bison, 간단한 계산기 프로그램

%{ 
#include "exp.tab.h" 
#include <string.h> 
%} 

blanks   [ \t\n]+ 


%% 

{blanks}  { /* ignore */ } 
[0-9]+   {yylval= strtol(yytext, NULL, 10); 
return(NUMB);} 

%% 

들소 파일처럼 보인다는 다음과 같습니다

123 + 12 

입력

를 들어

%{ 
#include <stdio.h> 
%} 


%token NUMB 


%left '+' 


%% 

exp: 
NUMB    { $$ = $1;   } 
| exp '+' exp  { $$ = $1 + $3;  } 

%% 
int yyerror(char *s) { 
printf("yyerror : %s\n",s); 
} 

int main(void) { 
yyparse(); 
} 

내가 얻을 오류 message.Why는 이런 일이?

+0

태그 지정할 때주의하십시오. Flex는 Adobe/Apache 프레임 워크에 사용됩니다. Gnu-flex는 어휘 분석기에 사용됩니다. – JeffryHouser

+1

@ Reboog711,'flex-lexer'는 실제로 ... – Charles

+0

@Charles Thanks; 나는 몰랐다. 방금 flex-lexer 태그에 대해 언급하기 위해 "Flex Tag Wiki"를 수정했습니다. http://stackoverflow.com/tags/flex/info – JeffryHouser

답변

0

귀하의 렉서에게는 '+' 토큰과 일치/반환하는 규칙이 없습니다. 끝에 추가하십시오 :

. { return *yytext; } /* any other single character returns as itself */ 

텍스트가 규칙과 일치하지 않으면 기본 렉서 작업은 인쇄하여 건너 뛰는 것입니다. 그래서 그들은 구문 오류를 일으키는 입력으로 123 12을 가져 오기 때문에 구문 분석기에서 오류가 발생합니다.