Diff for /capa/capa51/pProj/capaFormula.y between versions 1.1 and 1.9

version 1.1, 1999/09/28 21:26:21 version 1.9, 2000/10/23 16:22:57
Line 1 Line 1
   /* formula parser
      Copyright (C) 1992-2000 Michigan State University
   
      The CAPA system is free software; you can redistribute it and/or
      modify it under the terms of the GNU General Public License as
      published by the Free Software Foundation; either version 2 of the
      License, or (at your option) any later version.
   
      The CAPA system is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      General Public License for more details.
   
      You should have received a copy of the GNU General Public
      License along with the CAPA system; see the file COPYING.  If not,
      write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      Boston, MA 02111-1307, USA.
   
      As a special exception, you have permission to link this program
      with the TtH/TtM library and distribute executables, as long as you
      follow the requirements of the GNU GPL in regard to all of the
      software in the executable aside from TtH/TtM.
   */
   
 /* ====================================================== */  /* ====================================================== */
 /*      capaFormula.y  created by Isaac Tsai @ Feb 1999   */  /*      capaFormula.y  created by Isaac Tsai @ Feb 1999   */
 /*      copyrighted by Isaac Tsai    1999                 */  
 /*  TODO: checking user inputs   2/27/99      IT          */  /*  TODO: checking user inputs   2/27/99      IT          */
 /* ====================================================== */  /* ====================================================== */
 %{  %{
Line 12 Line 34
 #include "capaParser.h"   /* _symbol structure def */  #include "capaParser.h"   /* _symbol structure def */
 #include "capaCommon.h"  #include "capaCommon.h"
 #include "capaFunction.h"  #include "capaFunction.h"
   #ifdef  YYSTYPE
   #undef  YYSTYPE
   #endif
   #define YYSTYPE  Symbol_p
 #include "capaToken.h"  #include "capaToken.h"
   
 #ifdef __hpux  #ifdef __hpux
Line 36 Line 62
 #define IDIV_op         5  #define IDIV_op         5
 #define NOT_DEFINED_op  9  #define NOT_DEFINED_op  9
   
 #ifdef  YYSTYPE  
 #undef  YYSTYPE  
 #endif  
 #define YYSTYPE  Symbol_p  
   
 /* =============================================================== */  /* =============================================================== */
   
 extern      int         Func_idx;  extern      int         Func_idx;
 extern      Symbol      FuncStack[MAX_FUNC_NEST];  extern      Symbol      FuncStack[MAX_FUNC_NEST];
   void   fml_error(char *msg);
 double      FormulaVal;  double      FormulaVal;
 int         FormulaParseOK=1;  int         FormulaParseOK=1;
   
Line 55  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 83  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 block                       { $$ = negate($2); }
              | 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 126  basic_item   : F_ID F_LPAR F_RPAR Line 155  basic_item   : F_ID F_LPAR F_RPAR
                 $$ = do_function(tmp, $3->s_argc, $3->s_argp);                  $$ = do_function(tmp, $3->s_argc, $3->s_argp);
                 capa_mfree(FuncStack[Func_idx].s_name);                  capa_mfree(FuncStack[Func_idx].s_name);
                 free_arglist($3->s_argp);                  free_arglist($3->s_argp);
    $3->s_argp=NULL;
                                                       }                                                        }
                                                   }                                                    }
              | V_ID                               { FMLDBUG_PR3("[V %s = %.16g] ",$1->s_name, $1->s_real);               | V_ID                               { FMLDBUG_PR3("[V %s = %.16g] ",$1->s_name, $1->s_real);
                                                     $$ = $1;                                                      $$ = $1;
                                                   }                                                    }
              | F_MINUS  basic_item                { $$ = $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;  
                                                     }  
                                                   }  
              | F_PLUS  basic_item                 { $$ = $2; }               | F_PLUS  basic_item                 { $$ = $2; }
              | F_NUMBER                           { FMLDBUG_PR2("[F %.16g] ",$1->s_real);               | F_NUMBER                           { FMLDBUG_PR2("[F %.16g] ",$1->s_real);
                                                     $$ = $1;                                                      $$ = $1;
Line 160  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 194  f_symbol_pow(ap,bp) Symbol *ap; Symbol * Line 228  f_symbol_pow(ap,bp) Symbol *ap; Symbol *
      case S_CONSTANT:        case S_CONSTANT: 
      default:         error = 1; break;       default:         error = 1; break;
   }    }
     if ((!(((double)((int)b)) == b)) && (a < 0.0)) {
       error = 1;
     }
   if (!error) {    if (!error) {
     cp = (Symbol *)capa_malloc(sizeof(Symbol),1);      cp = (Symbol *)capa_malloc(sizeof(Symbol),1);
     cp->s_type = R_CONSTANT;      cp->s_type = R_CONSTANT;

Removed from v.1.1  
changed lines
  Added in v.1.9


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