commit 6c5d52ea0865cb623eead43535739b008b526928
parent aaeec1e16228d8a144d022621786639961912313
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Sat, 5 Oct 2013 22:02:19 +0200
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.
Diffstat:
M | tree.c | | | 181 | ++++++++++++++++++++++++++++++++++++------------------------------------------- |
1 file changed, 82 insertions(+), 99 deletions(-)
diff --git 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 @@ struct nodesym {
};
-static unsigned char indent; /* used for pretty printing the tree*/
-
-
struct node *
nodesym(struct symbol *sym)
{
@@ -69,109 +64,97 @@ addstmt(struct compound *p, struct node *np)
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);
-}