| /* 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, "? "); | |
| } |