-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprint_tree.c
157 lines (144 loc) · 3.87 KB
/
print_tree.c
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include "hermit.h"
#include "print_tree.h"
#define INITIAL_INDENT_STEP 3
int indentstep = INITIAL_INDENT_STEP;
void print_indent(int indent, int lineno);
void print_function_decs(int indent, A_func_dec_list functions);
void print_expression(int indent, A_expression exp);
void print_func_dec(int indent, A_func_dec function);
void print_param_list(int indent, A_param_list params);
void print_param(int indent, A_param param);
void print_statement_list(int indent, A_statement_list statements);
void print_statement(int indent, A_statement statement);
void print_expression(int indent, A_expression exp)
{
switch(exp->type)
{
case OpExp:
case VarExp:
case CallExp:
break;
case IntExp:
print_indent(indent, exp->lineno);
printf("Integer Literal: %d\n", exp->self.int_exp.value);
break;
}
}
void print_statement(int indent, A_statement statement)
{
switch(statement->type)
{
case Assign:
case VarDec:
case Call:
/*
print_indent(indent, statement->lineno);
puts("Assign:");
print_indent(indent + 1, statement->self.assign_stm.lval->lineno);
puts("LVAL:");
print_variable(indent + 2, statement->self.assign_stm.lval);
print_indent(indent + 1, statement->self.assign_stm.rval-lineno);
puts("RVAL:");
print_expression(indent + 2, statement->self.assign_stm.rval);*/
break;
case Block:
print_indent(indent, statement->lineno);
puts("{");
print_statement_list(indent + 1, statement->self.block_stm.statements);
print_indent(indent, statement->lineno);
puts("}");
break;
case Return:
print_indent(indent, statement->lineno);
puts("Return");
if (statement->self.return_stm.retval != NULL)
print_expression(indent + 1, statement->self.return_stm.retval);
else
{
print_indent(indent + 1, statement->lineno);
printf("None");
}
break;
case Empty:
print_indent(indent, statement->lineno);
puts("Empty");
break;
}
}
void print_statement_list(int indent, A_statement_list statements)
{
if (!statements)
return;
print_statement(indent, statements->first);
print_statement_list(indent, statements->next);
}
void print_param(int indent, A_param param)
{
print_indent(indent, param->lineno);
printf("%s %s", param->type, param->name);
puts("");
}
void print_param_list(int indent, A_param_list params)
{
if (!params)
return;
print_param(indent, params->first);
print_param_list(indent, params->next);
}
void print_func_dec(int indent, A_func_dec function)
{
if (!function)
return;
if (function->type == Prototype)
{
print_indent(indent, function->lineno);
printf("Prototype: %s\n", function->self.prototype.name);
print_indent(indent + 1, function->lineno);
puts("Parameters");
print_param_list(indent + 2, function->self.prototype.params);
}
else if (function->type == Function)
{
print_indent(indent, function->lineno);
printf("Function Definition: %s\n", function->self.function_def.name);
print_indent(indent + 1, function->lineno);
puts("Parameters");
print_param_list(indent + 2, function->self.function_def.params);
if (function->self.function_def.body != NULL)
{
print_indent(indent + 1, function->self.function_def.body->lineno);
puts("Function Body");
print_statement_list(indent + 2, function->self.function_def.body);
}
else
{
print_indent(indent + 1, function->lineno);
puts("No Body");
}
}
else
printf("Error in function declaration at line: %d\n", function->lineno);
}
void print_indent(int indent, int lineno)
{
int i;
printf("%3d ", lineno);
for (i = 0; i < indent * indentstep; i++)
printf(" ");
fflush(stdout);
}
void print_function_decs(int indent, A_func_dec_list functions)
{
if (!functions)
return;
print_func_dec(indent, functions->first);
print_function_decs(indent, functions->next);
}
void print_tree(A_program program)
{
print_function_decs(0, program->function_decs);
}
void set_indent(int new_indent)
{
indentstep = new_indent;
}