Annotation of researchv10no/cmd/pret/pret.expr.c, revision 1.1.1.1

1.1       root        1: #define DEBUG   0
                      2: 
                      3: #define setv    1
                      4: #define addeq   2
                      5: #define subeq   3
                      6: #define muleq   4
                      7: #define diveq   5
                      8: #define modeq   6
                      9: #define plus    7
                     10: #define minus   8
                     11: #define times   9
                     12: #define div    10
                     13: #define mod    11
                     14: #define power  12
                     15: #define uminus 13
                     16: #define gt     14
                     17: #define lt     15
                     18: #define ge     16
                     19: #define le     17
                     20: #define eq     18
                     21: #define ne     19
                     22: #define land   20
                     23: #define lor    21
                     24: #define lnot   22
                     25: #define princ  23
                     26: #define prdec  24
                     27: #define poinc  25
                     28: #define podec  26
                     29: 
                     30: #define OP     0
                     31: #define NM     1
                     32: 
                     33: #define unary(c)       (c == uminus || c == lnot || c >= princ)
                     34: #define binary(c)      !unary(c)
                     35: 
                     36: struct REVPOL {
                     37:        char toktyp;
                     38:        short tokval;
                     39: } *parsed;
                     40: 
                     41: int prs = 0;
                     42: extern int verbose;
                     43: char * Emalloc();
                     44: 
                     45: pushnm(tok)
                     46: {      if (prs >= EXPRMAX)
                     47:                whoops("expression too long");
                     48:        parsed[prs].toktyp = NM;
                     49:        parsed[prs++].tokval = tok;
                     50: }
                     51: 
                     52: pushop(tok)
                     53: {      if (prs >= EXPRMAX)
                     54:                whoops("expression too long");
                     55:        parsed[prs].toktyp = OP;
                     56:        parsed[prs++].tokval = tok;
                     57: }
                     58: 
                     59: struct Node *
                     60: newnode(ntyp, nval, left, right)
                     61:        struct Node *left, *right;
                     62: {
                     63:        struct Node *try;
                     64: 
                     65:        try = (struct Node *) Emalloc(sizeof(struct Node));
                     66:        try->ntyp = ntyp;
                     67:        try->nval = nval;
                     68:        try->left = left;
                     69:        try->right = right;
                     70:        return try;
                     71: }
                     72: 
                     73: makeexpr(n)
                     74: {      pushexpr(n);
                     75:        return -(2 + addrevpol());
                     76: }
                     77: 
                     78: pushexpr(n)
                     79:        struct Node *n;
                     80: {
                     81:        if (n == NULL) return;
                     82:        switch (n->ntyp) {
                     83:        case NM: pushnm(n->nval); break;
                     84:        case OP: pushexpr(n->left); pushexpr(n->right); pushop(n->nval); break;
                     85:        default: whoops("unknown node type");
                     86:        }
                     87: }
                     88: 
                     89: struct {
                     90:        short n;
                     91:        struct REVPOL *p;
                     92: } revpols[MANY];
                     93: 
                     94: int npols = 0;
                     95: 
                     96: numexps(fd)
                     97:        FILE *fd;
                     98: { int i, j;
                     99:   struct REVPOL *p;
                    100: 
                    101:        fprintf(fd, "EXPR %d\n", npols);
                    102:        for (i = 0; i < npols; i++)
                    103:        {       fprintf(fd, "%d: ", revpols[i].n);
                    104:                p = revpols[i].p;
                    105:                for (j = (revpols[i].n)-1; j >= 0; j--)
                    106:                        fprintf(fd, "%d/%d ", p[j].toktyp, p[j].tokval);
                    107:                putc('\n', fd);
                    108: }      }
                    109: 
                    110: findsame(a)
                    111: {      struct REVPOL *p, *q;
                    112:        int k = revpols[a].n;
                    113:        int i, j;
                    114: 
                    115:        q = revpols[a].p;
                    116:        for (i = 0; i < npols; i++)
                    117:        {       if (revpols[i].n != revpols[a].n)
                    118:                        continue;
                    119:                p = revpols[i].p;
                    120:                for (j = 0; j < k; j++)
                    121:                        if (p[j].toktyp != q[j].toktyp
                    122:                        ||  p[j].tokval != q[j].tokval)
                    123:                                break;
                    124:                if (j == k)
                    125:                        break;
                    126:        }
                    127:        return i;
                    128: }
                    129: 
                    130: addrevpol()
                    131: { int i;
                    132:   int retval;
                    133: 
                    134:        if (npols >= MANY)
                    135:                whoops("too many expressions");
                    136: 
                    137:        revpols[npols].n = prs;
                    138:        revpols[npols].p = parsed;
                    139: 
                    140:        if ((retval = findsame(npols)) == npols)
                    141:                npols++;
                    142: 
                    143: #if 0
                    144:        printf("exp(%d): ", prs);
                    145:        for (i = prs-1; i >= 0; i--)
                    146:        {       if (parsed[i].toktyp == NM)
                    147:                {       printf("%d ", parsed[i].tokval);
                    148:                        continue;
                    149:                }
                    150:                switch(parsed[i].tokval) {
                    151:                case setv:      printf("= "); break;
                    152:                case addeq:     printf("+= "); break;
                    153:                case subeq:     printf("-= "); break;
                    154:                case muleq:     printf("*= "); break;
                    155:                case diveq:     printf("/= "); break;
                    156:                case modeq:     printf("%= "); break;
                    157:                case plus:      printf("+ "); break;
                    158:                case minus:     printf("- "); break;
                    159:                case times:     printf("* "); break;
                    160:                case div:       printf("/ "); break;
                    161:                case mod:       printf("% "); break;
                    162:                case power:     printf("^ "); break;
                    163:                case uminus:    printf(".- "); break;
                    164:                case gt:        printf("> "); break;
                    165:                case lt:        printf("< "); break;
                    166:                case ge:        printf(">= "); break;
                    167:                case le:        printf("<= "); break;
                    168:                case eq:        printf("== "); break;
                    169:                case ne:        printf("!= "); break;
                    170:                case land:      printf("&& "); break;
                    171:                case lor:       printf("|| "); break;
                    172:                case lnot:      printf("! "); break;
                    173:                case princ:     printf("++. "); break;
                    174:                case prdec:     printf("--. "); break;
                    175:                case poinc:     printf(".++ "); break;
                    176:                case podec:     printf(".-- "); break;
                    177:                default:        fprintf(stderr, "%d", parsed[i].tokval);
                    178:                                whoops("unknown operator");
                    179:                }
                    180:        }
                    181:        putchar('\n');
                    182: #endif
                    183:        parsed = (struct REVPOL *) Emalloc(EXPRMAX * sizeof(struct REVPOL));
                    184:        prs = 0;
                    185: 
                    186:        return retval;
                    187: }

unix.superglobalmegacorp.com

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