Je suis nouveau à l'utilisation de flex et bison J'ai mis en place une calculatrice simple. J'essaie de déterminer si une entrée est une phrase dans la grammaire.flex et bison comment déterminer si la phrase fait partie de la grammaire
Par exemple si j'entre: a = 2; b = 3; imprimer a + b;
Il retourne: « a = 2; b = 3, l'impression a + b, est une phrase »
En ce moment, il le fera en fait la calculatrice mais je ne se soucient pas du calcul réel que je viens vouloir savoir si l'entrée est une phrase dans la grammaire.
Je ne sais pas trop comment faire. Toute aide ou conseil serait apprécié.
mon code flex est:
%{
#include "y.tab.h"
#include <stdlib.h>
void yyerror(char *);
%}
%%
[a-z] {
yylval = *yytext - 'a';
return VARIABLE;
}
[0-9]+ {
yylval = atoi(yytext);
return INTEGER;
}
[-()+=/^*;] { return *yytext; }
"print" return PRINT;
[ \t] ; /* skip whitespace */
. yyerror("invalid characters.");
%%
int yywrap(void) {
return 1;
}
Mon code Bison est:
%{
#include <stdio.h>
#include <math.h>
void yyerror(char *);
int yylex(void);
char *in;
int sym[26];
%}
%token INTEGER VARIABLE PRINT
%left '+' '-'
%left '*' '/'
%right '^'
%%
program:
program statement { }
| /* NULL */ { }
;
statement:
';' { $$ = ';'; }
| expression ';' { $$ = $1; }
| VARIABLE '=' expression ';' { sym[$1] = $3; }
| PRINT expression ';' { printf("%d\n", $2); }
;
expression:
INTEGER
| VARIABLE { $$ = sym[$1]; }
| expression '+' expression { $$ = $1 + $3; }
| expression '-' expression { $$ = $1 - $3; }
| expression '*' expression { $$ = $1 * $3; }
| expression '/' expression { $$ = $1/$3; }
| expression '^' expression { $$ = pow($1,$3); }
| '(' expression ')' { $$ = $2; }
| '-' expression { $$ = -$2; }
;
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
int main(void) {
while (1) {
yyparse();
}
}