1: /* 2: * Structure of a tree node. 3: */ 4: 5: typedef struct node *nodeptr; 6: 7: struct node { 8: int n_type; /* node type */ 9: int n_line; /* line number in source program */ 10: int n_col; /* column number in source program */ 11: union { 12: int n_val; /* integer-valued fields */ 13: char *n_str; /* string-valued fields */ 14: nodeptr n_ptr; /* subtree pointers */ 15: } n_field[4]; 16: }; 17: 18: /* 19: * Macros to access fields of parse tree nodes. 20: */ 21: 22: #define TYPE(t) t->n_type 23: #define LINE(t) t->n_line 24: #define COL(t) t->n_col 25: #define TREE0(t) t->n_field[0].n_ptr 26: #define TREE1(t) t->n_field[1].n_ptr 27: #define TREE2(t) t->n_field[2].n_ptr 28: #define TREE3(t) t->n_field[3].n_ptr 29: #define VAL0(t) t->n_field[0].n_val 30: #define VAL1(t) t->n_field[1].n_val 31: #define VAL2(t) t->n_field[2].n_val 32: #define VAL3(t) t->n_field[3].n_val 33: #define STR0(t) t->n_field[0].n_str 34: #define STR1(t) t->n_field[1].n_str 35: #define STR2(t) t->n_field[2].n_str 36: #define STR3(t) t->n_field[3].n_str 37: 38: /* 39: * External declarations. 40: */ 41: 42: extern nodeptr tree; /* parse tree space */ 43: extern nodeptr tfree; /* free pointer for tree space */ 44: extern nodeptr tend; /* end of tree space */ 45: extern int tsize; /* parse tree size (integers) */ 46: extern nodeptr tree1(); /* tree node allocator routines */ 47: extern nodeptr tree3(); 48: extern nodeptr tree4(); 49: extern nodeptr tree5(); 50: extern nodeptr tree6(); 51: extern nodeptr yylval; /* parser's current token value */ 52: 53: /* 54: * Node types. 55: */ 56: 57: #define N_ACTIVAT 1 /* activation control structure */ 58: #define N_ALT 2 /* alternation operator */ 59: #define N_AUGOP 3 /* augmented operator */ 60: #define N_BAR 4 /* generator control structure */ 61: #define N_BINOP 5 /* other binary operator */ 62: #define N_BREAK 6 /* break statement */ 63: #define N_CASE 7 /* case statement */ 64: #define N_CCLS 8 /* case clause */ 65: #define N_CLIST 9 /* list of case clauses */ 66: #define N_CONJ 10 /* conjunction operator */ 67: #define N_CREATE 11 /* create control structure */ 68: #define N_CSET 12 /* cset literal */ 69: #define N_ELIST 14 /* list of expressions */ 70: #define N_EMPTY 15 /* empty expression or statement */ 71: #define N_FIELD 16 /* record field reference */ 72: #define N_ID 17 /* identifier token */ 73: #define N_IF 18 /* if-then-else statement */ 74: #define N_INT 19 /* integer literal */ 75: #define N_INVOK 20 /* procedure call */ 76: #define N_KEY 21 /* keyword */ 77: #define N_LIMIT 22 /* LIMIT control structure */ 78: #define N_LIST 23 /* [ ... ] style list */ 79: #define N_LOOP 24 /* while, until, every, or repeat */ 80: #define N_NOT 25 /* not prefix control structure */ 81: #define N_NEXT 26 /* next statement */ 82: #define N_OP 27 /* operator token */ 83: #define N_PROC 28 /* procedure */ 84: #define N_REAL 29 /* real literal */ 85: #define N_RES 30 /* reserved word token */ 86: #define N_RET 31 /* fail, return, or succeed */ 87: #define N_SCAN 32 /* scan-using statement */ 88: #define N_SECT 33 /* s[i:j] (section) */ 89: #define N_SLIST 34 /* list of statements */ 90: #define N_STR 35 /* string literal */ 91: #define N_SUSP 36 /* suspend statement */ 92: #define N_TO 37 /* TO operator */ 93: #define N_TOBY 38 /* TO-BY operator */ 94: #define N_UNOP 39 /* unary operator */ 95: 96: /* 97: * Node constructor macros. 98: */ 99: 100: #define ACTIVNODE(a,b,c) tree6(N_ACTIVAT,LINE(a),COL(a),a,b,c) 101: #define ALTNODE(a,b,c) tree5(N_ALT,LINE(a),COL(a),b,c) 102: #define AUGOPNODE(a,b,c) tree6(N_AUGOP,LINE(a),COL(a),a,b,c) 103: #define BARNODE(a) tree4(N_BAR,LINE(a),COL(a),a) 104: #define BINOPNODE(a,b,c) tree6(N_BINOP,LINE(a),COL(a),a,b,c) 105: #define BREAKNODE(a,b) tree4(N_BREAK,LINE(a),COL(a),b) 106: #define CASENODE(a,b,c) tree5(N_CASE,LINE(a),COL(a),b,c) 107: #define CCLSNODE(a,b,c) tree5(N_CCLS,LINE(a),COL(a),b,c) 108: #define CLISTNODE(a,b,c) tree5(N_CLIST,LINE(a),COL(a),b,c) 109: #define CONJNODE(a,b,c) tree6(N_CONJ,LINE(a),COL(a),a,b,c) 110: #define CREATENODE(a,b) tree4(N_CREATE,LINE(a),COL(a),b) 111: #define CSETNODE(a,b) tree5(N_CSET,tline,tcol,a,b) 112: #define ELISTNODE(a,b,c) tree5(N_ELIST,LINE(a),COL(a),b,c) 113: #define EMPTYNODE tree1(N_EMPTY) 114: #define FIELDNODE(a,b,c) tree5(N_FIELD,LINE(a),COL(a),b,c) 115: #define IDNODE(a) tree4(N_ID,tline,tcol,a) 116: #define IFNODE(a,b,c,d) tree6(N_IF,LINE(a),COL(a),b,c,d) 117: #define INTNODE(a) tree4(N_INT,tline,tcol,a) 118: #define INVOKNODE(a,b,c) tree5(N_INVOK,LINE(a),COL(a),b,c) 119: #define KEYNODE(a,b) tree4(N_KEY,LINE(a),COL(a),b) 120: #define LIMITNODE(a,b) tree5(N_LIMIT,LINE(a),COL(a),a,b) 121: #define LISTNODE(a,b) tree4(N_LIST,LINE(a),COL(a),b) 122: #define LOOPNODE(a,b,c) tree6(N_LOOP,LINE(a),COL(a),a,b,c) 123: #define NOTNODE(a) tree4(N_NOT,LINE(a),COL(a),a) 124: #define NEXTNODE(a) tree3(N_NEXT,LINE(a),COL(a)) 125: #define OPNODE(a) tree4(N_OP,tline,tcol,a) 126: #define PROCNODE(a,b,c,d) tree7(N_PROC,LINE(a),COL(a),a,b,c,d) 127: #define REALNODE(a) tree4(N_REAL,tline,tcol,a) 128: #define RESNODE(a) tree4(N_RES,tline,tcol,a) 129: #define RETNODE(a,b) tree5(N_RET,LINE(a),COL(a),a,b) 130: #define SCANNODE(a,b,c) tree6(N_SCAN,LINE(a),COL(a),a,b,c) 131: #define SECTNODE(a,b,c,d) tree7(N_SECT,LINE(a),COL(a),a,b,c,d) 132: #define SLISTNODE(a,b,c) tree5(N_SLIST,LINE(a),COL(a),b,c) 133: #define STRNODE(a,b) tree5(N_STR,tline,tcol,a,b) 134: #define SUSPNODE(a,b) tree4(N_SUSP,LINE(a),COL(a),b) 135: #define TOBYNODE(a,b,c,d) tree6(N_TOBY,LINE(a),COL(a),b,c,d) 136: #define TONODE(a,b,c) tree5(N_TO,LINE(a),COL(a),b,c) 137: #define UNOPNODE(a,b) tree5(N_UNOP,LINE(a),COL(a),a,b)