Annotation of researchv10no/cmd/cfront/ooptcfront/discrim.c, revision 1.1

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

unix.superglobalmegacorp.com

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