shithub: scc

Download patch

ref: aaeec1e16228d8a144d022621786639961912313
parent: 8870f51518fcf0af3e34be171e9ebce325b0dbcf
author: Roberto E. Vargas Caballero <[email protected]>
date: Sat Oct 5 16:05:56 EDT 2013

Remove node_comp

Removing this kind of node we simplify the tree a lot, because
we only need detect a type of special node, the symbol node, which
is also the terminal node, so it is something we already have
to detect, so it is great.

--- a/decl.c
+++ b/decl.c
@@ -288,28 +288,30 @@
 static struct node *
 initializer(register struct ctype *tp)
 {
-	register struct node *np;
-
 	if (accept('{')) {
-		np = nodecomp();
-		addstmt(np, initializer(tp));
+		struct compound c;
+
+		nodecomp(&c);
+		addstmt(&c, initializer(tp));
 		while (accept(',')) {
 			if (accept('}'))
-				return np;
-			addstmt(np, initializer(tp));
+				return c.tree;
+			addstmt(&c, initializer(tp));
 		}
 		expect('}');
+		return c.tree;
 	} else {
-		np = expr();
+		return expr();
 	}
-	return np;
 }
 
 static struct node *
 listdcl(struct ctype *base)
 {
-	struct node *lp = nodecomp();
+	struct compound c;
 
+	nodecomp(&c);
+
 	do {
 		struct node *sp, *np;
 		register struct ctype *tp;
@@ -323,14 +325,14 @@
 		sp = nodesym(cursym);
 		if (tp->type == FTN && yytoken == '{') {
 			np  = node(ODEF, sp, function(cursym));
-			return addstmt(lp, np);
+			return addstmt(&c, np);
 		}
 		np = node(ODEF, sp, accept('=') ? initializer(tp) : NULL);
-		lp = addstmt(lp, np);
+		addstmt(&c, np);
 	} while (accept(','));
 	expect(';');
 
-	return lp;
+	return c.tree;
 }
 
 struct node *
--- a/flow.c
+++ b/flow.c
@@ -236,17 +236,19 @@
 static struct node *
 compound(void)
 {
-	register struct node *lp = nodecomp(), *np;
+	register struct node *np;
+	struct compound c;
 
+	nodecomp(&c);
 	expect('{');
 	new_ctx();
 	while (np = decl())
-		addstmt(lp, np);
+		addstmt(&c, np);
 	while (!accept('}'))
-		addstmt(lp, stmt());
+		addstmt(&c, stmt());
 	del_ctx();
 
-	return lp;
+	return c.tree;
 }
 
 static struct node *
--- a/syntax.h
+++ b/syntax.h
@@ -18,6 +18,11 @@
 struct node;
 struct symbol;
 
+struct compound {
+	struct node *tree;
+	struct node_op2 *last;
+};
+
 extern struct node *expr(void);
 extern struct node *decl(void);
 extern void type_name(void);
@@ -25,8 +30,8 @@
 
 extern struct node *node(unsigned char op, struct node *l, struct node *r);
 extern struct node *nodesym(struct symbol *sym);
-extern struct node *nodecomp(void);
-extern struct node *addstmt(struct node *np, struct node *stmt);
+extern struct node *addstmt(struct compound *p, struct node *np);
+extern struct node *addstmt(struct compound *p, struct node *np);
 
 extern void prtree(register struct node *np);
 
--- a/tree.c
+++ b/tree.c
@@ -23,13 +23,7 @@
 	struct symbol *sym;
 };
 
-struct node_comp {
-	struct node base;
-	uint8_t nr, alloc;
-	struct node **body;
-};
 
-
 static unsigned char indent;  /* used for pretty printing the tree*/
 
 
@@ -55,37 +49,24 @@
 	return (struct node *) np;
 }
 
-struct node *
-nodecomp(void)
+void
+nodecomp(register struct compound *p)
 {
-	register struct node_comp *np = xmalloc(sizeof(*np));
-
-	np->base.op = OCOMP;
-	np->alloc = np->nr = 0;
-	np->body = NULL;
-
-	return (struct node *) np;
+	p->tree = node(OCOMP, NULL, NULL);
+	p->last = (struct node_op2 *) p->tree;
 }
 
 struct node *
-addstmt(struct node *p, struct node *stmt)
+addstmt(struct compound *p, struct node *np)
 {
-	register uint8_t nr, alloc;
-	register struct node_comp *np = (struct node_comp *) p;
-
-	assert(np && np->base.op == OCOMP);
-	nr = ++np->nr, alloc = np->alloc;
-
-#define alloc_nr(x) ((((x)+16)*3)/2)
-	if (nr > alloc) {
-		alloc = alloc_nr(nr);
-		np->body = xrealloc(np->body, alloc * sizeof(*np->body));
+	if (!p->last->left) {
+		p->last->left = np;
+	} else {
+		p->last = (struct node_op2 *)
+		   (p->last->right = node(O2EXP, NULL, np));
 	}
-#undef alloc_nr
 
-	np->body[nr - 1] = stmt;
-	np->alloc = alloc;
-	return p;
+	return p->tree;
 }
 
 static void
@@ -140,7 +121,7 @@
 		[OA_XOR] = {2, "^="},
 		[OA_OR] = {2, "|="},
 		[OSYM] = {0, "sym"},
-		[OCOMP] = {255, "comp"},
+		[OCOMP] = {2, "comp"},
 		[OSWITCH] = {2, "switch"},
 		[OIF] = {2, "if"},
 		[OFOR] = {2, "for"},
@@ -183,15 +164,6 @@
 		prtree_helper(((struct node_op2 *) np)->left);
 		prtree_helper(((struct node_op2 *) np)->right);
 		break;
-	case 255: {
-		register struct node **bp, **lim;
-
-		bp = ((struct node_comp *) np)->body;
-		lim = bp + ((struct node_comp *) np)->nr;
-		while (bp < lim)
-			prtree_helper(*bp++);
-		break;
-	}
 	}
 	putchar(')');
 	indent -= 2;