Home | History | Annotate | Download | only in Parser
      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