home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 15 / AACD15.ISO / AACD / Programming / Python2 / Python20_source / Parser / listnode.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-25  |  983 b   |  67 lines

  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.