1
2 /* List a node on a file */
3
4 #include "pgenheaders.h"
5 #include "token.h"
6 #include "node.h"
7
8 /* Forward */
9 static void list1node(FILE *, node *);
10 static void listnode(FILE *, node *);
11
12 void
PyNode_ListTree(node * n)13 PyNode_ListTree(node *n)
14 {
15 listnode(stdout, n);
16 }
17
18 static int level, atbol;
19
20 static void
listnode(FILE * fp,node * n)21 listnode(FILE *fp, node *n)
22 {
23 level = 0;
24 atbol = 1;
25 list1node(fp, n);
26 }
27
28 static void
list1node(FILE * fp,node * n)29 list1node(FILE *fp, node *n)
30 {
31 if (n == NULL)
32 return;
33 if (ISNONTERMINAL(TYPE(n))) {
34 int i;
35 for (i = 0; i < NCH(n); i++)
36 list1node(fp, CHILD(n, i));
37 }
38 else if (ISTERMINAL(TYPE(n))) {
39 switch (TYPE(n)) {
40 case INDENT:
41 ++level;
42 break;
43 case DEDENT:
44 --level;
45 break;
46 default:
47 if (atbol) {
48 int i;
49 for (i = 0; i < level; ++i)
50 fprintf(fp, "\t");
51 atbol = 0;
52 }
53 if (TYPE(n) == NEWLINE) {
54 if (STR(n) != NULL)
55 fprintf(fp, "%s", STR(n));
56 fprintf(fp, "\n");
57 atbol = 1;
58 }
59 else
60 fprintf(fp, "%s ", STR(n));
61 break;
62 }
63 }
64 else
65 fprintf(fp, "? ");
66 }
67