la fonction unary_exp();

la fonction unary_exp(); - C - Programmation

Marsh Posté le 25-05-2005 à 13:45:42    

Bonjour à tous,  
J'évolue en C avec "the C book"
Voilà le programme qui me calle, enfin il s'agit de la fonction unray_exp.
Ce que je ne comprend pas c pourkoi la ligne val = primary(); se trouve dans le switch?
Car toutes les autres fonctions, mult_expr et expr ont mis cette ligne (où on obtient un caractère) en dehors du switch.
 
voilà le code:

Code :
  1. /*
  2. * Recursive descent parser for simple C expressions.
  3. * Very little error checking.
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. int expr(void);
  8. int mul_exp(void);
  9. int unary_exp(void);
  10. int primary(void);
  11. main(){
  12.       int val;
  13.       for(;;){
  14.               printf("expression: " );
  15.               val = expr();
  16.               if(getchar() != '\n'){
  17.                       printf("error\n" );
  18.                       while(getchar() != '\n')
  19.                               ; /* NULL */
  20.               } else{
  21.                       printf("result is %d\n", val);
  22.               }
  23.       }
  24.       system("PAUSE" );
  25.       exit(EXIT_SUCCESS);
  26. }
  27. int
  28. expr(void){
  29.       int val, ch_in;
  30.       val = mul_exp();
  31.       for(;;){
  32.               switch(ch_in = getchar()){
  33.               default:
  34.                       ungetc(ch_in,stdin);
  35.                       return(val);
  36.               case '+':
  37.                       val = val + mul_exp();
  38.                       break;
  39.               case '-':
  40.                       val = val - mul_exp();
  41.                       break;
  42.               }
  43.       }
  44. }
  45. int
  46. mul_exp(void){
  47.       int val, ch_in;
  48.       val = unary_exp();
  49.       for(;;){
  50.               switch(ch_in = getchar()){
  51.               default:
  52.                       ungetc(ch_in, stdin);
  53.                       return(val);
  54.               case '*':
  55.                       val = val * unary_exp();
  56.                       break;
  57.               case '/':
  58.                       val = val / unary_exp();
  59.                       break;
  60.               case '%':
  61.                       val = val % unary_exp();
  62.                       break;
  63.               }
  64.       }
  65. }
  66. int
  67. unary_exp(void){
  68.       int val, ch_in;
  69.      
  70.       switch(ch_in = getchar()){
  71.       default:
  72.               ungetc(ch_in, stdin);
  73.               val = primary();
  74.               break;
  75.       case '+':
  76.               val = unary_exp();
  77.               break;
  78.       case '-':
  79.               val = -unary_exp();
  80.               break;
  81.       }
  82.       return(val);
  83. }
  84. int
  85. primary(void){
  86.       int val, ch_in;
  87.       ch_in = getchar();
  88.       if(ch_in >= '0' && ch_in <= '9'){
  89.               val = ch_in - '0';
  90.               goto out;
  91.       }
  92.       if(ch_in == '('){
  93.               val = expr();
  94.               getchar();      /* skip closing ')' */
  95.               goto out;
  96.       }
  97.       printf("error: primary read %d\n", ch_in);
  98.       exit(EXIT_FAILURE);
  99. out:
  100.       return(val);
  101. }


 
Une remarque cependant en le placant hors du switch le programme fonctionne mal.
Merci d'avance votre aide, surtout à Emmanuel :)

Reply

Marsh Posté le 25-05-2005 à 13:45:42   

Reply

Marsh Posté le 25-05-2005 à 14:12:09    

je passe là ... si encore tu disais quel est le problème et où est-il ...
 
et surtout, ne t'amuse pas à faire un CTRL+Z
le type de retour de main est int
if(ch_in >= '0' && ch_in <= '9') -> isdigit(ch_in)

Reply

Marsh Posté le 25-05-2005 à 15:14:48    

Regarde bien, chaque fonction appelle la fonction suivante avant et pendant le switch, sauf la fonction unary_exp qui appelle uniquement dans le switch.
 
Pourquoi ? Tout simplement car les fonctions précédentes servent à gérer des opérations binaires (ayant quelque chose à gauche et à droite de l'opérateur) alors que unary_exp gère une opération unaire (uniquement à droite de l'opérateur).

Reply

Marsh Posté le 25-05-2005 à 21:03:37    

Merci je comprends

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed