--- capa/capa51/pProj/capaFormula.y 2000/10/06 20:54:45 1.8 +++ capa/capa51/pProj/capaFormula.y 2000/10/23 16:22:57 1.9 @@ -77,7 +77,8 @@ int FormulaParseOK=1; %token F_NUMBER V_ID F_ID EoI F_ERROR %left F_PLUS F_MINUS %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 @@ -105,33 +106,25 @@ f_expr : block block : block F_PLUS term { $$ = symbols_op($1, $3, ADD_op); } | block F_MINUS term { $$ = symbols_op($1, $3, SUB_op); } - | F_MINUS term { $$ = $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_MINUS block { $$ = negate($2); } | term { $$ = $1; } | F_ERROR { FormulaParseOK = 0; FMLDBUG_PR1("[F_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 F_DIV basic_constr { $$ = symbols_op($1, $3, DIV_op); } - | term F_MOD basic_constr { $$ = symbols_op($1, $3, IDIV_op); } +term : term F_MULT basic_constr { $$ = symbols_op($1, $3, MUL_op); } + | term F_MULT F_MINUS basic_constr { $$ = symbols_op($1, negate($4), MUL_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 : basic_constr F_POW basic_item { $$ = f_symbol_pow($1,$3); 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; } ; @@ -183,6 +176,24 @@ 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 * f_symbol_pow(ap,bp) Symbol *ap; Symbol *bp; {