version 1.7, 2000/08/23 16:55:12
|
version 1.10, 2001/06/01 18:09:04
|
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 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 154 basic_item : F_ID F_LPAR F_RPAR
|
Line 161 basic_item : F_ID F_LPAR F_RPAR
|
| 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 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 221 f_symbol_pow(ap,bp) Symbol *ap; Symbol *
|
Line 235 f_symbol_pow(ap,bp) Symbol *ap; Symbol *
|
error = 1; |
error = 1; |
} |
} |
if (!error) { |
if (!error) { |
|
printf("and trying"); |
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); |
} |
} |