2015-11-27 5 views
0

Итак, я делаю очень простую программу Flex и Bison для решения математических выражений, но почему-то вывод всегда 0. Я слежу за книгой «Flex и Bison» от O «Рейли, мой код почти такой же, как в книге, но все равно не работает. Был у него в течение некоторого времени, помощь будет оценена.Простой математический анализатор Flex & Bison

Вот файл .l:

 %{ 
    #include "simple.tab.h" 
/* enum yytokentype { 
     NUMBER = 258, 
     ADD, 
     SUB, 
     MUL, 
     DIV, 
     ABS, 
     EOL 
    }; 
    int yylval; */ 
%} 
%% 
"+" { return ADD; } 
"-" { return SUB; } 
"*" { return MUL; } 
"/" { return DIV; } 
"|" { return ABS; } 
[0-9]+ { yylval = atoi(yytext); return NUMBER; } 
\n { return EOL; } 
[ \t] { /* ignore whitespace */ } 
. { printf("Mystery character %c\n", *yytext); } 
%% 

И .y файл:

%{ 
    #include<cstdio> 
    int yylex(); 
    int yyerror(const char *s); 
%} 

/* token declaration */ 
%token NUMBER 
%token ADD SUB MUL DIV ABS 
%token EOL 

%% 

calclist: 
| calclist exp EOL { printf("= %d\n",$1); } 
; 
exp: factor 
| exp ADD factor { $$=$1+$3; } 
| exp SUB factor { $$=$1-$3; } 
; 
factor: term 
| factor MUL term { $$=$1*$3; } 
| factor DIV term { $$=$1/$3; } 
; 
term: NUMBER 
| ABS term { $$=$2 >=0 ? $2 : -$2; } 
; 

%% 
int main(int argc, char **argv) 
{ 
    yyparse(); 
} 
int yyerror(const char *s) 
{ 
    fprintf(stderr,"error: %s\n",s); 
} 

Выход:

$ bison -d simple.y 
    $ flex stuff.l 
    $ g++ simple.tab.c lex.yy.c -lfl -o simple 
    $ ./simple 
    1+2 
    = 0 
    1*2 
    = 0 
    1/1 
    = 0 
    4/2 
    = 0 
    25/5 
    = 0 
    |1 
    = 0 

Кроме того, если кто-то может предложить лучший и простой книгу , это было бы оценено.

ответ

2

В этом заявлении, $1 это значение calclist:

| calclist exp EOL { printf("= %d\n",$1); } 

То, что вы хотите, это значение exp:

| calclist exp EOL { printf("= %d\n",$2); } 
+0

ой блин. так очевидно. Благодаря! – Kshitij

+0

Рад, что это помогает. Если он решает вашу проблему, вы можете принять ответ, спасибо. – fjardon

Смежные вопросы