1 2/* List a node on a file */ 3 4#include "pgenheaders.h" 5#include "token.h" 6#include "node.h" 7 8/* Forward */ 9static void list1node(FILE *, node *); 10static void listnode(FILE *, node *); 11 12void 13PyNode_ListTree(node *n) 14{ 15 listnode(stdout, n); 16} 17 18static int level, atbol; 19 20static void 21listnode(FILE *fp, node *n) 22{ 23 level = 0; 24 atbol = 1; 25 list1node(fp, n); 26} 27 28static void 29list1node(FILE *fp, node *n) 30{ 31 if (n == 0) 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