home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / CataniaB / teach-act / laboratorio / lab-26-4-99 / interprete.c < prev    next >
C/C++ Source or Header  |  1999-05-25  |  2KB  |  147 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define NOFSYM 8
  4.  
  5. typedef enum {NOTREC = -2,
  6. PLUS =0, MINUS, TIMES, DIV, MOD, EQUAL, LPAR, RPAR, NUMBER} symkind;
  7.  
  8. typedef struct {symkind kind;int value;} symbol;
  9.  
  10. const char tab[NOFSYM] = {'+','-','*','/','%','=','(',')'};
  11.  
  12. symbol getsym();
  13.  
  14. static symbol sym;
  15.  
  16.  
  17. int inte(void);
  18. int inteE(void);
  19. int inteT(void);
  20. int inteF(void);
  21.  
  22. main()
  23.  
  24. {int val;
  25.     printf("\n\nIl valore dell'espressione e': %d \n\n",inte());
  26. return 0;
  27. }
  28.  
  29.  
  30. int inte(void)
  31. {
  32.     int val;
  33.     sym =getsym();
  34.     val =inteE();
  35.     if (sym.kind==EQUAL)
  36.         return val;
  37.     else
  38.     {
  39.         printf("errore in inte");
  40.         exit(EXIT_FAILURE);
  41.     }
  42. }
  43.  
  44.  
  45. int inteE(void)
  46. {
  47.     int val;
  48.     val = inteT();
  49.     if (sym.kind==PLUS)
  50.     {    
  51.         sym=getsym();
  52.         val = val +inteE();
  53.     }
  54.     else if (sym.kind ==MINUS)
  55.     {    
  56.         sym=getsym();
  57.         val = val -inteE();
  58.     }
  59.     return val;
  60. }
  61.  
  62.  
  63. int inteT(void)
  64. {
  65.     int val;
  66.     val=inteF();
  67.     if (sym.kind == TIMES)
  68.     {    
  69.         sym=getsym();
  70.         val = val * inteT();
  71.     }
  72.     else if (sym.kind == DIV) 
  73.     {    sym=getsym();
  74.         val = val / inteT();
  75.     }
  76.     return val;
  77. }
  78.  
  79.  
  80. int inteF(void)
  81. {
  82.     int val;
  83.     switch (sym.kind)
  84.     {
  85.         case LPAR:    
  86.             sym=getsym();
  87.             val = inteE();
  88.             if (sym.kind !=RPAR)
  89.             {
  90.                 printf("errore in inteF");
  91.                 exit(EXIT_FAILURE);
  92.                 }
  93.             sym=getsym();
  94.             break;
  95.         case MINUS: 
  96.             sym=getsym();
  97.             val = -1 * inteF();
  98.             break;
  99.         case NUMBER:
  100.             val=sym.value; 
  101.             sym = getsym();
  102.             break;
  103.         default :
  104.             printf("errore in inteF");
  105.             exit(EXIT_FAILURE);
  106.             break;
  107.     }
  108.     return val;
  109. }
  110.  
  111.  
  112.  
  113. symbol getsym()
  114. {
  115.     symbol s;
  116.     static char c = ' ';
  117.  
  118.     s.kind = NOTREC;
  119.  
  120.     while (c != EOF && (c == ' ' || c == '\n' || c == '\t'))
  121.         c = getchar(); 
  122.  
  123.     if (c == EOF)
  124.     {
  125.         s.kind =EOF;
  126.         return s;
  127.     }
  128.  
  129.     if (c >= '0' && c <= '9')
  130.     {
  131.         s.kind =NUMBER;
  132.         s.value =0;
  133.         do
  134.             s.value = s.value * 10 + c - '0';
  135.         while ((c = getchar()) != EOF && c >= '0' && c <= '9');
  136.     }
  137.     else
  138.     {
  139.         symkind i;
  140.         for (i = PLUS; i <= RPAR; i++)
  141.             if (tab[i] == c)
  142.                 s.kind = i;
  143.         c= getchar();
  144.     }
  145.     return s;
  146. }
  147.