--- ray/src/common/calexpr.c 1990/07/19 12:56:50 1.6 +++ 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, @@ -381,21 +383,20 @@ char *err; { register int i; - eputs(linbuf); - if (linbuf[strlen(linbuf)-1] != '\n') - eputs("\n"); - for (i = 0; i < linepos-1; i++) - eputs(linbuf[i] == '\t' ? "\t" : " "); - eputs("^ "); if (infile != NULL || lineno != 0) { - eputs("\n"); if (infile != NULL) eputs(infile); if (lineno != 0) { eputs(infile != NULL ? ", line " : "line "); eputs(ltoa((long)lineno)); } - eputs(": "); + eputs(": syntax error:\n"); } + eputs(linbuf); + if (linbuf[strlen(linbuf)-1] != '\n') + eputs("\n"); + for (i = 0; i < linepos-1; i++) + eputs(linbuf[i] == '\t' ? "\t" : " "); + eputs("^ "); eputs(err); eputs("\n"); quit(1); @@ -529,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); } @@ -642,6 +643,10 @@ getE5() /* E5 -> (E1) */ syntax("'(' expected"); #endif #endif +#ifdef RCONST + if (isconstvar(ep1)) + ep1 = rconst(ep1); +#endif return(ep1); } #endif @@ -672,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