File:  [LON-CAPA] / capa / capa51 / pProj / capaFormula.y
Revision 1.2: download - view: text, annotated - select for diffs
Tue Jun 27 18:28:48 2000 UTC (23 years, 11 months ago) by albertel
Branches: MAIN
CVS tags: HEAD
- new improved makefiles
- fixed random_*
- added ability to use tth fore tex().

    1: 
    2: /* ====================================================== */
    3: /*      capaFormula.y  created by Isaac Tsai @ Feb 1999   */
    4: /*      copyrighted by Isaac Tsai    1999                 */
    5: /*  TODO: checking user inputs   2/27/99      IT          */
    6: /* ====================================================== */
    7: %{
    8: #include <stdio.h>
    9: #include <ctype.h>
   10: #include <string.h>
   11: #include <math.h>
   12: #include "capaParser.h"   /* _symbol structure def */
   13: #include "capaCommon.h"
   14: #include "capaFunction.h"
   15: #ifdef  YYSTYPE
   16: #undef  YYSTYPE
   17: #endif
   18: #define YYSTYPE  Symbol_p
   19: #include "capaToken.h"
   20: 
   21: #ifdef __hpux
   22: #include <stdlib.h>
   23: #include <alloca.h>
   24: #endif
   25: 
   26: #ifdef   FML_DBUG
   27: #define  FMLDBUG_PR1(xx)        { printf(xx);    fflush(stdout); }
   28: #define  FMLDBUG_PR2(xx,yy)     { printf(xx,yy); fflush(stdout); }
   29: #define  FMLDBUG_PR3(xx,yy,zz)  { printf(xx,yy,zz); fflush(stdout); }
   30: #else
   31: #define  FMLDBUG_PR1(xx)        { }
   32: #define  FMLDBUG_PR2(xx,yy)     { }
   33: #define  FMLDBUG_PR3(xx,yy,zz)  { }
   34: #endif
   35: 
   36: #define ADD_op          1
   37: #define SUB_op          2
   38: #define MUL_op          3
   39: #define DIV_op          4
   40: #define IDIV_op         5
   41: #define NOT_DEFINED_op  9
   42: 
   43: 
   44: /* =============================================================== */
   45: 
   46: extern      int         Func_idx;
   47: extern      Symbol      FuncStack[MAX_FUNC_NEST];
   48: void   fml_error(char *msg);
   49: double      FormulaVal;
   50: int         FormulaParseOK=1;
   51: 
   52: %}
   53: 
   54: 
   55: %token    F_NUMBER    V_ID      F_ID     EoI      F_ERROR 
   56: %left     F_PLUS      F_MINUS   
   57: %left     F_MULT      F_DIV     F_MOD
   58: %token    F_POW       F_LPAR    F_RPAR   F_COMMA 
   59: 
   60: 
   61: %start    f_expr
   62: 
   63: 
   64: %%
   65: 
   66: f_expr       : block                             { switch($1->s_type) {
   67:                                                       case I_VAR:
   68:                                                       case I_CONSTANT: FormulaVal = (double)($1->s_int);
   69:                                                           break;
   70:                                                       case R_VAR: 
   71:                                                       case R_CONSTANT: FormulaVal = $1->s_real;
   72:                                                           break;
   73:                                                       case S_VAR:
   74:                                                       case S_CONSTANT: FormulaParseOK = 0;
   75:                                                           break;
   76:                                                       default:         FormulaParseOK = 0;
   77:                                                           break;
   78:                                                     }
   79:                                                     capa_mfree((char *)$1);
   80:                                                     FMLDBUG_PR1("[f_expr <= block ]\n");
   81:                                                   }
   82:              ;
   83: 
   84: block        : block F_PLUS   term                { $$ = symbols_op($1, $3, ADD_op);  }
   85:              | block F_MINUS  term                { $$ = symbols_op($1, $3, SUB_op);  }
   86:              | term                               { $$ = $1; }
   87:              | F_ERROR                            { FormulaParseOK = 0; FMLDBUG_PR1("[F_ERROR]\n"); return 0;}
   88:              | error                              { FormulaParseOK = 0; FMLDBUG_PR1("[ERROR]\n"); return 0;  }
   89:              ;
   90: 
   91: term         : term    F_MULT  basic_constr       { $$ = symbols_op($1, $3, MUL_op);  }
   92:              | term    F_DIV   basic_constr       { $$ = symbols_op($1, $3, DIV_op);  }
   93:              | term    F_MOD   basic_constr       { $$ = symbols_op($1, $3, IDIV_op); }
   94:              | basic_constr                       { $$ = $1; }
   95:              ;
   96: 
   97: basic_constr : basic_constr  F_POW   basic_item   { $$ = f_symbol_pow($1,$3);
   98:                                                     FMLDBUG_PR3("[%.16g ^ %.16g] ",$1->s_real,$3->s_real);       }
   99:              | basic_item                         { $$ = $1; }
  100:              ;
  101: 
  102: arg_list     : arg_list F_COMMA  block            { $$ = $1;
  103:                                                     $$->s_argc++;
  104:                                                     $$->s_argp = addto_arglist($1->s_argp, $3);
  105:                                                   }
  106:              | block                              { $$ = $1;
  107:                                                     $$->s_argc = 1;
  108:                                                     $$->s_argp = new_arglist($1);
  109:                                                   }
  110:              ;
  111: 
  112: basic_item   : F_ID F_LPAR F_RPAR                 {  int tmp;
  113:                                          
  114:                                                      Func_idx--;
  115:                                                      if(Func_idx >= 0 ) {
  116:                                                        tmp = match_function(FuncStack[Func_idx].s_name,0);
  117:                                                        $$ = do_function(tmp, 0, NULL );
  118:                                                        capa_mfree(FuncStack[Func_idx].s_name);
  119:                                                      }
  120:                                                   }
  121:              | F_ID F_LPAR arg_list  F_RPAR       {  int  tmp;
  122:                                          
  123:                                                      Func_idx--;
  124:                                                      if(Func_idx >= 0 ) {
  125:                                                         tmp = match_function(FuncStack[Func_idx].s_name,$3->s_argc);
  126: 					                $$ = do_function(tmp, $3->s_argc, $3->s_argp);
  127: 					                capa_mfree(FuncStack[Func_idx].s_name);
  128: 					                free_arglist($3->s_argp);
  129:                                                       }
  130:                                                   }
  131:              | V_ID                               { FMLDBUG_PR3("[V %s = %.16g] ",$1->s_name, $1->s_real);
  132:                                                     $$ = $1;
  133:                                                   }
  134:              | F_MINUS  basic_item                { $$ = $2;
  135:                                                     switch($2->s_type) {
  136:                                                       case I_VAR:      $$ = (Symbol *)capa_malloc(sizeof(Symbol),1);
  137:                                                              $$->s_type = I_CONSTANT;
  138:                                                       case I_CONSTANT: $$->s_int =    - $2->s_int; break;
  139:                                                       case R_VAR: $$ = (Symbol *)capa_malloc(sizeof(Symbol),1);
  140:                                                              $$->s_type = R_CONSTANT;
  141:                                                       case R_CONSTANT: $$->s_real =   (-1.0)*($2->s_real); 
  142:                                                              break;
  143:                                                       case S_VAR:
  144:                                                       case S_CONSTANT: break;
  145:                                                       default:         break;
  146:                                                     }
  147:                                                   }
  148:              | F_PLUS  basic_item                 { $$ = $2; }
  149:              | F_NUMBER                           { FMLDBUG_PR2("[F %.16g] ",$1->s_real);
  150:                                                     $$ = $1;
  151:                                                   }
  152:              | F_LPAR   block  F_RPAR             { $$ = $2; }
  153:              ;
  154: %%
  155: void
  156: fml_error(char *msg)
  157: {
  158:   FormulaParseOK=0;
  159:   printf("Error Parsing: %s\n",msg);
  160:   
  161: }
  162: /* ---------------------------------------------------- */
  163: Symbol *
  164: f_symbol_pow(ap,bp) Symbol *ap; Symbol *bp;
  165: {
  166:   Symbol *cp;
  167:   double  a, b;
  168:   int     error = 0;
  169:   
  170:   cp = NULL;
  171:   switch(ap->s_type) {
  172:      case I_VAR:      a = (double)(ap->s_int);
  173:          break;
  174:      case I_CONSTANT: a = (double)(ap->s_int); capa_mfree((char *)ap);
  175:          break;
  176:      case R_VAR:      a = ap->s_real;
  177:          break;
  178:      case R_CONSTANT: a = ap->s_real;   capa_mfree((char *)ap);
  179:          break;
  180:      case S_VAR:
  181:      case S_CONSTANT: 
  182:      default:         error = 1;  break;
  183:   }
  184:   switch(bp->s_type) {
  185:      case I_VAR:      b = (double)(bp->s_int);
  186:          break;
  187:      case I_CONSTANT: b = (double)(bp->s_int);  capa_mfree((char *)bp);
  188:          break;
  189:      case R_VAR:      b = bp->s_real;
  190:          break;
  191:      case R_CONSTANT: b = bp->s_real;   capa_mfree((char *)bp);
  192:          break;
  193:      case S_VAR:
  194:      case S_CONSTANT: 
  195:      default:         error = 1; break;
  196:   }
  197:   if (!error) {
  198:     cp = (Symbol *)capa_malloc(sizeof(Symbol),1);
  199:     cp->s_type = R_CONSTANT;
  200:     cp->s_real = pow(a,b);
  201:     
  202:   }
  203:   return (cp);
  204: }
  205: 
  206: /* ============================================================================= */

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