|
|
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 tree7(); ! 52: extern nodeptr yylval; /* parser's current token value */ ! 53: ! 54: /* ! 55: * Node types. ! 56: */ ! 57: ! 58: #define N_Activat 1 /* activation control structure */ ! 59: #define N_Alt 2 /* alternation operator */ ! 60: #define N_Augop 3 /* augmented operator */ ! 61: #define N_Bar 4 /* generator control structure */ ! 62: #define N_Binop 5 /* other binary operator */ ! 63: #define N_Break 6 /* break statement */ ! 64: #define N_Case 7 /* case statement */ ! 65: #define N_Ccls 8 /* case clause */ ! 66: #define N_Clist 9 /* list of case clauses */ ! 67: #define N_Conj 10 /* conjunction operator */ ! 68: #define N_Create 11 /* create control structure */ ! 69: #define N_Cset 12 /* cset literal */ ! 70: #define N_Elist 14 /* list of expressions */ ! 71: #define N_Empty 15 /* empty expression or statement */ ! 72: #define N_Field 16 /* record field reference */ ! 73: #define N_Id 17 /* identifier token */ ! 74: #define N_If 18 /* if-then-else statement */ ! 75: #define N_Int 19 /* integer literal */ ! 76: #define N_Invok 20 /* procedure call */ ! 77: #define N_Key 21 /* keyword */ ! 78: #define N_Limit 22 /* LIMIT control structure */ ! 79: #define N_List 23 /* [ ... ] style list */ ! 80: #define N_Loop 24 /* while, until, every, or repeat */ ! 81: #define N_Not 25 /* not prefix control structure */ ! 82: #define N_Next 26 /* next statement */ ! 83: #define N_Op 27 /* operator token */ ! 84: #define N_Proc 28 /* procedure */ ! 85: #define N_Real 29 /* real literal */ ! 86: #define N_Res 30 /* reserved word token */ ! 87: #define N_Ret 31 /* fail, return, or succeed */ ! 88: #define N_Scan 32 /* scan-using statement */ ! 89: #define N_Sect 33 /* s[i:j] (section) */ ! 90: #define N_Slist 34 /* list of statements */ ! 91: #define N_Str 35 /* string literal */ ! 92: #define N_Susp 36 /* suspend statement */ ! 93: #define N_To 37 /* TO operator */ ! 94: #define N_ToBy 38 /* TO-BY operator */ ! 95: #define N_Unop 39 /* unary operator */ ! 96: ! 97: /* ! 98: * Node constructor macros. ! 99: */ ! 100: ! 101: #define ActivNode(a,b,c) tree6(N_Activat,Line(a),Col(a),a,b,c) ! 102: #define AltNode(a,b,c) tree5(N_Alt,Line(a),Col(a),b,c) ! 103: #define AugopNode(a,b,c) tree6(N_Augop,Line(a),Col(a),a,b,c) ! 104: #define BarNode(a) tree4(N_Bar,Line(a),Col(a),a) ! 105: #define BinopNode(a,b,c) tree6(N_Binop,Line(a),Col(a),a,b,c) ! 106: #define BreakNode(a,b) tree4(N_Break,Line(a),Col(a),b) ! 107: #define CaseNode(a,b,c) tree5(N_Case,Line(a),Col(a),b,c) ! 108: #define CclsNode(a,b,c) tree5(N_Ccls,Line(a),Col(a),b,c) ! 109: #define ClistNode(a,b,c) tree5(N_Clist,Line(a),Col(a),b,c) ! 110: #define ConjNode(a,b,c) tree6(N_Conj,Line(a),Col(a),a,b,c) ! 111: #define CreateNode(a,b) tree4(N_Create,Line(a),Col(a),b) ! 112: #define CsetNode(a,b) tree5(N_Cset,tline,tcol,a,b) ! 113: #define ElistNode(a,b,c) tree5(N_Elist,Line(a),Col(a),b,c) ! 114: #define EmptyNode tree1(N_Empty) ! 115: #define FieldNode(a,b,c) tree5(N_Field,Line(a),Col(a),b,c) ! 116: #define IdNode(a) tree4(N_Id,tline,tcol,a) ! 117: #define IfNode(a,b,c,d) tree6(N_If,Line(a),Col(a),b,c,d) ! 118: #define IntNode(a) tree4(N_Int,tline,tcol,a) ! 119: #define InvokNode(a,b,c) tree5(N_Invok,Line(a),Col(a),b,c) ! 120: #define KeyNode(a,b) tree4(N_Key,Line(a),Col(a),b) ! 121: #define LimitNode(a,b) tree5(N_Limit,Line(a),Col(a),a,b) ! 122: #define ListNode(a,b) tree4(N_List,Line(a),Col(a),b) ! 123: #define LoopNode(a,b,c) tree6(N_Loop,Line(a),Col(a),a,b,c) ! 124: #define NotNode(a) tree4(N_Not,Line(a),Col(a),a) ! 125: #define NextNode(a) tree3(N_Next,Line(a),Col(a)) ! 126: #define OpNode(a) tree4(N_Op,tline,tcol,a) ! 127: #define ProcNode(a,b,c,d) tree7(N_Proc,Line(a),Col(a),a,b,c,d) ! 128: #define RealNode(a) tree4(N_Real,tline,tcol,a) ! 129: #define ResNode(a) tree4(N_Res,tline,tcol,a) ! 130: #define RetNode(a,b) tree5(N_Ret,Line(a),Col(a),a,b) ! 131: #define ScanNode(a,b,c) tree6(N_Scan,Line(a),Col(a),a,b,c) ! 132: #define SectNode(a,b,c,d) tree7(N_Sect,Line(a),Col(a),a,b,c,d) ! 133: #define SListNode(a,b,c) tree5(N_Slist,Line(a),Col(a),b,c) ! 134: #define StrNode(a,b) tree5(N_Str,tline,tcol,a,b) ! 135: #define SuspNode(a,b) tree4(N_Susp,Line(a),Col(a),b) ! 136: #define ToByNode(a,b,c,d) tree6(N_ToBy,Line(a),Col(a),b,c,d) ! 137: #define ToNode(a,b,c) tree5(N_To,Line(a),Col(a),b,c) ! 138: #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.