581 |
|
|
582 |
|
|
583 |
|
EPNODE * |
584 |
< |
getE1(void) /* E1 -> E1 ADDOP E2 */ |
584 |
> |
getE1(void) /* E1 -> E1 ADDOP E2 */ |
585 |
|
/* E2 */ |
586 |
|
{ |
587 |
|
register EPNODE *ep1, *ep2; |
603 |
|
|
604 |
|
|
605 |
|
EPNODE * |
606 |
< |
getE2(void) /* E2 -> E2 MULOP E3 */ |
606 |
> |
getE2(void) /* E2 -> E2 MULOP E3 */ |
607 |
|
/* E3 */ |
608 |
|
{ |
609 |
|
register EPNODE *ep1, *ep2; |
615 |
|
scan(); |
616 |
|
addekid(ep2, ep1); |
617 |
|
addekid(ep2, getE3()); |
618 |
< |
if (esupport&E_RCONST && |
619 |
< |
ep1->type == NUM && ep1->sibling->type == NUM) |
620 |
< |
ep2 = rconst(ep2); |
618 |
> |
if (esupport&E_RCONST) { |
619 |
> |
EPNODE *ep3 = ep1->sibling; |
620 |
> |
if (ep1->type == NUM && ep3->type == NUM) { |
621 |
> |
ep2 = rconst(ep2); |
622 |
> |
} else if (ep3->type == NUM) { |
623 |
> |
if (ep2->type == '/') { |
624 |
> |
if (ep3->v.num == 0) |
625 |
> |
syntax("divide by zero constant"); |
626 |
> |
ep2->type = '*'; /* for speed */ |
627 |
> |
ep3->v.num = 1./ep3->v.num; |
628 |
> |
} else if (ep3->v.num == 0) { |
629 |
> |
ep1->sibling = NULL; /* (E2 * 0) */ |
630 |
> |
epfree(ep2); |
631 |
> |
ep2 = ep3; |
632 |
> |
} |
633 |
> |
} else if (ep1->type == NUM && ep1->v.num == 0) { |
634 |
> |
epfree(ep3); /* (0 * E3) or (0 / E3) */ |
635 |
> |
ep1->sibling = NULL; |
636 |
> |
efree((char *)ep2); |
637 |
> |
ep2 = ep1; |
638 |
> |
} |
639 |
> |
} |
640 |
|
ep1 = ep2; |
641 |
|
} |
642 |
|
return(ep1); |
644 |
|
|
645 |
|
|
646 |
|
EPNODE * |
647 |
< |
getE3(void) /* E3 -> E4 ^ E3 */ |
647 |
> |
getE3(void) /* E3 -> E4 ^ E3 */ |
648 |
|
/* E4 */ |
649 |
|
{ |
650 |
< |
register EPNODE *ep1, *ep2; |
650 |
> |
register EPNODE *ep1, *ep2; |
651 |
|
|
652 |
< |
ep1 = getE4(); |
653 |
< |
if (nextc == '^') { |
652 |
> |
ep1 = getE4(); |
653 |
> |
if (nextc != '^') |
654 |
> |
return(ep1); |
655 |
|
ep2 = newnode(); |
656 |
|
ep2->type = nextc; |
657 |
|
scan(); |
658 |
|
addekid(ep2, ep1); |
659 |
|
addekid(ep2, getE3()); |
660 |
< |
if (esupport&E_RCONST && |
661 |
< |
ep1->type == NUM && ep1->sibling->type == NUM) |
662 |
< |
ep2 = rconst(ep2); |
660 |
> |
if (esupport&E_RCONST) { |
661 |
> |
EPNODE *ep3 = ep1->sibling; |
662 |
> |
if (ep1->type == NUM && ep3->type == NUM) { |
663 |
> |
ep2 = rconst(ep2); |
664 |
> |
} else if (ep1->type == NUM && ep1->v.num == 0) { |
665 |
> |
epfree(ep3); /* (0 ^ E3) */ |
666 |
> |
ep1->sibling = NULL; |
667 |
> |
efree((char *)ep2); |
668 |
> |
ep2 = ep1; |
669 |
> |
} else if ((ep3->type == NUM && ep3->v.num == 0) || |
670 |
> |
(ep1->type == NUM && ep1->v.num == 1)) { |
671 |
> |
epfree(ep2); /* (E4 ^ 0) or (1 ^ E3) */ |
672 |
> |
ep2 = newnode(); |
673 |
> |
ep2->type = NUM; |
674 |
> |
ep2->v.num = 1; |
675 |
> |
} |
676 |
> |
} |
677 |
|
return(ep2); |
644 |
– |
} |
645 |
– |
return(ep1); |
678 |
|
} |
679 |
|
|
680 |
|
|
681 |
|
EPNODE * |
682 |
< |
getE4(void) /* E4 -> ADDOP E5 */ |
682 |
> |
getE4(void) /* E4 -> ADDOP E5 */ |
683 |
|
/* E5 */ |
684 |
|
{ |
685 |
|
register EPNODE *ep1, *ep2; |
692 |
|
return(ep2); |
693 |
|
} |
694 |
|
if (ep2->type == UMINUS) { /* don't generate -(-E5) */ |
695 |
+ |
ep1 = ep2->v.kid; |
696 |
|
efree((char *)ep2); |
697 |
< |
return(ep2->v.kid); |
697 |
> |
return(ep1); |
698 |
|
} |
699 |
|
ep1 = newnode(); |
700 |
|
ep1->type = UMINUS; |