os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

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 }