Annotation of researchv10no/cmd/cfront/xptcfront/discrim.c, revision 1.1.1.1

1.1       root        1: /* ident "@(#)ctrans:src/discrim.c     1.2" */
                      2: /************ add copyright **********************
                      3:  * union discriminator functions for nodes in cfront. 
                      4:  * all return 0 for none,
                      5:  *   -1 for bad union index, -2 for inconsistent
                      6:  *  or otherwise messed up nodes 
                      7:  */
                      8: #include "cfront.h"
                      9: #define DEFINE_TOKEN_CLASS_TABLE
                     10: #include "node_classes.h"
                     11: 
                     12: int basetype::discriminator(int which_union)
                     13: {
                     14:     switch(which_union)
                     15:     {
                     16:       case 0:
                     17:        switch(base) {
                     18:          case FIELD: return 1;
                     19:          case FCT: return 2;
                     20:          default: return discrim_none_valid;
                     21:        }
                     22:       default:
                     23:        return discrim_bad_index;
                     24:     }
                     25: }
                     26: 
                     27: int fct::discriminator(int)
                     28: {
                     29:     return discrim_bad_index;
                     30: }
                     31: 
                     32: int expr::discriminator(int which_union)
                     33: {
                     34:     switch(which_union) {
                     35:       case 0:
                     36:        return 1;               /* tp, never syn_class */
                     37:       case 1:                  /* e1, i1, string */
                     38:        switch(base) {
                     39:          case DEREF:
                     40:          case ICALL:
                     41:          case REF:
                     42:          case DOT:
                     43:          case VALUE:
                     44:          case SIZEOF:
                     45:          case NEW:
                     46:          case GNEW:
                     47:          case DELETE:
                     48:          case CAST:
                     49:          case CALL:
                     50:          case G_CALL:
                     51:          case ASSIGN:
                     52:          case EQ:
                     53:          case NE:
                     54:          case GT:
                     55:          case GE:
                     56:          case LE:
                     57:          case LT:
                     58:          case ELIST:
                     59:          case ILIST:
                     60:          case QUEST:
                     61:          case CM:
                     62:          case G_CM:
                     63:          case PLUS:
                     64:          case MINUS:
                     65:          case MUL:
                     66:          case DIV:
                     67:          case MOD:
                     68:          case LS:
                     69:          case RS:
                     70:          case AND:
                     71:          case OR:
                     72:          case ER:
                     73:          case ANDAND:
                     74:          case OROR:
                     75:          case ASOR: 
                     76:          case ASER: 
                     77:          case ASAND:
                     78:          case ASPLUS:
                     79:          case ASMINUS:
                     80:          case ASMUL:
                     81:          case ASMOD:
                     82:          case ASDIV:
                     83:          case ASLS:
                     84:          case ASRS:
                     85:          case DECR:
                     86:          case INCR:
                     87:            return 1;
                     88:          case MDOT:
                     89:          case IVAL:
                     90:            return 2;
                     91:          case TNAME:
                     92:          case NAME:
                     93:          case ICON:
                     94:          case FCON:
                     95:          case CCON:
                     96:          case ID:
                     97:          case STRING:
                     98:          case TEXT:
                     99:            return 3;
                    100:          default: return discrim_none_valid;
                    101:        }
                    102:       case 2:                  /* e2, i2, string2, n_initializer */
                    103:        /* i2 is a complete mystery. It is set to 1,
                    104:           and never referenced. But I'm not sure that
                    105:           someone somewhere doesn't test one of the other
                    106:           union elements for equal to 1, so therefore this test. */
                    107:        if(i2 == 1)return 2;
                    108:        switch(base) {
                    109:          case DELETE:
                    110:          case VALUE:
                    111:          case ICALL:
                    112:          case CALL:
                    113:          case G_CALL:
                    114:          case ASSIGN:
                    115:          case EQ:
                    116:          case NE:
                    117:          case GT:
                    118:          case GE:
                    119:          case LE:
                    120:          case LT:
                    121:          case DEREF:
                    122:          case ELIST:
                    123:          case QUEST:
                    124:          case CM:
                    125:          case G_CM:
                    126:          case UMINUS:
                    127:          case NOT:
                    128:          case COMPL:
                    129:          case ADDROF:
                    130:          case G_ADDROF:
                    131:          case PLUS:
                    132:          case MINUS:
                    133:          case MUL:
                    134:          case DIV:
                    135:          case MOD:
                    136:          case LS:
                    137:          case RS:
                    138:          case AND:
                    139:          case OR:
                    140:          case ER:
                    141:          case ANDAND:
                    142:          case OROR:
                    143:          case ASOR: 
                    144:          case ASER: 
                    145:          case ASAND:
                    146:          case ASPLUS:
                    147:          case ASMINUS:
                    148:          case ASMUL:
                    149:          case ASMOD:
                    150:          case ASDIV:
                    151:          case ASLS:
                    152:          case ASRS:
                    153:          case DECR:
                    154:          case INCR:
                    155:          case NEW:     /*- the placement expression list hangs off e2 -*/
                    156:            return 1;
                    157:          case TEXT:
                    158:            return 3;
                    159:          case NAME:
                    160:          case TNAME:
                    161:            /* The n_initializer field is used for TNAMEs when describing base */
                    162:            /* class initializations. The TNAME refers to the base class, and */
                    163:            /* the actuals arguments are hung off the n_initializer list */
                    164:            return 4;
                    165:          default: return discrim_none_valid;
                    166:        }
                    167:       case 3:                  /* tp2, fct_name, cond, mem, as_type, n_table, il, query_this */
                    168:        switch(base) {
                    169:          case VALUE:
                    170:          case SIZEOF:
                    171:          case NEW:
                    172:          case GNEW:    
                    173:          case CAST:
                    174:            return 1;
                    175:          case CALL:
                    176:          case G_CALL:
                    177:            return 2;
                    178:          case QUEST:
                    179:            return 3;
                    180:          case REF:
                    181:          case DOT:
                    182:          case MDOT: 
                    183:            return 4;
                    184:          case ASOR: 
                    185:          case ASER: 
                    186:          case ASAND:
                    187:          case ASPLUS:
                    188:          case ASMINUS:
                    189:          case ASMUL:
                    190:          case ASMOD:
                    191:          case ASDIV:
                    192:          case ASLS:
                    193:          case ASRS:
                    194:          case DECR:
                    195:          case INCR:
                    196:          case ASSIGN:
                    197:            return 5;
                    198: 
                    199:          case NAME:
                    200:          case TNAME:
                    201: if (Pname(this)->n_oper==TYPE &&
                    202: (strcmp(Pname(this)->string, "_type")==0)) {
                    203: // error('d',"string %s n_oper: %k", string, Pname(this)->n_oper);
                    204: return 3;
                    205: }
                    206:            return 6;
                    207: 
                    208:          case ICALL:
                    209:          case ANAME: 
                    210:            return 7;
                    211: 
                    212:          default: return discrim_none_valid;
                    213:        }
                    214:            
                    215:       default:
                    216:        return discrim_bad_index;
                    217:     }
                    218: }
                    219: 
                    220: int name::discriminator (int which_union)
                    221: {
                    222:     switch(which_union) {
                    223:       case 0:                  /* n_qualifier, n_realscope */
                    224:        if(base == LABEL) return 2;
                    225:        else return 1;
                    226:       default:
                    227:        return discrim_bad_index;
                    228:     }
                    229: }
                    230: 
                    231: int stmt::discriminator (int which_union)
                    232: {
                    233:     switch(which_union) {
                    234:       case 0:                  /* d, e2, has_default, case_value, ret_tp */
                    235:        switch(base) {
                    236:          case BLOCK:
                    237:          case GOTO:
                    238:          case LABEL:
                    239:          case DCL:
                    240:            return 1;
                    241:          case FOR:
                    242:            return 2;
                    243:          case SWITCH:
                    244:            return 3;
                    245:          case PAIR:
                    246:          case RETURN:
                    247:            return 4;
                    248:          default: return discrim_none_valid;
                    249:        }
                    250:       case 1:                  /* e, own_tbl, s2 */
                    251:        switch(base) {
                    252:          case FOR:
                    253:          case IF:
                    254:          case WHILE:
                    255:          case DO:
                    256:          case RETURN:
                    257:          case SWITCH:
                    258:          case SM:
                    259:          case SM_PARAM:
                    260:          case CASE:
                    261:            return 1;
                    262:          case BLOCK:
                    263:            return 2;
                    264:          case PAIR:
                    265:            return 3;
                    266:          default:
                    267:            return discrim_none_valid;
                    268:        }
                    269:       case 2:                  /* for_init, else_stmt, case_list */
                    270:        switch(base) {
                    271:          case FOR:
                    272:            return 1;
                    273:          case IF:
                    274:            return 2;
                    275:          case SWITCH:
                    276:          case CASE:
                    277:            return 3;
                    278:          default:
                    279:            return discrim_none_valid;
                    280:        }
                    281:       default:
                    282:        return discrim_bad_index;
                    283:     }
                    284: }
                    285: 
                    286: static node_class token_to_class_map[DUMMY_LAST_NODE];
                    287: static char map_initialized;
                    288: 
                    289: node_class classify_node (Pnode node, int& error)
                    290: {
                    291:     int ncx;
                    292:     node_class nclass;
                    293: 
                    294:     error = 0;
                    295: 
                    296:     if (! map_initialized) {
                    297:        map_initialized = 1 ;
                    298:        for(ncx = 0; ncx < sizeof (token_classes) / sizeof (token_class);
                    299:            ncx ++)
                    300:            token_to_class_map[token_classes[ncx].token]
                    301:                = token_classes[ncx].nclass;
                    302:     }
                    303: 
                    304:     if (!((node->base > 0) && (node->base < DUMMY_LAST_NODE))) {
                    305:        error = 1;
                    306:        return nc_unused;
                    307:     }
                    308: 
                    309:     nclass = token_to_class_map[node->base];
                    310: 
                    311:     switch(nclass) {
                    312:       case nc_fct:
                    313:       case nc_name:
                    314:        if(node->baseclass) nclass = nc_baseclass;
                    315:     }
                    316: 
                    317:     return nclass;
                    318: }
                    319: 
                    320: node_class classify_node (Pnode node)
                    321: {
                    322:     int err;
                    323:     node_class nclass = classify_node (node, err);
                    324:     if(err) error ('i', "failed to classify node.");
                    325:     return nclass;
                    326: }

unix.superglobalmegacorp.com

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