From 08c76bd5343c15ac8e2d0f0b519c1a3ffae45856 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Fri, 10 Jan 2014 01:33:56 +0100 Subject: [PATCH] Pretty print and indent STM_BLOCK nodes. --- js-ast.c | 41 ++++++++++++++++++++++++++++++++--------- js-ast.h | 2 +- js-parse.c | 2 +- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/js-ast.c b/js-ast.c index 0662a0a..615fb53 100644 --- a/js-ast.c +++ b/js-ast.c @@ -142,17 +142,33 @@ static const char *strast(int type) } } -void printlist(js_Ast *n) +static void indent(int level) +{ + while (level--) + putchar('\t'); +} + +void printlist(js_Ast *n, int level, const char *sep) { while (n) { - printast(n->a); + printast(n->a, level); n = n->b; if (n) - putchar(' '); + fputs(sep, stdout); } } -void printast(js_Ast *n) +void printblock(js_Ast *n, int level) +{ + while (n) { + indent(level); + printast(n->a, level); + putchar('\n'); + n = n->b; + } +} + +void printast(js_Ast *n, int level) { switch (n->type) { case AST_IDENTIFIER: printf("%s", n->s); return; @@ -161,15 +177,22 @@ void printast(js_Ast *n) case AST_REGEXP: printf("/%s/", n->s); return; case AST_LIST: putchar('['); - printlist(n); + printlist(n, level, " "); putchar(']'); break; + case STM_BLOCK: + putchar('{'); + putchar('\n'); + printblock(n->a, level + 1); + indent(level); + putchar('}'); + break; default: printf("(%s", strast(n->type)); - if (n->a) { putchar(' '); printast(n->a); } - if (n->b) { putchar(' '); printast(n->b); } - if (n->c) { putchar(' '); printast(n->c); } - if (n->d) { putchar(' '); printast(n->d); } + if (n->a) { putchar(' '); printast(n->a, level); } + if (n->b) { putchar(' '); printast(n->b, level); } + if (n->c) { putchar(' '); printast(n->c, level); } + if (n->d) { putchar(' '); printast(n->d, level); } putchar(')'); break; } diff --git a/js-ast.h b/js-ast.h index c505b84..ed8d495 100644 --- a/js-ast.h +++ b/js-ast.h @@ -121,6 +121,6 @@ js_Ast *jsP_newsnode(js_State *J, int type, const char *s); js_Ast *jsP_newnnode(js_State *J, int type, double n); void jsP_freeast(js_State *J); -void printast(js_Ast *n); +void printast(js_Ast *n, int level); #endif diff --git a/js-parse.c b/js-parse.c index 4bffb44..7028e82 100644 --- a/js-parse.c +++ b/js-parse.c @@ -828,7 +828,7 @@ int jsP_parse(js_State *J) } next(J); - printast(sourcelist(J)); + printast(sourcelist(J), 0); putchar('\n'); // TODO: compile to bytecode