home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_04 / 1104072a < prev    next >
Text File  |  1992-12-23  |  2KB  |  99 lines

  1. /* parser.c */
  2. /* Adapted from The C++ Programming Language by Bjarne Stroustrup
  3.    Modified by    P.J. LaBrocca
  4. */
  5.  
  6. #include "mixed.h"
  7. #include "mixcalc.h"
  8. #include <stdio.h>
  9.  
  10. mixed_t number_value;
  11.  
  12. mixed_t expr(void)
  13. {
  14.     mixed_t left = term();
  15.     mixed_t tmp;
  16.  
  17.     for(;;)
  18.         switch(curr_tok) {
  19.             case PLUS:
  20.                 curr_tok = gettok();
  21.                 tmp = term();
  22.                 left = mix_add( &left, &tmp );
  23.                 break;
  24.             case MINUS:
  25.                 curr_tok = gettok();
  26.                 tmp = term();
  27.                 left = mix_sub( &left, &tmp );
  28.                 break;
  29.             default:
  30.                 return left;
  31.         }
  32. }
  33.  
  34. mixed_t term()
  35. {
  36.     mixed_t d;
  37.     mixed_t left = prim();
  38.  
  39.     for(;;)
  40.         switch(curr_tok) {
  41.             case MUL:
  42.                 curr_tok = gettok();
  43.                 d = prim();
  44.                 left = mix_mul( &left, &d );
  45.                 break;
  46.             case DIV:
  47.                 curr_tok = gettok();
  48.                 d = prim();
  49.                 if( (d.whole == 0) && (d.num == 0) ) {
  50.                       fprintf( stderr, "Division by 0\n");
  51.                       fflush( stdin );
  52.                       longjmp( startup, 1 );
  53.                 }
  54.                 left = mix_divide( &left, &d );
  55.                 break;
  56.             default:
  57.                 return left;
  58.         }
  59. }
  60.  
  61. mixed_t prim()
  62. {
  63.     struct name *n;
  64.     mixed_t e;
  65.  
  66.     switch(curr_tok) {
  67.         case NUMBER:
  68.             number_value = *M;
  69.             curr_tok = gettok();
  70.             return number_value;
  71.         case MINUS:
  72.             curr_tok = gettok();
  73.             e = prim();
  74.             mix_neg( &e );
  75.             return e;
  76.         case PLUS:
  77.             curr_tok = gettok();
  78.             return prim();
  79.  
  80.         case LP:
  81.             curr_tok = gettok();
  82.             e = expr();
  83.             if(curr_tok != RP) {
  84.                   fprintf( stderr, "')' expected\n");
  85.                   fflush( stdin );
  86.                   longjmp( startup, 1 );
  87.             }
  88.             curr_tok = gettok();
  89.             return e;
  90.         case END:
  91.             return * mix_init( &e, 1, 0, 1 );
  92.         default:
  93.               fprintf( stderr, "primary expected, found %c\n", curr_tok);
  94.               fflush( stdin );
  95.               longjmp( startup, 1 );
  96.     }
  97. }
  98.  
  99.