shithub: scc

Download patch

ref: 6c5d52ea0865cb623eead43535739b008b526928
parent: aaeec1e16228d8a144d022621786639961912313
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Sat Oct 5 18:02:19 EDT 2013

Simplify prtree

Due to the new representation of the tree, it is easiar run over
a tree, so we can remove the nchild field in the representation
table.

It is also no needed the prtree_helper function, because each increment
of indent is always followed of a decrement, so we can use only a function
because when prtree returns indent holds the same value it had in the
beginning.

--- a/tree.c
+++ b/tree.c
@@ -1,8 +1,6 @@
 
 #include <assert.h>
-#include <stddef.h>
 #include <stdio.h>
-#include <stdint.h>
 
 #include "cc.h"
 #include "syntax.h"
@@ -24,9 +22,6 @@
 };
 
 
-static unsigned char indent;  /* used for pretty printing the tree*/
-
-
 struct node *
 nodesym(struct symbol *sym)
 {
@@ -69,109 +64,97 @@
 	return p->tree;
 }
 
-static void
-prtree_helper(register struct node *np)
+void
+prtree(register struct node *np)
 {
-	static struct optab {
-		unsigned char nchild;
-		const char *txt;
-	} *bp, optab [] = {
-		[OCALL] = {2, "()"},
-		[OARY] = {2, "[]"},
-		[OFIELD] = {2, "."},
-		[OPTR] = {2, "->"},
-		[OPOSTINC] = {2, ".++"},
-		[OPOSTDEC] = {2, ".--"},
-		[OPREINC] = {2, "++."},
-		[OPREDEC] = {2, "--."},
-		[OADDR] = {2, "&."},
-		[OINDIR] = {2, "[*]"},
-		[OMINUS] = {2, "-."},
-		[OPLUS] = {2, "+."},
-		[OCPL] = {2, "~"},
-		[ONEG] = {2, "!"},
-		[OMUL] = {2, "*"},
-		[ODIV] = {2, "/"},
-		[OMOD] = {2, "%"},
-		[OADD] = {2, "+"},
-		[OSUB] = {2, "-"},
-		[OSHL] = {2, "<<"},
-		[OSHR] = {2, ">>"},
-		[OLT] = {2, "<"},
-		[OGT] = {2, ">"},
-		[OGE] = {2, ">="},
-		[OLE] = {2, "<="},
-		[OEQ] = {2, "=="},
-		[ONE] = {2, "!="},
-		[OBAND] = {2, "&"},
-		[OBXOR] = {2, "^"},
-		[OBOR] = {2, "|"},
-		[OAND] = {2, "&&"},
-		[OOR] = {2, "||"},
-		[OTERN] = {2, "?"},
-		[OASSIGN] = {2, "="},
-		[OA_MUL] = {2, "*="},
-		[OA_DIV] = {2, "/="},
-		[OA_MOD] = {2, "%="},
-		[OA_ADD] = {2, "+="},
-		[OA_SUB] = {2, "-="},
-		[OA_SHL] = {2, "<<="},
-		[OA_SHR] = {2, ">>="},
-		[OA_AND] = {2, "&="},
-		[OA_XOR] = {2, "^="},
-		[OA_OR] = {2, "|="},
-		[OSYM] = {0, "sym"},
-		[OCOMP] = {2, "comp"},
-		[OSWITCH] = {2, "switch"},
-		[OIF] = {2, "if"},
-		[OFOR] = {2, "for"},
-		[OFEXP] = {2, "efor"},
-		[ODO] = {2, "do"},
-		[OWHILE] = {2, "while"},
-		[OLABEL] = {2, "label"},
-		[OGOTO] = {2, "goto"},
-		[OBREAK] = {2, "break"},
-		[OCONT] = {2, "cont"},
-		[ORETURN] = {2, "return"},
-		[OCASE] = {2, "case"},
-		[ODEFAULT] = {2, "default"},
-		[OFTN] = {2, "function"},
-		[ODEF] = {2, "def"},
-		[O2EXP] = { 2, ":"}
+	static unsigned char indent;
+	register unsigned char i;
+	static char *optab[] = {
+		[OCALL] = "()",
+		[OARY] = "[]",
+		[OFIELD] = ".",
+		[OPTR] = "->",
+		[OPOSTINC] = ".++",
+		[OPOSTDEC] = ".--",
+		[OPREINC] = "++.",
+		[OPREDEC] = "--.",
+		[OADDR] = "&.",
+		[OINDIR] = "[*]",
+		[OMINUS] = "-.",
+		[OPLUS] = "+.",
+		[OCPL] = "~",
+		[ONEG] = "!",
+		[OMUL] = "*",
+		[ODIV] = "/",
+		[OMOD] = "%",
+		[OADD] = "+",
+		[OSUB] = "-",
+		[OSHL] = "<<",
+		[OSHR] = ">>",
+		[OLT] = "<",
+		[OGT] = ">",
+		[OGE] = ">=",
+		[OLE] = "<=",
+		[OEQ] = "==",
+		[ONE] = "!=",
+		[OBAND] = "&",
+		[OBXOR] = "^",
+		[OBOR] = "|",
+		[OAND] = "&&",
+		[OOR] = "||",
+		[OTERN] = "?",
+		[OASSIGN] = "=",
+		[OA_MUL] = "*=",
+		[OA_DIV] = "/=",
+		[OA_MOD] = "%=",
+		[OA_ADD] = "+=",
+		[OA_SUB] = "-=",
+		[OA_SHL] = "<<=",
+		[OA_SHR] = ">>=",
+		[OA_AND] = "&=",
+		[OA_XOR] = "^=",
+		[OA_OR] = "|=",
+		[OSYM] = "sym",
+		[OCOMP] = "comp",
+		[OSWITCH] = "switch",
+		[OIF] = "if",
+		[OFOR] = "for",
+		[OFEXP] = "efor",
+		[ODO] = "do",
+		[OWHILE] = "while",
+		[OLABEL] = "label",
+		[OGOTO] = "goto",
+		[OBREAK] = "break",
+		[OCONT] = "cont",
+		[ORETURN] = "return",
+		[OCASE] = "case",
+		[ODEFAULT] = "default",
+		[OFTN] = "function",
+		[O2EXP] = ":",
+		[ODEF] = "def"
 	};
+
 	if (!np) {
 		fputs(" nil", stdout);
 		return;
 	}
-	assert(np->op < ARRAY_SIZE(optab));
-	bp = &optab[np->op];
-	if (bp->nchild) {
-		register unsigned char i;
-		putchar('\n');
-		for (i = indent; i != 0; --i)
-			putchar(' ');
-		printf("(%s", bp->txt);
-		indent += 2;
-	}
-	switch (bp->nchild) {
-	case 0: {
-		register struct symbol *sym = ((struct nodesym *) np)->sym;
-		putchar(' ');
-		fputs((sym->name) ? sym->name : ".", stdout);
+	if (np->op == OSYM) {
+		const char *s = ((struct nodesym *) np)->sym->name;
+
+		printf(" %s", s ? s : ".");
 		return;
 	}
-	case 2:
-		prtree_helper(((struct node_op2 *) np)->left);
-		prtree_helper(((struct node_op2 *) np)->right);
-		break;
-	}
+
+	putchar('\n');
+	for (i = indent; i != 0; --i)
+		putchar(' ');
+
+	indent += 2;
+	assert(np->op < ARRAY_SIZE(optab));
+	printf("(%s", optab[np->op]);
+	prtree(((struct node_op2 *)np)->right);
+	prtree(((struct node_op2 *)np)->left);
 	putchar(')');
 	indent -= 2;
 }
 
-void
-prtree(register struct node *np)
-{
-	indent = 0;
-	prtree_helper(np);
-}
--