node.om (5764B)
1 struct node { 2 kind: int; 3 a: *node; 4 b: *node; 5 filename: *byte; 6 lineno: int; 7 colno: int; 8 n: int; 9 s: *byte; 10 t: *type; 11 } 12 13 enum { 14 N_IDENT, 15 N_NUM, 16 N_CHAR, 17 N_STR, 18 N_NIL, 19 N_STMTLIST, 20 N_EXPRLIST, 21 N_CALL, 22 N_TYPELIST, 23 N_DOT, 24 N_ARGLIST, 25 N_FUNC, 26 N_ARGDECL, 27 N_FUNCDECL, 28 N_PROGRAM, 29 N_FUNCTYPE, 30 N_PTRTYPE, 31 N_STRUCT, 32 N_UNION, 33 N_MEMBERDECL, 34 N_MEMBERLIST, 35 N_CONDLIST, 36 N_COND, 37 N_ENUM, 38 N_ENUMITEM, 39 N_ENUMLIST, 40 N_LOOP, 41 N_BREAK, 42 N_CONTINUE, 43 N_RETURN, 44 N_VARDECL, 45 N_LABEL, 46 N_GOTO, 47 N_ASSIGN, 48 N_SIZEOF, 49 N_REF, 50 N_DEREF, 51 N_CAST, 52 N_INDEX, 53 N_LT, 54 N_GT, 55 N_LE, 56 N_GE, 57 N_EQ, 58 N_NE, 59 N_ADD, 60 N_SUB, 61 N_MUL, 62 N_LSH, 63 N_RSH, 64 N_BNOT, 65 N_BOR, 66 N_BAND, 67 N_AND, 68 N_OR, 69 N_XOR, 70 N_NOT, 71 N_POS, 72 N_NEG, 73 N_DIV, 74 N_MOD, 75 N_CHARSET, 76 N_LEXDOT, 77 N_LEXSTAR, 78 N_LEXPLUS, 79 N_LEXQMARK, 80 N_LEXCONCAT, 81 N_LEXALT, 82 N_LEXRULE, 83 N_LEXLIST, 84 N_LEXER, 85 N_PRODITEM, 86 N_PRODALT, 87 N_PROD, 88 N_PRODLIST, 89 N_GRAMMAR, 90 } 91 92 func mknode(c: *parser, kind: int, a: *node, b: *node): *node { 93 var ret: *node; 94 ret = alloc(c.a, sizeof(*ret)) as *node; 95 ret.kind = kind; 96 ret.a = a; 97 ret.b = b; 98 ret.filename = nil; 99 ret.lineno = 0; 100 ret.colno = 0; 101 ret.n = 0; 102 ret.s = nil; 103 ret.t = nil; 104 ret.filename = c.c.filename; 105 ret.lineno = c.c.lineno; 106 ret.colno = c.c.colno; 107 return ret; 108 } 109 110 func mknode0(c: *parser, kind: int): *node { 111 return mknode(c, kind, nil, nil); 112 } 113 114 func mknode1(c: *parser, kind: int, a: *node): *node { 115 return mknode(c, kind, a, nil); 116 } 117 118 func concat_program(a: *node, b: *node): *node { 119 var ret: *node; 120 121 if !a { 122 return b; 123 } 124 125 if !b { 126 return a; 127 } 128 129 ret = a; 130 loop { 131 if !a.b { 132 break; 133 } 134 135 a = a.b; 136 } 137 138 a.b = b; 139 140 return ret; 141 } 142 143 func node_to_str(kind: int): *byte { 144 if kind == N_IDENT { return "N_IDENT"; } 145 if kind == N_NUM { return "N_NUM"; } 146 if kind == N_CHAR { return "N_CHAR"; } 147 if kind == N_STR { return "N_STR"; } 148 if kind == N_NIL { return "N_NIL"; } 149 if kind == N_STMTLIST { return "N_STMTLIST"; } 150 if kind == N_EXPRLIST { return "N_EXPRLIST"; } 151 if kind == N_CALL { return "N_CALL"; } 152 if kind == N_DOT { return "N_DOT"; } 153 if kind == N_ARGLIST { return "N_ARGLIST"; } 154 if kind == N_FUNC { return "N_FUNC"; } 155 if kind == N_ARGDECL { return "N_ARGDECL"; } 156 if kind == N_FUNCDECL { return "N_FUNCDECL"; } 157 if kind == N_PROGRAM { return "N_PROGRAM"; } 158 if kind == N_FUNCTYPE { return "N_FUNCTYPE"; } 159 if kind == N_PTRTYPE { return "N_PTRTYPE"; } 160 if kind == N_STRUCT { return "N_STRUCT"; } 161 if kind == N_UNION { return "N_UNION"; } 162 if kind == N_MEMBERDECL { return "N_MEMBERDECL"; } 163 if kind == N_MEMBERLIST { return "N_MEMBERLIST"; } 164 if kind == N_CONDLIST { return "N_CONDLIST"; } 165 if kind == N_COND { return "N_COND"; } 166 if kind == N_ENUM { return "N_ENUM"; } 167 if kind == N_ENUMITEM { return "N_ENUMITEM"; } 168 if kind == N_ENUMLIST { return "N_ENUMLIST"; } 169 if kind == N_LOOP { return "N_LOOP"; } 170 if kind == N_BREAK { return "N_BREAK"; } 171 if kind == N_CONTINUE { return "N_CONTINUE"; } 172 if kind == N_RETURN { return "N_RETURN"; } 173 if kind == N_VARDECL { return "N_VARDECL"; } 174 if kind == N_LABEL { return "N_LABEL"; } 175 if kind == N_GOTO { return "N_GOTO"; } 176 if kind == N_ASSIGN { return "N_ASSIGN"; } 177 if kind == N_SIZEOF { return "N_SIZEOF"; } 178 if kind == N_REF { return "N_REF"; } 179 if kind == N_DEREF { return "N_DEREF"; } 180 if kind == N_CAST { return "N_CAST"; } 181 if kind == N_INDEX { return "N_INDEX"; } 182 if kind == N_LT { return "N_LT"; } 183 if kind == N_GT { return "N_GT"; } 184 if kind == N_LE { return "N_LE"; } 185 if kind == N_GE { return "N_GE"; } 186 if kind == N_EQ { return "N_EQ"; } 187 if kind == N_NE { return "N_NE"; } 188 if kind == N_ADD { return "N_ADD"; } 189 if kind == N_SUB { return "N_SUB"; } 190 if kind == N_MUL { return "N_MUL"; } 191 if kind == N_LSH { return "N_LSH"; } 192 if kind == N_RSH { return "N_RSH"; } 193 if kind == N_BNOT { return "N_BNOT"; } 194 if kind == N_BOR { return "N_BOR"; } 195 if kind == N_BAND { return "N_BAND"; } 196 if kind == N_AND { return "N_AND"; } 197 if kind == N_OR { return "N_OR"; } 198 if kind == N_XOR { return "N_XOR"; } 199 if kind == N_NOT { return "N_NOT"; } 200 if kind == N_POS { return "N_POS"; } 201 if kind == N_NEG { return "N_NEG"; } 202 if kind == N_DIV { return "N_DIV"; } 203 if kind == N_MOD { return "N_MOD"; } 204 if kind == N_CHARSET { return "N_CHARSET"; } 205 if kind == N_LEXDOT { return "N_LEXDOT"; } 206 if kind == N_LEXSTAR { return "N_LEXSTAR"; } 207 if kind == N_LEXPLUS { return "N_LEXPLUS"; } 208 if kind == N_LEXQMARK { return "N_LEXQMARK"; } 209 if kind == N_LEXCONCAT { return "N_LEXCONCAT"; } 210 if kind == N_LEXALT { return "N_LEXALT"; } 211 if kind == N_LEXRULE { return "N_LEXRULE"; } 212 if kind == N_LEXLIST { return "N_LEXLIST"; } 213 if kind == N_LEXER { return "N_LEXER"; } 214 if kind == N_PRODITEM { return "N_PRODITEM"; } 215 if kind == N_PRODALT { return "N_PRODALT"; } 216 if kind == N_PROD { return "N_PROD"; } 217 if kind == N_PRODLIST { return "N_PRODLIST"; } 218 if kind == N_GRAMMAR { return "N_GRAMMAR"; } 219 return "(invalid)"; 220 } 221 222 func show_node(out: *file, n: *node) { 223 var i: int; 224 var ch: int; 225 var hex: *byte; 226 hex = "0123456789abcdef"; 227 if !n { 228 return; 229 } 230 fputc(out, '('); 231 fputs(out, node_to_str(n.kind)); 232 if n.kind == N_NUM { 233 fputc(out, ' '); 234 fputd(out, n.n); 235 } 236 if n.s { 237 fputc(out, ' '); 238 fputc(out, '"'); 239 i = 0; 240 loop { 241 ch = n.s[i] as int; 242 if !ch { 243 break; 244 } 245 if ch < 32 || ch > 127 || ch == '\\' || ch == '"' { 246 fputc(out, '\\'); 247 fputc(out, 'x'); 248 fputc(out, hex[ch >> 4] as int); 249 fputc(out, hex[ch & 15] as int); 250 } else { 251 fputc(out, ch); 252 } 253 i = i + 1; 254 } 255 fputc(out, '"'); 256 } 257 if n.a { 258 fputc(out, ' '); 259 show_node(out, n.a); 260 } 261 if n.b { 262 fputc(out, ' '); 263 show_node(out, n.b); 264 } 265 fputc(out, ')'); 266 } 267 268 func mkident(c: *parser, name: *byte): *node { 269 var n: *node; 270 n = mknode(c, N_IDENT, nil, nil); 271 n.s = mkstr(c.a, name, strlen(name)); 272 return n; 273 }