home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v92.tgz
/
v92.tar
/
v92
/
src
/
icont
/
tree.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-03-22
|
3KB
|
176 lines
/*
* tree.c -- functions for constructing parse trees
*/
#include "::h:gsupport.h"
#include "tproto.h"
#include "tree.h"
/*
* tree[1-6] construct parse tree nodes with specified values.
* Parameters a and b are line and column information,
* while parameters c through f are values to be assigned to n_field[0-3].
* Note that this could be done with a single routine; a separate routine
* for each node size is used for speed and simplicity.
*/
nodeptr tree1(type)
int type;
{
register nodeptr t;
t = NewNode(0);
t->n_type = type;
return t;
}
nodeptr tree2(type, loc_model)
int type;
nodeptr loc_model;
{
register nodeptr t;
t = NewNode(0);
t->n_type = type;
t->n_file = loc_model->n_file;
t->n_line = loc_model->n_line;
t->n_col = loc_model->n_col;
return t;
}
nodeptr tree3(type, loc_model, c)
int type;
nodeptr loc_model;
nodeptr c;
{
register nodeptr t;
t = NewNode(1);
t->n_type = type;
t->n_file = loc_model->n_file;
t->n_line = loc_model->n_line;
t->n_col = loc_model->n_col;
t->n_field[0].n_ptr = c;
return t;
}
nodeptr tree4(type, loc_model, c, d)
int type;
nodeptr loc_model;
nodeptr c, d;
{
register nodeptr t;
t = NewNode(2);
t->n_type = type;
t->n_file = loc_model->n_file;
t->n_line = loc_model->n_line;
t->n_col = loc_model->n_col;
t->n_field[0].n_ptr = c;
t->n_field[1].n_ptr = d;
return t;
}
nodeptr tree5(type, loc_model, c, d, e)
int type;
nodeptr loc_model;
nodeptr c, d, e;
{
register nodeptr t;
t = NewNode(3);
t->n_type = type;
t->n_file = loc_model->n_file;
t->n_line = loc_model->n_line;
t->n_col = loc_model->n_col;
t->n_field[0].n_ptr = c;
t->n_field[1].n_ptr = d;
t->n_field[2].n_ptr = e;
return t;
}
nodeptr tree6(type, loc_model, c, d, e, f)
int type;
nodeptr loc_model;
nodeptr c, d, e, f;
{
register nodeptr t;
t = NewNode(4);
t->n_type = type;
t->n_file = loc_model->n_file;
t->n_line = loc_model->n_line;
t->n_col = loc_model->n_col;
t->n_field[0].n_ptr = c;
t->n_field[1].n_ptr = d;
t->n_field[2].n_ptr = e;
t->n_field[3].n_ptr = f;
return t;
}
nodeptr buildarray(a,lb,e,rb)
nodeptr a, lb, e, rb;
{
register nodeptr t, t2;
if (e->n_type == N_Elist) {
t2 = int_leaf(lb->n_type, lb, (int)lb->n_field[0].n_val);
t = tree5(N_Binop, t2, t2, buildarray(a,lb,e->n_field[0].n_ptr,rb),
e->n_field[1].n_ptr);
free(e);
}
else
t = tree5(N_Binop, lb, lb, a, e);
return t;
}
nodeptr int_leaf(type, loc_model, c)
int type;
nodeptr loc_model;
int c;
{
register nodeptr t;
t = NewNode(1);
t->n_type = type;
t->n_file = loc_model->n_file;
t->n_line = loc_model->n_line;
t->n_col = loc_model->n_col;
t->n_field[0].n_val = c;
return t;
}
nodeptr c_str_leaf(type, loc_model, c)
int type;
nodeptr loc_model;
char *c;
{
register nodeptr t;
t = NewNode(1);
t->n_type = type;
t->n_file = loc_model->n_file;
t->n_line = loc_model->n_line;
t->n_col = loc_model->n_col;
t->n_field[0].n_str = c;
return t;
}
nodeptr i_str_leaf(type, loc_model, c, d)
int type;
nodeptr loc_model;
char *c;
int d;
{
register nodeptr t;
t = NewNode(2);
t->n_type = type;
t->n_file = loc_model->n_file;
t->n_line = loc_model->n_line;
t->n_col = loc_model->n_col;
t->n_field[0].n_str = c;
t->n_field[1].n_val = d;
return t;
}