| 680 |
|
addekid(ep2, ep1); |
| 681 |
|
addekid(ep2, getE3()); |
| 682 |
|
if (esupport&E_RCONST) { |
| 683 |
< |
EPNODE *ep3 = ep1->sibling; |
| 684 |
< |
if ((ep1->type == NUM) & (ep3->type == NUM)) { |
| 685 |
< |
ep2 = rconst(ep2); |
| 686 |
< |
} else if (ep3->type == NUM) { |
| 687 |
< |
if (ep2->type == '/') { |
| 688 |
< |
if (ep3->v.num == 0) |
| 689 |
< |
esyntax("divide by zero constant"); |
| 690 |
< |
ep2->type = '*'; /* for speed */ |
| 691 |
< |
ep3->v.num = 1./ep3->v.num; |
| 692 |
< |
} else if (ep3->v.num == 0) { |
| 693 |
< |
ep1->sibling = NULL; /* (E2 * 0) */ |
| 694 |
< |
epfree(ep2,1); |
| 695 |
< |
ep2 = ep3; |
| 696 |
< |
} |
| 697 |
< |
} else if (ep1->type == NUM && ep1->v.num == 0) { |
| 698 |
< |
epfree(ep3,1); /* (0 * E3) or (0 / E3) */ |
| 699 |
< |
ep1->sibling = NULL; |
| 700 |
< |
efree(ep2); |
| 701 |
< |
ep2 = ep1; |
| 683 |
> |
EPNODE *ep3 = ep1->sibling; |
| 684 |
> |
if ((ep1->type == NUM) & (ep3->type == NUM)) { |
| 685 |
> |
ep2 = rconst(ep2); |
| 686 |
> |
} else if (ep3->type == NUM) { |
| 687 |
> |
if (ep2->type == '/') { |
| 688 |
> |
if (ep3->v.num == 0) |
| 689 |
> |
esyntax("divide by zero constant"); |
| 690 |
> |
ep2->type = '*'; /* for speed */ |
| 691 |
> |
ep3->v.num = 1./ep3->v.num; |
| 692 |
> |
} else if (ep3->v.num == 0) { |
| 693 |
> |
ep1->sibling = NULL; /* (E2 * 0) */ |
| 694 |
> |
epfree(ep2,1); |
| 695 |
> |
ep2 = ep3; |
| 696 |
|
} |
| 697 |
+ |
} else if (ep1->type == NUM && ep1->v.num == 0) { |
| 698 |
+ |
epfree(ep3,1); /* (0 * E3) or (0 / E3) */ |
| 699 |
+ |
ep1->sibling = NULL; |
| 700 |
+ |
efree(ep2); |
| 701 |
+ |
ep2 = ep1; |
| 702 |
+ |
} |
| 703 |
|
} |
| 704 |
|
ep1 = ep2; |
| 705 |
|
} |
| 722 |
|
addekid(ep2, ep1); |
| 723 |
|
addekid(ep2, getE3()); |
| 724 |
|
if (esupport&E_RCONST) { |
| 725 |
< |
EPNODE *ep3 = ep1->sibling; |
| 726 |
< |
if ((ep1->type == NUM) & (ep3->type == NUM)) { |
| 727 |
< |
ep2 = rconst(ep2); |
| 728 |
< |
} else if (ep1->type == NUM && ep1->v.num == 0) { |
| 729 |
< |
epfree(ep3,1); /* (0 ^ E3) */ |
| 730 |
< |
ep1->sibling = NULL; |
| 731 |
< |
efree(ep2); |
| 732 |
< |
ep2 = ep1; |
| 733 |
< |
} else if ((ep3->type == NUM && ep3->v.num == 0) | |
| 725 |
> |
EPNODE *ep3 = ep1->sibling; |
| 726 |
> |
if ((ep1->type == NUM) & (ep3->type == NUM)) { |
| 727 |
> |
ep2 = rconst(ep2); |
| 728 |
> |
} else if (ep1->type == NUM && ep1->v.num == 0) { |
| 729 |
> |
epfree(ep3,1); /* (0 ^ E3) */ |
| 730 |
> |
ep1->sibling = NULL; |
| 731 |
> |
efree(ep2); |
| 732 |
> |
ep2 = ep1; |
| 733 |
> |
} else if ((ep3->type == NUM && ep3->v.num == 0) | |
| 734 |
|
(ep1->type == NUM && ep1->v.num == 1)) { |
| 735 |
< |
epfree(ep2,0); /* (E4 ^ 0) or (1 ^ E3) */ |
| 736 |
< |
ep2->type = NUM; |
| 737 |
< |
ep2->v.num = 1; |
| 738 |
< |
} else if (ep3->type == NUM && ep3->v.num == 1) { |
| 739 |
< |
efree(ep3); /* (E4 ^ 1) */ |
| 740 |
< |
ep1->sibling = NULL; |
| 741 |
< |
efree(ep2); |
| 742 |
< |
ep2 = ep1; |
| 743 |
< |
} |
| 735 |
> |
epfree(ep2,0); /* (E4 ^ 0) or (1 ^ E3) */ |
| 736 |
> |
ep2->type = NUM; |
| 737 |
> |
ep2->v.num = 1; |
| 738 |
> |
} else if (ep3->type == NUM && ep3->v.num == 1) { |
| 739 |
> |
efree(ep3); /* (E4 ^ 1) */ |
| 740 |
> |
ep1->sibling = NULL; |
| 741 |
> |
efree(ep2); |
| 742 |
> |
ep2 = ep1; |
| 743 |
> |
} |
| 744 |
|
} |
| 745 |
|
return(ep2); |
| 746 |
|
} |
| 756 |
|
escan(); |
| 757 |
|
ep2 = getE5(); |
| 758 |
|
if (ep2->type == NUM) { |
| 759 |
< |
ep2->v.num = -ep2->v.num; |
| 760 |
< |
return(ep2); |
| 759 |
> |
ep2->v.num = -ep2->v.num; |
| 760 |
> |
return(ep2); |
| 761 |
|
} |
| 762 |
|
if (ep2->type == UMINUS) { /* don't generate -(-E5) */ |
| 763 |
|
ep1 = ep2->v.kid; |
| 788 |
|
EPNODE *ep1, *ep2; |
| 789 |
|
|
| 790 |
|
if (nextc == '(') { |
| 791 |
< |
escan(); |
| 792 |
< |
ep1 = getE1(); |
| 793 |
< |
if (nextc != ')') |
| 794 |
< |
esyntax("')' expected"); |
| 795 |
< |
escan(); |
| 796 |
< |
return(ep1); |
| 791 |
> |
escan(); |
| 792 |
> |
ep1 = getE1(); |
| 793 |
> |
if (nextc != ')') |
| 794 |
> |
esyntax("')' expected"); |
| 795 |
> |
escan(); |
| 796 |
> |
return(ep1); |
| 797 |
|
} |
| 798 |
|
if (esupport&E_INCHAN && nextc == '$') { |
| 799 |
< |
escan(); |
| 800 |
< |
ep1 = newnode(); |
| 801 |
< |
ep1->type = CHAN; |
| 802 |
< |
ep1->v.chan = getinum(); |
| 803 |
< |
return(ep1); |
| 799 |
> |
escan(); |
| 800 |
> |
ep1 = newnode(); |
| 801 |
> |
ep1->type = CHAN; |
| 802 |
> |
ep1->v.chan = getinum(); |
| 803 |
> |
return(ep1); |
| 804 |
|
} |
| 805 |
|
if (esupport&(E_VARIABLE|E_FUNCTION) && |
| 806 |
|
(isalpha(nextc) | (nextc == CNTXMARK))) { |
| 807 |
< |
nam = getname(); |
| 808 |
< |
ep1 = NULL; |
| 809 |
< |
if ((esupport&(E_VARIABLE|E_FUNCTION)) == (E_VARIABLE|E_FUNCTION) |
| 807 |
> |
nam = getname(); |
| 808 |
> |
ep1 = NULL; |
| 809 |
> |
if ((esupport&(E_VARIABLE|E_FUNCTION)) == (E_VARIABLE|E_FUNCTION) |
| 810 |
|
&& ecurfunc != NULL) |
| 811 |
< |
for (i = 1, ep2 = ecurfunc->v.kid->sibling; |
| 812 |
< |
ep2 != NULL; i++, ep2 = ep2->sibling) |
| 813 |
< |
if (!strcmp(ep2->v.name, nam)) { |
| 814 |
< |
ep1 = newnode(); |
| 815 |
< |
ep1->type = ARG; |
| 816 |
< |
ep1->v.chan = i; |
| 817 |
< |
break; |
| 818 |
< |
} |
| 819 |
< |
if (ep1 == NULL) { |
| 811 |
> |
for (i = 1, ep2 = ecurfunc->v.kid->sibling; |
| 812 |
> |
ep2 != NULL; i++, ep2 = ep2->sibling) |
| 813 |
> |
if (!strcmp(ep2->v.name, nam)) { |
| 814 |
|
ep1 = newnode(); |
| 815 |
< |
ep1->type = VAR; |
| 816 |
< |
ep1->v.ln = varinsert(nam); |
| 817 |
< |
} |
| 818 |
< |
if (esupport&E_FUNCTION && nextc == '(') { |
| 819 |
< |
ep2 = newnode(); |
| 820 |
< |
ep2->type = FUNC; |
| 821 |
< |
addekid(ep2, ep1); |
| 822 |
< |
ep1 = ep2; |
| 823 |
< |
do { |
| 824 |
< |
escan(); |
| 825 |
< |
addekid(ep1, getE1()); |
| 826 |
< |
} while (nextc == ','); |
| 827 |
< |
if (nextc != ')') |
| 828 |
< |
esyntax("')' expected"); |
| 829 |
< |
escan(); |
| 830 |
< |
} else if (!(esupport&E_VARIABLE)) |
| 831 |
< |
esyntax("'(' expected"); |
| 832 |
< |
if (esupport&E_RCONST && isconstvar(ep1)) |
| 833 |
< |
ep1 = rconst(ep1); |
| 834 |
< |
return(ep1); |
| 815 |
> |
ep1->type = ARG; |
| 816 |
> |
ep1->v.chan = i; |
| 817 |
> |
break; |
| 818 |
> |
} |
| 819 |
> |
if (ep1 == NULL) { |
| 820 |
> |
ep1 = newnode(); |
| 821 |
> |
ep1->type = VAR; |
| 822 |
> |
ep1->v.ln = varinsert(nam); |
| 823 |
> |
} |
| 824 |
> |
if (esupport&E_FUNCTION && nextc == '(') { |
| 825 |
> |
ep2 = newnode(); |
| 826 |
> |
ep2->type = FUNC; |
| 827 |
> |
addekid(ep2, ep1); |
| 828 |
> |
ep1 = ep2; |
| 829 |
> |
do { |
| 830 |
> |
escan(); |
| 831 |
> |
addekid(ep1, getE1()); |
| 832 |
> |
} while (nextc == ','); |
| 833 |
> |
if (nextc != ')') |
| 834 |
> |
esyntax("')' expected"); |
| 835 |
> |
escan(); |
| 836 |
> |
} else if (!(esupport&E_VARIABLE)) |
| 837 |
> |
esyntax("'(' expected"); |
| 838 |
> |
if (esupport&E_RCONST && isconstvar(ep1)) |
| 839 |
> |
ep1 = rconst(ep1); |
| 840 |
> |
return(ep1); |
| 841 |
|
} |
| 842 |
|
if (isdecimal(nextc)) { |
| 843 |
< |
ep1 = newnode(); |
| 844 |
< |
ep1->type = NUM; |
| 845 |
< |
ep1->v.num = getnum(); |
| 846 |
< |
return(ep1); |
| 843 |
> |
ep1 = newnode(); |
| 844 |
> |
ep1->type = NUM; |
| 845 |
> |
ep1->v.num = getnum(); |
| 846 |
> |
return(ep1); |
| 847 |
|
} |
| 848 |
|
esyntax("unexpected character"); |
| 849 |
|
return NULL; /* pro forma return */ |