Annotation of researchv10no/cmd/twig/examples/prefix.mt, revision 1.1.1.1

1.1       root        1: prologue {
                      2: #include <stdio.h>
                      3: #include <ctype.h>
                      4: typedef        struct node *   NODEPTR;
                      5: #define        COST            int
                      6: #define        INFINITY        1000000
                      7: #define DEFAULT_COST   0
                      8: #define COSTLESS(x,y)  ((x)<(y))
                      9: 
                     10: NODEPTR Root;
                     11: struct node {
                     12:        char op;                /* '\0' if node is a leaf */
                     13:        NODEPTR left, right;
                     14:        char id;
                     15:        int mark;
                     16: };
                     17: 
                     18: }; /* end of prologue */
                     19: 
                     20: node   nOp nIdent;
                     21: label  lExpr;
                     22: 
                     23: lExpr: nIdent
                     24:        = { putchar($$->id); };
                     25: 
                     26: lExpr: nOp(lExpr,lExpr)
                     27:        { TOPDOWN; }
                     28:        = {
                     29:                putchar($$->op);
                     30:                tDO($%1$); tDO($%2$);
                     31:        };
                     32: 
                     33: insert {
                     34: 
                     35: mtValue(root)
                     36:        NODEPTR root;
                     37: {
                     38:        if(root==NULL)
                     39:                return(0);
                     40:        if(root->op==0)
                     41:                return(nIdent);
                     42:        else
                     43:                return(nOp);
                     44: }
                     45: 
                     46: NODEPTR
                     47: mtGetNodes(r,n)
                     48:        NODEPTR r;
                     49:        int n;
                     50: {
                     51:        if(r==NULL)
                     52:                if(n==1)
                     53:                        return(Root);
                     54:                else
                     55:                        return(NULL);
                     56:        if(n==1)
                     57:                return(r->left);
                     58:        else if(n==2)
                     59:                return(r->right);
                     60:        else return(NULL);
                     61: }
                     62: 
                     63: mtSetNodes(r,n,c)
                     64:        NODEPTR r,c;
                     65:        int n;
                     66: {
                     67:        if(r==NULL && n==1) {
                     68:                Root = c;
                     69:                return;
                     70:        }
                     71:        if(n==1)
                     72:                r->left = c;
                     73:        else if(n==2)
                     74:                r->right = c;
                     75: }
                     76: 
                     77: syntax_error()
                     78: {
                     79:        printf("syntax error\n");
                     80:        exit(1);
                     81: }
                     82: 
                     83: /* allocated a node */
                     84: NODEPTR
                     85: getnode(op,id)
                     86:        char op,id;
                     87: {
                     88:        NODEPTR n;
                     89:        n = (NODEPTR) malloc(sizeof(struct node));
                     90:        n->op = op;
                     91:        n->left = n->right = NULL;
                     92:        n->id = id;
                     93:        return(n);
                     94: }
                     95: 
                     96: NODEPTR
                     97: gettree()
                     98: {
                     99:        char c;
                    100:        NODEPTR n = NULL;
                    101: 
                    102:        c = getchar();
                    103:        if(c==EOF) 
                    104:                syntax_error();
                    105: 
                    106:        n = getnode(0,0);
                    107: 
                    108:        /* build node for left operand */
                    109:        if(c=='(')
                    110:                n->left = gettree();
                    111:        else
                    112:                n->left = getnode(0,c);
                    113: 
                    114:        c = getchar();
                    115:        if(strchr("+-*/",c)==NULL)
                    116:                syntax_error();
                    117:        n->op = c;
                    118: 
                    119:        c = getchar();
                    120:        /* build node for right operand */
                    121:        if(c=='(')
                    122:                n->right = gettree();
                    123:        else
                    124:                n->right = getnode(0,c);
                    125: 
                    126:        c = getchar();
                    127:        if(c!=')') 
                    128:                syntax_error();
                    129: 
                    130:        return(n);
                    131: }
                    132: 
                    133: main()
                    134: {
                    135:        char c;
                    136:        _matchinit();           /* initialize the matcher */
                    137: 
                    138:        /* get the initial ( */
                    139:        c = getchar();
                    140:        if(c!='(')
                    141:                syntax_error();
                    142: 
                    143:        Root = gettree();
                    144:        _match();
                    145:        putchar('\n');
                    146: }
                    147: printTree(x)
                    148: {}
                    149: 
                    150: 
                    151: };     /* of insert */

unix.superglobalmegacorp.com

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