2017-04-04 19 views
-1

의 출력과 컴파일 및 간단한 BNF 계산기를 예제를 실행하는 동안 나는 다음과 같은 문제가 발생했습니다플렉스 및 들소 간단한 BNF 계산기 일정 나는 존 레빈에 의해 오라일리 <em>플렉스 & 들소</em> 책을 통해하고 있어요 제로

> ./fb1-5 
2 + 3 * 4 
= 0 
2 * 3 + 4 
= 0 
c 
Mystery Character c 
error: syntax error 

프로그램/DIV/덧셈/뺄셈 식 항상 제로의 정 출력 될 MULT에 따라서, 비 수치 입력 종료를 인식하지만 정수 입력을 보인다.

O'Reilly의 장을 여러 번 읽었을뿐만 아니라 스택 오버플로에 대해서도 비슷한 질문을했습니다. 나는 또한 내 실수를 찾으려고 http://dinosaur.compilertools.net/bison/bison_5.html을 통해 광업을 진행 중입니다. 겉으로보기에는 초보적인 장애물에 직면하여 당혹스러워하는 것을 주셔서 감사합니다. 나는 컴파일러를 통한 나의 여정을 시작하고있다. 모든 조언을 부탁드립니다.

플렉스 (fb1-5.L) :

%{ 
#include "fb1-5.tab.h" /*forward declaration - not yet compiled*/ 
%} 

%% 
"+" {return ADD;} 
"-" {return SUB;} 
"*" {return MUL;} 
"/" {return DIV;} 
[0-9]+ { yylval = atoi(yytext); return NUMBER;} 
\n { return EOL;} 
[ \t] { } /*ignore whitespace*/ 
. { printf("Mystery Character %c\n", *yytext);} 
%% 

들소 (fb1-5.y) :

%{ 
#include <stdio.h> 
%} 

/*declare tokens*/ 
%token NUMBER 
%token ADD 
%token SUB 
%token MUL 
%token DIV 
%token ABS 
%token EOL 

/*BNF tree*/ 
%% 
calclist: /*nothing - matches at beginning of input*/ 
    | calclist exp EOL { printf("= %d\n", $1);} 
    ; 

exp: factor /*default $$ = $1*/ 
    | exp ADD factor { $$ = $1 + $3;} 
    | exp SUB factor { $$ = $1 - $3;} 
    ; 

factor: term /*default $$=$1*/ 
    | factor MUL term { $$ = $1 * $3;} 
    | factor DIV term { $$ = $1/$3;} 
    ; 

term: NUMBER /*default $$=$1*/ 
    | ABS term { $$ = $2 >= 0 ? $2 : - $2;} 
    ; 
%% 

int main(int argc, char **argv) 
{ 
    yyparse(); 
    return 0; 
} 

yyerror(char *s) 
{ 
    fprintf(stderr, "error: %s\n", s); 
} 

는 메이크 :

fb1-5: fb1-5.l fb1-5.y 
    bison -d fb1-5.y 
    flex fb1-5.l 
    gcc -o [email protected] fb1-5.tab.c lex.yy.c -lfl 

clean: 
    rm -f core fb1-5.tab.h fb1-5.tab.c lex.yy.c fb1-5 

답변

0
printf("= %d\n", $1); 

는이어야한다

printf("= %d\n", $2); 

exp은 해당 제작의 오른쪽에있는 두 번째 것입니다.