|
|
1.1 ! root 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)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.