--- ray/src/common/calexpr.c 1990/08/18 16:28:52 1.7 +++ ray/src/common/calexpr.c 1991/04/23 15:26:26 1.9 @@ -78,8 +78,10 @@ double (*eoper[])() = { /* expression operations */ esubtr, 0, edivi, - 0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0, ebotch, + 0,0, + ebotch, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, epow, @@ -528,23 +530,23 @@ getE2() /* E2 -> E2 MULOP E3 */ EPNODE * -getE3() /* E3 -> E3 ^ E4 */ +getE3() /* E3 -> E4 ^ E3 */ /* E4 */ { register EPNODE *ep1, *ep2; ep1 = getE4(); - while (nextc == '^') { + if (nextc == '^') { ep2 = newnode(); ep2->type = nextc; scan(); addekid(ep2, ep1); - addekid(ep2, getE4()); + addekid(ep2, getE3()); #ifdef RCONST if (ep1->type == NUM && ep1->sibling->type == NUM) ep2 = rconst(ep2); #endif - ep1 = ep2; + return(ep2); } return(ep1); } @@ -641,6 +643,10 @@ getE5() /* E5 -> (E1) */ syntax("'(' expected"); #endif #endif +#ifdef RCONST + if (isconstvar(ep1)) + ep1 = rconst(ep1); +#endif return(ep1); } #endif @@ -671,5 +677,43 @@ register EPNODE *epar; epfree(epar); return(ep); +} + + +isconstvar(ep) /* is ep linked to a constant? */ +register EPNODE *ep; +{ +#ifdef VARIABLE + register EPNODE *ep1; + +#ifdef FUNCTION + if (ep->type == FUNC) { + if (ep->v.kid->type != VAR) + return(0); + ep1 = ep->v.kid->v.ln->def; + if (ep1 != NULL && ep1->type != ':') + return(0); + if ((ep1 == NULL || ep1->v.kid->type != FUNC) + && liblookup(ep->v.kid->v.ln->name) == NULL) + return(0); + for (ep1 = ep->v.kid->sibling; ep1 != NULL; ep1 = ep1->sibling) + if (ep1->type != NUM) + return(0); + return(1); + } +#endif + if (ep->type != VAR) + return(0); + ep1 = ep->v.ln->def; + if (ep1 == NULL || ep1->type != ':') + return(0); +#ifdef FUNCTION + if (ep1->v.kid->type != SYM) + return(0); +#endif + return(1); +#else + return(ep->type == FUNC); +#endif } #endif