Je suis nouveau dans les programmes lex et yacc. J'ai essayé d'écrire un programme yacc qui prend en entrée une expression arithmétique et donne une notation postfixée en sortie. La grammaire que j'utilise est: exp: exp + term | exp - terme | terme terme: terme * facteur | terme/facteur | facteur facteur: numProgramme yacc pour convertir l'expression arithmétique en postfix
Ceci est mon code lex:
%{
extern int yylval;
#include "y.tab.h"
%}
%%
[0-9]+ {yylval = atoi(yytext);return INTEGER;}
[ \t\n] /* skip whitespace */
. {return *yytext;}
%%
int yywrap(void) {
return 1;
}
Voici mon programme yacc:
%{
#include<stdio.h>
%}
%token INTEGER
%left '+' '-'
%left '*' '/'
%%
E: E '+' T {printf("+");}
| E '-' T {printf("-");}
| T
;
T: T '*' F {printf("*");}
| T '/' F {printf("/");}
| F
;
F: '(' E ')'
| INTEGER {printf("%d",yylval);}
;
%%
int main(){
yyparse();
}
int yyerror (char *msg) {
return printf ("error YACC: %s\n", msg);
}
Mais ce code est la compilation sortie correctly.But n'est pas correcte si « + 'ou' - 'sont utilisés dans l'expression Par exemple entrée: 2 + 3 sortie: 23 (au lieu de 23+) S'il vous plaît aidez-moi à trouver l'erreur dans le code. Merci.
Votre grammaire n'accepte qu'une seule expression. Si vous fermez l'entrée après l'expression, elle s'imprimera correctement. – rici
Notez également que vous n'avez pas besoin du T non-terminal car vous spécifiez la même chose en utilisant la priorité de l'opérateur. – user3344003