summaryrefslogtreecommitdiffstats
path: root/Parser/listnode.c
blob: e0a979ea13f50b342f6cd3f1c7c5dd50c1ca8686 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* List a node on a file */

#include <stdio.h>

#include "PROTO.h"
#include "token.h"
#include "node.h"

static int level, atbol;

static void
list1node(fp, n)
	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, "? ");
}

void
listnode(fp, n)
	FILE *fp;
	node *n;
{
	level = 0;
	atbol = 1;
	list1node(fp, n);
}

void
listtree(n)
	node *n;
{
	listnode(stdout, n);
}