Diff for /capa/capa51/pProj/capaFormula.y between versions 1.8 and 1.11

version 1.8, 2000/10/06 20:54:45 version 1.11, 2001/06/01 18:11:20
Line 77  int         FormulaParseOK=1; Line 77  int         FormulaParseOK=1;
 %token    F_NUMBER    V_ID      F_ID     EoI      F_ERROR   %token    F_NUMBER    V_ID      F_ID     EoI      F_ERROR 
 %left     F_PLUS      F_MINUS     %left     F_PLUS      F_MINUS   
 %left     F_MULT      F_DIV     F_MOD  %left     F_MULT      F_DIV     F_MOD
 %token    F_POW       F_LPAR    F_RPAR   F_COMMA   %token    F_POW
   %token    F_LPAR    F_RPAR   F_COMMA 
   
   
 %start    f_expr  %start    f_expr
Line 105  f_expr       : block Line 106  f_expr       : block
   
 block        : block F_PLUS   term                { $$ = symbols_op($1, $3, ADD_op);  }  block        : block F_PLUS   term                { $$ = symbols_op($1, $3, ADD_op);  }
              | block F_MINUS  term                { $$ = symbols_op($1, $3, SUB_op);  }               | block F_MINUS  term                { $$ = symbols_op($1, $3, SUB_op);  }
              | F_MINUS term                       { $$ = $2;               | F_MINUS block                       { $$ = negate($2); }
                                                     switch($2->s_type) {  
                                                       case I_VAR:      $$ = (Symbol *)capa_malloc(sizeof(Symbol),1);  
                                                              $$->s_type = I_CONSTANT;  
                                                       case I_CONSTANT: $$->s_int =    - $2->s_int; break;  
                                                       case R_VAR: $$ = (Symbol *)capa_malloc(sizeof(Symbol),1);  
                                                              $$->s_type = R_CONSTANT;  
                                                       case R_CONSTANT: $$->s_real =   (-1.0)*($2->s_real);   
                                                              break;  
                                                       case S_VAR:  
                                                       case S_CONSTANT: break;  
                                                       default:         break;  
                                                     }  
                                                   }  
              | term                               { $$ = $1; }               | term                               { $$ = $1; }
              | F_ERROR                            { FormulaParseOK = 0; FMLDBUG_PR1("[F_ERROR]\n"); return 0;}               | F_ERROR                            { FormulaParseOK = 0; FMLDBUG_PR1("[F_ERROR]\n"); return 0;}
              | error                              { FormulaParseOK = 0; FMLDBUG_PR1("[ERROR]\n"); return 0;  }               | error                              { FormulaParseOK = 0; FMLDBUG_PR1("[ERROR]\n"); return 0;  }
              ;               ;
   
 term         : term    F_MULT  basic_constr       { $$ = symbols_op($1, $3, MUL_op);  }  term         : term   F_MULT basic_constr         { $$ = symbols_op($1, $3, MUL_op);  }
              | term    F_DIV   basic_constr       { $$ = symbols_op($1, $3, DIV_op);  }               | term   F_MULT F_MINUS basic_constr { $$ = symbols_op($1, negate($4), MUL_op);  }
              | term    F_MOD   basic_constr       { $$ = symbols_op($1, $3, IDIV_op); }               | term   F_DIV  basic_constr         { $$ = symbols_op($1, $3, DIV_op);  }
                | term   F_DIV  F_MINUS basic_constr { $$ = symbols_op($1, negate($4), DIV_op);  }
                | term   F_MOD  basic_constr         { $$ = symbols_op($1, $3, IDIV_op); }
                | term   F_MOD  F_MINUS basic_constr { $$ = symbols_op($1, negate($4), IDIV_op); }
              | basic_constr                       { $$ = $1; }               | basic_constr                       { $$ = $1; }
              ;               ;
   
 basic_constr : basic_constr  F_POW   basic_item   { $$ = f_symbol_pow($1,$3);  basic_constr : basic_constr  F_POW   basic_item   { $$ = f_symbol_pow($1,$3);
                                                     FMLDBUG_PR3("[%.16g ^ %.16g] ",$1->s_real,$3->s_real);       }                                                      FMLDBUG_PR3("[%.16g ^ %.16g] ",$1->s_real,$3->s_real);       }
                | basic_constr F_POW F_MINUS basic_item   { $$ = f_symbol_pow($1,negate($4));
                                                       FMLDBUG_PR3("[%.16g ^ %.16g] ",$1->s_real,$4->s_real);       }
              | basic_item                         { $$ = $1; }               | basic_item                         { $$ = $1; }
              ;               ;
   
Line 183  fml_error(char *msg) Line 176  fml_error(char *msg)
       
 }  }
 /* ---------------------------------------------------- */  /* ---------------------------------------------------- */
   Symbol* negate(Symbol* symb) 
   {
     Symbol* temp=symb;
     switch(symb->s_type) {
     case I_VAR:      temp = (Symbol *)capa_malloc(sizeof(Symbol),1);
       temp->s_type = I_CONSTANT;
     case I_CONSTANT: temp->s_int = - symb->s_int; break;
     case R_VAR: temp = (Symbol *)capa_malloc(sizeof(Symbol),1);
       temp->s_type = R_CONSTANT;
     case R_CONSTANT: temp->s_real =   (-1.0)*(symb->s_real); 
       break;
     case S_VAR:
     case S_CONSTANT: break;
     default:         break;
     }
     return temp;
   }
   
 Symbol *  Symbol *
 f_symbol_pow(ap,bp) Symbol *ap; Symbol *bp;  f_symbol_pow(ap,bp) Symbol *ap; Symbol *bp;
 {  {
Line 190  f_symbol_pow(ap,bp) Symbol *ap; Symbol * Line 201  f_symbol_pow(ap,bp) Symbol *ap; Symbol *
   double  a, b;    double  a, b;
   int     error = 0;    int     error = 0;
       
   cp = NULL;    /*Even if we can't do it we need to return something*/
     cp = (Symbol *)capa_malloc(sizeof(Symbol),1);
     cp->s_type = R_CONSTANT;
     cp->s_real = 0.0;
   switch(ap->s_type) {    switch(ap->s_type) {
      case I_VAR:      a = (double)(ap->s_int);       case I_VAR:      a = (double)(ap->s_int);
          break;           break;
Line 224  f_symbol_pow(ap,bp) Symbol *ap; Symbol * Line 238  f_symbol_pow(ap,bp) Symbol *ap; Symbol *
     cp = (Symbol *)capa_malloc(sizeof(Symbol),1);      cp = (Symbol *)capa_malloc(sizeof(Symbol),1);
     cp->s_type = R_CONSTANT;      cp->s_type = R_CONSTANT;
     cp->s_real = pow(a,b);      cp->s_real = pow(a,b);
         } else {
       FormulaParseOK=0;
   }    }
   return (cp);    return (cp);
 }  }

Removed from v.1.8  
changed lines
  Added in v.1.11


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>