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); |
} |
} |