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