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 13 PyNode_ListTree(node *n) 14 { 15 listnode(stdout, n); 16 } 17 18 static int level, atbol; 19 20 static void 21 listnode(FILE *fp, node *n) 22 { 23 level = 0; 24 atbol = 1; 25 list1node(fp, n); 26 } 27 28 static void 29 list1node(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