You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.0 KiB
66 lines
1.0 KiB
|
|
/* List a node on a file */ |
|
|
|
#include "pgenheaders.h" |
|
#include "token.h" |
|
#include "node.h" |
|
|
|
/* Forward */ |
|
static void list1node(FILE *, node *); |
|
static void listnode(FILE *, node *); |
|
|
|
void |
|
PyNode_ListTree(node *n) |
|
{ |
|
listnode(stdout, n); |
|
} |
|
|
|
static int level, atbol; |
|
|
|
static void |
|
listnode(FILE *fp, node *n) |
|
{ |
|
level = 0; |
|
atbol = 1; |
|
list1node(fp, n); |
|
} |
|
|
|
static void |
|
list1node(FILE *fp, node *n) |
|
{ |
|
if (n == 0) |
|
return; |
|
if (ISNONTERMINAL(TYPE(n))) { |
|
int i; |
|
for (i = 0; i < NCH(n); i++) |
|
list1node(fp, CHILD(n, i)); |
|
} |
|
else if (ISTERMINAL(TYPE(n))) { |
|
switch (TYPE(n)) { |
|
case INDENT: |
|
++level; |
|
break; |
|
case DEDENT: |
|
--level; |
|
break; |
|
default: |
|
if (atbol) { |
|
int i; |
|
for (i = 0; i < level; ++i) |
|
fprintf(fp, "\t"); |
|
atbol = 0; |
|
} |
|
if (TYPE(n) == NEWLINE) { |
|
if (STR(n) != NULL) |
|
fprintf(fp, "%s", STR(n)); |
|
fprintf(fp, "\n"); |
|
atbol = 1; |
|
} |
|
else |
|
fprintf(fp, "%s ", STR(n)); |
|
break; |
|
} |
|
} |
|
else |
|
fprintf(fp, "? "); |
|
}
|
|
|