Annotation of 43BSD/contrib/B/src/bint/b2ana.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: 
        !             3: /* $Header: b2ana.c,v 1.4 85/08/22 16:54:05 timo Exp $ */
        !             4: 
        !             5: /* Prepare for code generation -- find out which tags are targets */
        !             6: 
        !             7: #include "b.h"
        !             8: #include "b1obj.h"
        !             9: #include "b2nod.h"
        !            10: #include "b2gen.h" /* Must be after b2nod.h */
        !            11: #include "b3err.h"
        !            12: #include "b3env.h"
        !            13: #include "b3sou.h" /* For get_pname */
        !            14: 
        !            15: 
        !            16: Visible int nextvarnumber; /* Counts local targets (including formals) */
        !            17: 
        !            18: Visible value formals, locals, globals, mysteries, refinements;
        !            19: 
        !            20: 
        !            21: Visible value *setup(t) parsetree t; {
        !            22:        typenode n= Nodetype(t);
        !            23:        bool in_prmnv= !Unit(n);
        !            24:        nextvarnumber= 0;
        !            25:        formals= mk_elt();
        !            26:        mysteries= mk_elt();
        !            27:        if (in_prmnv) {
        !            28:                globals= copy(prmnv->tab);
        !            29:                locals= Vnil;
        !            30:                refinements= mk_elt();
        !            31:                return Command(n) ? &globals : Pnil;
        !            32:        } else {
        !            33:                globals= mk_elt();
        !            34:                locals= mk_elt();
        !            35:                refinements=
        !            36:                    copy(*Branch(t, n == HOW_TO ? HOW_R_NAMES : FPR_R_NAMES));
        !            37:                unit_context(t);
        !            38:                return &locals;
        !            39:        }
        !            40: }
        !            41: 
        !            42: Hidden Procedure unit_context(t) parsetree t; {
        !            43:        cntxt= In_unit;
        !            44:        release(uname); uname= get_pname(t);
        !            45: }
        !            46: 
        !            47: Visible Procedure cleanup() {
        !            48:        release(formals);
        !            49:        release(locals);
        !            50:        release(globals);
        !            51:        release(mysteries);
        !            52:        release(refinements);
        !            53: }
        !            54: 
        !            55: /* ********************************************************************        */
        !            56: 
        !            57: /* Analyze parse tree, finding the targets and formal parameters.
        !            58:    Formal parameters of HOW'TO's are of course found in the unit heading.
        !            59:    Formal parameters of YIELDs and TESTs are treated as local targets.
        !            60:    Global targets are also easily found: they are mentioned in a SHARE command.
        !            61:    Local targets appear on their own or in collateral forms after PUT IN,
        !            62:    DRAW or CHOOSE, or as bound tags after FOR, SOME, EACH or NO.
        !            63:    Note that DELETE x, REMOVE e FROM x, or PUT e IN x[k] (etc.) don't
        !            64:    introduce local targets, because in all these cases x must have been
        !            65:    initialized first.  This speeds up our task of finding targets,
        !            66:    since we don't have to visit all nodes: only nodes that may contain
        !            67:    commands or tests, and the positions mentioned here, need be visited.
        !            68:    (And of course unit headings).
        !            69:    We don't have to look for refinements since these are already known
        !            70:    from the unit heading.
        !            71:  */
        !            72: 
        !            73: Hidden Procedure a_tag(name, targs) value name; value *targs; {
        !            74:        value *aa; int varnumber;
        !            75:        if (locals != Vnil && envassoc(locals, name)) return;
        !            76:        if (envassoc(globals, name)) return;
        !            77:        if (envassoc(formals, name)) return;
        !            78:        if (envassoc(refinements, name)) {
        !            79:                if (targs != &mysteries)
        !            80:                        fixerr(MESS(4600, "a refinement may not be used as a target"));
        !            81:                return;
        !            82:        }
        !            83:        if (aa= envassoc(mysteries, name)) {
        !            84:                if (targs == &mysteries) return;
        !            85:                varnumber= SmallIntVal(*aa);
        !            86:                e_delete(&mysteries, name);
        !            87:        }
        !            88:        else if (targs != &globals) varnumber= nextvarnumber++;
        !            89:        else varnumber= 0;
        !            90:        e_replace(MkSmallInt(varnumber), targs, name);
        !            91: }
        !            92: 
        !            93: Hidden Procedure a_fpr_formals(t) parsetree t; {
        !            94:        typenode n= Nodetype(t);
        !            95:        switch (n) {
        !            96:        case TAG:
        !            97:                break;
        !            98:        case MONF: case MONPRD:
        !            99:                analyze(*Branch(t, MON_RIGHT), &locals);
        !           100:                break;
        !           101:        case DYAF: case DYAPRD:
        !           102:                analyze(*Branch(t, DYA_LEFT), &locals);
        !           103:                analyze(*Branch(t, DYA_RIGHT), &locals);
        !           104:                break;
        !           105:        default: syserr(MESS(4601, "a_fpr_formals"));
        !           106:        }
        !           107: }
        !           108: 
        !           109: Visible Procedure analyze(t, targs) parsetree t; value *targs; {
        !           110:        typenode nt; string s; char c; int n, k, len; value v;
        !           111:        if (!Is_node(t) || !still_ok) return;
        !           112:        nt= Nodetype(t);
        !           113:        if (nt < 0 || nt >= NTYPES) syserr(MESS(4602, "analyze bad tree"));
        !           114:        s= gentab[nt];
        !           115:        if (s == NULL) return;
        !           116:        n= First_fieldnr;
        !           117:        while ((c= *s++) != '\0' && still_ok) {
        !           118:                switch (c) {
        !           119:                case '0':
        !           120:                case '1':
        !           121:                case '2':
        !           122:                case '3':
        !           123:                case '4':
        !           124:                case '5':
        !           125:                case '6':
        !           126:                case '7':
        !           127:                case '8':
        !           128:                case '9':
        !           129:                        n= (c - '0') + First_fieldnr;
        !           130:                        break;
        !           131:                case 'c':
        !           132:                        v= *Branch(t, n);
        !           133:                        if (v != Vnil) {
        !           134:                                len= Nfields(v);
        !           135:                                for (k= 0; k < len; ++k)
        !           136:                                        analyze(*Field(v, k), targs);
        !           137:                        }
        !           138:                        ++n;
        !           139:                        break;
        !           140:                case '#':
        !           141:                        curlino= *Branch(t, n);
        !           142:                        /* Fall through */
        !           143:                case 'l':
        !           144:                case 'v':
        !           145:                        ++n;
        !           146:                        break;
        !           147:                case 'm':
        !           148:                        analyze(*Branch(t, n), &mysteries);
        !           149:                        ++n;
        !           150:                        break;
        !           151:                case 'g':
        !           152:                        analyze(*Branch(t, n), &globals);
        !           153:                        ++n;
        !           154:                        break;
        !           155:                case '!':
        !           156:                        analyze(*Branch(t, n),
        !           157:                                locals != Vnil ? &locals : &globals);
        !           158:                        ++n;
        !           159:                        break;
        !           160:                case 'x':
        !           161:                        curline= *Branch(t, n);
        !           162:                        /* Fall through */
        !           163:                case 'a':
        !           164:                case 'u':       
        !           165:                        analyze(*Branch(t, n), targs);
        !           166:                        ++n;
        !           167:                        break;
        !           168:                case 't':
        !           169:                        analyze(*Branch(t, n), Pnil);
        !           170:                        ++n;
        !           171:                        break;
        !           172:                case 'f':
        !           173:                        a_fpr_formals(*Branch(t, n));
        !           174:                        ++n;
        !           175:                        break;
        !           176:                case 'h':
        !           177:                        v= *Branch(t, n);
        !           178:                        if (v != Vnil && Is_text(v))
        !           179:                                a_tag(v, &formals);
        !           180:                        else
        !           181:                                analyze(v, &formals);
        !           182:                        ++n;
        !           183:                        break;
        !           184:                case '=':
        !           185:                        *Branch(t, n)= MkSmallInt(nextvarnumber);
        !           186:                        ++n;
        !           187:                        break;
        !           188:                case 'T':
        !           189:                        if (targs != Pnil)
        !           190:                                a_tag((value)*Branch(t, TAG_NAME), targs);
        !           191:                        break;
        !           192:                }
        !           193:        }
        !           194: }
        !           195: 
        !           196: /* ********************************************************************        */
        !           197: 
        !           198: /* Table describing the actions of the fixer for each node type */
        !           199: 
        !           200: 
        !           201: /*
        !           202:        LIST OF CODES AND THEIR MEANING
        !           203: 
        !           204:        char    fix             n?      analyze
        !           205: 
        !           206:        0-9                     n= c-'0'
        !           207: 
        !           208:        #       set curlino     ++n     set curlino
        !           209:        =                       ++n     set to nextvarnum
        !           210:        !       locate          ++n     analyze; force targs= &local
        !           211:        a       locate          ++n     analyze
        !           212:        c       collateral      ++n     analyze collateral
        !           213:        f       fpr_formals     ++n     a_fpr_formals
        !           214:        g                       ++n     global
        !           215:        h                       ++n     how'to formal
        !           216:        l       locate          ++n
        !           217:        m       actual param    ++n     mystery
        !           218:        t       test            ++n     analyze; set targs= 0
        !           219:        u       unit            ++n     analyze
        !           220:        v       evaluate        ++n
        !           221:        x       execute         ++n     analyze
        !           222: 
        !           223:        ?       special code for UNPARSED
        !           224:        C       special code for comparison
        !           225:        D       special code for DYAF
        !           226:        E       special code for DYAPRD
        !           227:        G       jumpto(l1)
        !           228:        H       here(&l1)
        !           229:        I       if (*Branch(t, n) != NilTree) jump2here(t)
        !           230:        J       jump2here(t)
        !           231:        K       hold(&st)
        !           232:        L       let_go(&st)
        !           233:        M       special code for MONF
        !           234:        N       special code for MONPRD
        !           235:        R       if (!reachable()) error("command cannot be reached")
        !           236:        S       jumpto(Stop)
        !           237:        T       special code for TAG
        !           238:        U       special code for user-defined-command
        !           239:        V       visit(t)
        !           240:        W       visit2(t, seterr(1))
        !           241:        X       visit(t) or lvisit(t) depending on flag
        !           242:        Y       special code for YIELD/TEST
        !           243:        Z       special code for refinement
        !           244:         
        !           245: */
        !           246: 
        !           247: 
        !           248: Visible string gentab[]= {
        !           249: 
        !           250:        /* HOW_TO */ "1h3xSu6=",
        !           251:        /* YIELD */ "2fV4xYu7=",
        !           252:        /* TEST */ "2fV4xYu7=",
        !           253:        /* REFINEMENT */ "H2xZSu",
        !           254: 
        !           255:        /* Commands */
        !           256: 
        !           257:        /* SUITE */ "#RVx3x",
        !           258:        /* PUT */ "vaV",
        !           259:        /* INSERT */ "vlV",
        !           260:        /* REMOVE */ "vlV",
        !           261:        /* CHOOSE */ "avV",
        !           262:        /* DRAW */ "aV",
        !           263:        /* SET_RANDOM */ "vV",
        !           264:        /* DELETE */ "lV",
        !           265:        /* CHECK */ "tV",
        !           266:        /* SHARE */ "g",
        !           267: 
        !           268:        /* WRITE */ "1vV",
        !           269:        /* READ */ "avV",
        !           270:        /* READ_RAW */ "aV",
        !           271: 
        !           272:        /* IF */ "tV2xJ",
        !           273:        /* WHILE */ "HtV2xGJ",
        !           274:        /* FOR */ "avHV3xGJ",
        !           275: 
        !           276:        /* SELECT */ "1x",
        !           277:        /* TEST_SUITE */ "#tW3xKIxL",
        !           278:        /* ELSE */ "#2x",
        !           279: 
        !           280:        /* QUIT */ "VS",
        !           281:        /* RETURN */ "vVS",
        !           282:        /* REPORT */ "tVS",
        !           283:        /* SUCCEED */ "VS",
        !           284:        /* FAIL */ "VS",
        !           285: 
        !           286:        /* USER_COMMAND */ "1mUV",
        !           287:        /* EXTENDED_COMMAND */ "1cV",
        !           288: 
        !           289:        /* Expressions, targets, tests */
        !           290: 
        !           291:        /* TAG */ "T",
        !           292:        /* COMPOUND */ "a",
        !           293: 
        !           294:        /* Expressions, targets */
        !           295: 
        !           296:        /* COLLATERAL */ "cX",
        !           297:        /* SELECTION */ "lvX",
        !           298:        /* BEHEAD */ "lvX",
        !           299:        /* CURTAIL */ "lvX",
        !           300: 
        !           301:        /* Expressions, tests */
        !           302: 
        !           303:        /* UNPARSED */ "?",
        !           304: 
        !           305:        /* Expressions */
        !           306: 
        !           307:        /* MONF */ "M1vV",
        !           308:        /* DYAF */ "Dv2vV",
        !           309:        /* NUMBER */ "V",
        !           310:        /* TEXT_DIS */ "1v",
        !           311:        /* TEXT_LIT */ "1vV",
        !           312:        /* TEXT_CONV */ "vvV",
        !           313:        /* ELT_DIS */ "V",
        !           314:        /* LIST_DIS */ "cV",
        !           315:        /* RANGE_DIS */ "vvV",
        !           316:        /* TAB_DIS */ "cV",
        !           317: 
        !           318:        /* Tests */
        !           319: 
        !           320:        /* AND */ "tVtJ",
        !           321:        /* OR */ "tVtJ",
        !           322:        /* NOT */ "tV",
        !           323:        /* SOME_IN */ "!vHVtGJ",
        !           324:        /* EACH_IN */ "!vHVtGJ",
        !           325:        /* NO_IN */ "!vHVtGJ",
        !           326:        /* SOME_PARSING */ "!vHVtGJ",
        !           327:        /* EACH_PARSING */ "!vHVtGJ",
        !           328:        /* NO_PARSING */ "!vHVtGJ",
        !           329:        /* MONPRD */ "N1vV",
        !           330:        /* DYAPRD */ "Ev2vV",
        !           331:        /* LESS_THAN */ "vvVC",
        !           332:        /* AT_MOST */ "vvVC",
        !           333:        /* GREATER_THAN */ "vvVC",
        !           334:        /* AT_LEAST */ "vvVC",
        !           335:        /* EQUAL */ "vvVC",
        !           336:        /* UNEQUAL */ "vvVC",
        !           337:        /* Nonode */ "",
        !           338: 
        !           339:        /* TAGformal */ "T",
        !           340:        /* TAGlocal */ "T",
        !           341:        /* TAGglobal */ "T",
        !           342:        /* TAGmystery */ "T",
        !           343:        /* TAGrefinement */ "T",
        !           344:        /* TAGzerfun */ "T",
        !           345:        /* TAGzerprd */ "T",
        !           346: 
        !           347:        /* ACTUAL */ "1mm",
        !           348:        /* FORMAL */ "1hh",
        !           349: };

unix.superglobalmegacorp.com

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