00001
00002
00003
00004
00005
00006
00007 #include "def.h"
00008 #include <ctype.h>
00009
00010 #define NODE_ALLOC 100
00011 NODE *expr_mem = NULL;
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 NODE *
00023 node_new()
00024 {
00025 char *calloc();
00026 NODE *temp;
00027 register int i;
00028
00029 if (!expr_mem) {
00030 # ifdef DEBUG
00031 printf("allocating expression nodes\n");
00032 fflush(stdout);
00033 # endif
00034 expr_mem = (NODE *) calloc(NODE_ALLOC, sizeof (NODE));
00035 if (!expr_mem) error("out of memory");
00036 for (i = 0; i < NODE_ALLOC - 1; i++)
00037 expr_mem[i].next = &expr_mem[i+1];
00038 expr_mem[NODE_ALLOC-1].next = NULL;
00039 }
00040
00041 temp = expr_mem;
00042 expr_mem = expr_mem->next;
00043 return temp ;
00044 }
00045
00046
00047
00048
00049
00050
00051 void
00052 node_free(n)
00053 NODE *n;
00054 {
00055
00056 n->next = expr_mem;
00057 expr_mem = n;
00058 }
00059
00060 void expr_free(fn)
00061 NODE *fn;
00062 {
00063 char *arity_name();
00064 void name_free();
00065
00066 if ((fn->op->arity == OP_STR) || (fn->op->arity == OP_NUM)) node_free(fn);
00067 else if (fn->op->arity == OP_NAME) name_free((NAME_NODE *) fn);
00068
00069 else if (fn->op->arity == NULLARY) {
00070 if (((TERM_NODE *)fn)->label) name_free(((TERM_NODE *) fn)->label);
00071 node_free(fn);
00072 }
00073 else if ((fn->op->arity & BINARY) || (fn->op->arity & UNARY)) {
00074 if (((TERM_NODE *)fn)->label) name_free(((TERM_NODE *) fn)->label);
00075 if ((fn->op->arity & BINARY) || (fn->op->arity == POSTFIX))
00076 expr_free(((TERM_NODE *)fn)->left);
00077 if (fn->op->arity != POSTFIX) expr_free(((TERM_NODE *)fn)->right);
00078 node_free(fn);
00079 }
00080 else {
00081 fprintf(stderr, "arity: %s\n", arity_name(fn->op->arity));
00082 error("Unknown arity while printing expression tree");
00083 }
00084 }
00085
00086
00087
00088
00089
00090
00091
00092
00093 void
00094 expr_print(p)
00095 NODE *p;
00096 {
00097 void name_print();
00098 char *arity_name();
00099
00100
00101
00102
00103
00104
00105
00106 if (p->op->arity == OP_STR) fprintf(stderr, "\"%s\"", ((STR_NODE *)p)->value);
00107
00108 else if (p->op->arity == OP_NUM) fprintf(stderr, "%g", ((NUM_NODE *)p)->value);
00109
00110 else if (p->op->arity == OP_NAME) name_print((NAME_NODE *) p);
00111
00112 else if (p->op->arity == NULLARY) {
00113 if (((TERM_NODE *)p)->label) {
00114 name_print(((TERM_NODE *)p)->label);
00115 fprintf(stderr, ":");
00116 }
00117 if (isalpha(p->op->pname[0])) fprintf(stderr, " %s ", p->op->pname);
00118 else fprintf(stderr, "%s", p->op->pname);
00119 }
00120
00121 else if ((p->op->arity & BINARY) || (p->op->arity & UNARY)) {
00122
00123 if (((TERM_NODE *)p)->label) {
00124 name_print(((TERM_NODE *)p)->label);
00125 fprintf(stderr, ":");
00126 }
00127 if (p->op->arity != OUTFIX1) fprintf(stderr, "(");
00128
00129 if ((p->op->arity & BINARY) || (p->op->arity == POSTFIX))
00130 expr_print(((TERM_NODE *)p)->left);
00131
00132 if (isalpha(p->op->pname[0])) fprintf(stderr, " %s ", p->op->pname);
00133 else fprintf(stderr, "%s", p->op->pname);
00134
00135 if (p->op->arity != POSTFIX) expr_print(((TERM_NODE *)p)->right);
00136
00137 if (p->op->arity == OUTFIX1) fprintf(stderr, "%s", p->op->other->pname);
00138 else fprintf(stderr, ")");
00139 }
00140 else {
00141 fprintf(stderr, "arity: %s\n", arity_name(p->op->arity));
00142 error("Unknown arity while printing expression tree");
00143 }
00144 }
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 NODE *
00156 expr_copy(otree)
00157 NODE *otree;
00158 {
00159 NAME_NODE *name_copy();
00160 char *arity_name();
00161
00162 if (!otree) error("null node in expr_copy!");
00163 if (!otree->op) error("node with no operator in expr_copy!");
00164
00165 if (otree->op->arity & OP_TERM) {
00166 TERM_NODE *te = (TERM_NODE *) node_new();
00167 te->op = otree->op;
00168 if (((TERM_NODE *) otree)->label)
00169 te->label = name_copy(((TERM_NODE *) otree)->label);
00170 else te->label = (NAME_NODE *) NULL;
00171 if (((TERM_NODE *) otree)->right)
00172 te->right = expr_copy(((TERM_NODE *) otree)->right);
00173 else te->right = (NODE *) NULL;
00174 if (((TERM_NODE *) otree)->left)
00175 te->left = expr_copy(((TERM_NODE *) otree)->left);
00176 else te->left = (NODE *) NULL;
00177 return (NODE *) te;
00178 }
00179 if (otree->op->arity & OP_NAME) {
00180
00181
00182 return (NODE *) name_copy((NAME_NODE *) otree);
00183 }
00184 if (otree->op->arity & OP_NUM) {
00185 NUM_NODE *ne = (NUM_NODE *) node_new();
00186 ne->op = otree->op;
00187 ne->value = ((NUM_NODE *) otree)->value;
00188 return (NODE *) ne;
00189 }
00190 if (otree->op->arity & OP_STR) {
00191 STR_NODE *se = (STR_NODE *) node_new();
00192 se->op = otree->op;
00193
00194 se->value = ((STR_NODE *) otree)->value;
00195 return (NODE *) se;
00196 }
00197
00198 fprintf(stderr, "operator: %s, arity: %s\n",
00199 otree->op->pname, arity_name(otree->op->arity));
00200 error("invalid operator arity in expr_copy");
00201 }
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212 NODE *
00213 expr_update(tree)
00214 NODE *tree;
00215 {
00216 void name_free();
00217
00218 if (!tree) error("null node in expr_update!");
00219 if (!tree->op) error("node with no operator in expr_update!");
00220
00221 if (tree->op->arity & OP_NAME) {
00222 if (((NAME_NODE *)tree)->value) {
00223
00224 NODE *val = expr_update(((NAME_NODE *)tree)->value);
00225 ((NAME_NODE *)tree)->value = val;
00226 val = expr_copy(val);
00227 name_free((NAME_NODE *)tree);
00228 return val;
00229 }
00230 else return tree;
00231 }
00232 if (tree->op->arity & OP_TERM) {
00233 if (((TERM_NODE *)tree)->left)
00234 ((TERM_NODE *)tree)->left = expr_update(((TERM_NODE *)tree)->left);
00235 if (((TERM_NODE *)tree)->right)
00236 ((TERM_NODE *)tree)->right = expr_update(((TERM_NODE *)tree)->right);
00237 }
00238 return tree;
00239 }