/* Compilation d'expressions arithme'tiques on genere du code a utiliser avec etf.lex qui reconnait les differents terminaux NUMBER: nombre entier, PARO PARF: parentheses, MULT PLUS multiplication addition , POINTV point virgule, ID identificateur (ne sert pas ici) */ %{ struct info { char *expr; char *derive; }; #define YYSTYPE struct info %} %token NUMBER PLUS POINTV MULT PARO PARF PARAM VAR EGAL MOINS DIV %% statement : expression POINTV { printf("dérivée %s\n", $1.derive);} ; expression : expression PLUS terme { if (strcmp($1.expr,"0")==0) $$ = $3; else if (strcmp($3.expr,"0")==0) $$ = $1; else { $$.expr = (char *) malloc(strlen($1.expr)+strlen($3.expr)+2); strcpy($$.expr,$1.expr); strcat($$.expr,"+"); strcat($$.expr,$3.expr); $$.derive = (char *) malloc(strlen($1.derive)+ strlen($3.derive)+2); if (strcmp($1.derive,"0")==0) strcpy($$.derive,$3.derive); else if (strcmp($3.derive,"0")==0) strcpy($$.derive,$1.derive); else { strcpy($$.derive,$1.derive); strcat($$.derive,"+"); strcat($$.derive,$3.derive); } } printf("EXPRESSION expr %s, derive %s\n", $$.expr, $$.derive); } | expression MOINS terme { if (strcmp($1.expr,"0")==0) { $$.expr = (char *) malloc(strlen($3.expr)+2); strcpy($$.expr,"-"); strcat($$.expr,$3.expr); } else if (strcmp($3.expr,"0")==0) $$ = $1; else { $$.expr = (char *) malloc(strlen($1.expr)+strlen($3.expr)+2); strcpy($$.expr,$1.expr); strcat($$.expr,"-"); strcat($$.expr,$3.expr); $$.derive = (char *) malloc(strlen($1.derive)+ strlen($3.derive)+2); if (strcmp($1.derive,"0")==0) { strcpy($$.derive,"-"); strcat($$.derive,$3.derive); } else if (strcmp($3.derive,"0")==0) strcpy($$.derive,$1.derive); else { strcpy($$.derive,$1.derive); strcat($$.derive,"-"); strcat($$.derive,$3.derive); } } printf("EXPRESSION expr %s, derive %s\n", $$.expr, $$.derive); } | terme {$$ = $1;} ; terme : terme MULT facteur { if (strcmp($1.expr,"1")==0) $$ = $3; else if (strcmp($3.expr,"1")==0) $$ = $1; else if (strcmp($1.expr,"0")==0 || strcmp($3.expr,"0")==0){ strcpy($$.expr,"0"); strcpy($$.derive,"0"); } else { $$.expr = (char *) malloc(strlen($1.expr)+strlen($3.expr)+2); strcpy($$.expr,$1.expr); strcat($$.expr,"*"); strcat($$.expr,$3.expr); $$.derive = (char *) malloc(strlen($1.expr)*strlen($3.derive)+ strlen($3.expr)*strlen($1.derive)+ 4); if (strcmp($3.derive,"1")==0) { strcpy($$.derive,$1.expr); if (strcmp($1.derive,"1")==0) { strcat($$.derive,"+"); strcat($$.derive,$3.expr); } else if (strcmp($1.derive,"0")!=0) { strcat($$.derive,"+"); strcat($$.derive,$1.derive); strcat($$.derive,"*"); strcat($$.derive,$3.expr); } } else if (strcmp($3.derive,"0")!=0) { strcpy($$.derive,$1.expr); strcat($$.derive,"*"); strcat($$.derive,$3.derive); if (strcmp($1.derive,"1")==0) { strcat($$.derive,"+"); strcat($$.derive,$3.expr); } else if (strcmp($1.derive,"0")!=0) { strcat($$.derive,"+"); strcat($$.derive,$1.derive); strcat($$.derive,"*"); strcat($$.derive,$3.expr); } } else if (strcmp($1.derive,"1")==0) { strcpy($$.derive,$3.expr); } else if (strcmp($1.derive,"0")!=0) { strcpy($$.derive,$1.derive); strcat($$.derive,"*"); strcat($$.derive,$3.expr); } else strcpy($$.derive,"0"); } printf("TERME expr %s, derive %s\n", $$.expr, $$.derive); } | facteur {$$ = $1;} ; facteur : PARAM { $1.expr = (char *) malloc(2); strcpy($1.expr,yytext); $1.derive = (char *) malloc(2); strcpy($1.derive,"0"); printf("PARAM expr %s, derive %s\n", $1.expr, $1.derive); $$ = $1;} | VAR { $1.expr = (char *) malloc(2); strcpy($1.expr,yytext); $1.derive = (char *) malloc(2); strcpy($1.derive,"1"); printf("VAR expr %s, derive %s\n", $1.expr, $1.derive); $$ = $1;} | PARO expression PARF { $$.expr = (char *) malloc(strlen($2.expr)+3); strcpy($$.expr,"("); strcat($$.expr,$2.expr); strcat($$.expr,")"); $$.derive = (char *) malloc(strlen($2.derive)+3); strcpy($$.derive,"("); strcat($$.derive,$2.derive); strcat($$.derive,")"); printf("(exp) expr %s, derive %s\n", $$.expr, $$.derive);} ; %% #include "lex.yy.c" main() { yyparse(); } yyerror(char *s) { printf ("%s\n",s); }