Annotation of 41BSD/cmd/pi/yytree.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)yytree.c 1.1 8/27/80";
                      4: 
                      5: #include "whoami.h"
                      6: #include "0.h"
                      7: #include "tree.h"
                      8: 
                      9: extern int *spacep;
                     10: 
                     11: /*
                     12:  * LIST MANIPULATION ROUTINES
                     13:  *
                     14:  * The grammar for Pascal is written left recursively.
                     15:  * Because of this, the portions of parse trees which are to resemble
                     16:  * lists are in the somewhat inconvenient position of having
                     17:  * the nodes built from left to right, while we want to eventually
                     18:  * have as semantic value the leftmost node.
                     19:  * We could carry the leftmost node as semantic value, but this
                     20:  * would be inefficient as to add a new node to the list we would
                     21:  * have to chase down to the end.  Other solutions involving a head
                     22:  * and tail pointer waste space.
                     23:  *
                     24:  * The simple solution to this apparent dilemma is to carry along
                     25:  * a pointer to the leftmost node in a list in the rightmost node
                     26:  * which is the current semantic value of the list.
                     27:  * When we have completed building the list, we can retrieve this
                     28:  * left end pointer very easily; neither adding new elements to the list
                     29:  * nor finding the left end is thus expensive.  As the bottommost node
                     30:  * has an unused next pointer in it, no space is wasted either.
                     31:  *
                     32:  * The nodes referred to here are of the T_LISTPP type and have
                     33:  * the form:
                     34:  *
                     35:  *     T_LISTPP        some_pointer            next_element
                     36:  *
                     37:  * Here some_pointer points to the things of interest in the list,
                     38:  * and next_element to the next thing in the list except for the
                     39:  * rightmost node, in which case it points to the leftmost node.
                     40:  * The next_element of the rightmost node is of course zapped to the
                     41:  * NIL pointer when the list is completed.
                     42:  *
                     43:  * Thinking of the lists as tree we heceforth refer to the leftmost
                     44:  * node as the "top", and the rightmost node as the "bottom" or as
                     45:  * the "virtual root".
                     46:  */
                     47: 
                     48: /*
                     49:  * Make a new list
                     50:  */
                     51: newlist(new)
                     52:        register int *new;
                     53: {
                     54: 
                     55:        if (new == NIL)
                     56:                return (NIL);
                     57:        return (tree3(T_LISTPP, new, spacep));
                     58: }
                     59: 
                     60: /*
                     61:  * Add a new element to an existing list
                     62:  */
                     63: addlist(vroot, new)
                     64:        register int *vroot;
                     65:        int *new;
                     66: {
                     67:        register int *top;
                     68: 
                     69:        if (new == NIL)
                     70:                return (vroot);
                     71:        if (vroot == NIL)
                     72:                return (newlist(new));
                     73:        top = vroot[2];
                     74:        vroot[2] = spacep;
                     75:        return (tree3(T_LISTPP, new, top));
                     76: }
                     77: 
                     78: /*
                     79:  * Fix up the list which has virtual root vroot.
                     80:  * We grab the top pointer and return it, zapping the spot
                     81:  * where it was so that the tree is not circular.
                     82:  */
                     83: fixlist(vroot)
                     84:        register int *vroot;
                     85: {
                     86:        register int *top;
                     87: 
                     88:        if (vroot == NIL)
                     89:                return (NIL);
                     90:        top = vroot[2];
                     91:        vroot[2] = NIL;
                     92:        return (top);
                     93: }
                     94: 
                     95: 
                     96: /*
                     97:  * Set up a T_VAR node for a qualified variable.
                     98:  * Init is the initial entry in the qualification,
                     99:  * or NIL if there is none.
                    100:  *
                    101:  * if we are building pTrees, there has to be an extra slot for 
                    102:  * a pointer to the namelist entry of a field, if this T_VAR refers
                    103:  * to a field name within a WITH statement.
                    104:  * this extra field is set in lvalue, and used in VarCopy.
                    105:  */
                    106: setupvar(var, init)
                    107:        char *var;
                    108:        register int *init;
                    109: {
                    110: 
                    111:        if (init != NIL)
                    112:                init = newlist(init);
                    113: #      ifndef PTREE
                    114:            return (tree4(T_VAR, NOCON, var, init));
                    115: #      else
                    116:            return tree5( T_VAR , NOCON , var , init , NIL );
                    117: #      endif
                    118: }
                    119: 
                    120:     /*
                    121:      * set up a T_TYREC node for a record
                    122:      *
                    123:      * if we are building pTrees, there has to be an extra slot for 
                    124:      * a pointer to the namelist entry of the record.
                    125:      * this extra field is filled in in gtype, and used in RecTCopy.
                    126:      */
                    127: setuptyrec( line , fldlst )
                    128:     int        line;
                    129:     int        *fldlst;
                    130:     {
                    131: 
                    132: #      ifndef PTREE
                    133:            return tree3( T_TYREC , line , fldlst );
                    134: #      else
                    135:            return tree4( T_TYREC , line , fldlst , NIL );
                    136: #      endif
                    137:     }
                    138: 
                    139:     /*
                    140:      * set up a T_FIELD node for a field.
                    141:      *
                    142:      * if we are building pTrees, there has to be an extra slot for
                    143:      * a pointer to the namelist entry of the field.
                    144:      * this extra field is set in lvalue, and used in SelCopy.
                    145:      */
                    146: setupfield( field , other )
                    147:     int        *field;
                    148:     int        *other;
                    149:     {
                    150: 
                    151: #      ifndef PTREE
                    152:            return tree3( T_FIELD , field , other );
                    153: #      else
                    154:            return tree4( T_FIELD , field , other , NIL );
                    155: #      endif
                    156:     }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.