-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomp_c.c
122 lines (111 loc) · 2.23 KB
/
comp_c.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
#include "main.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "comp.h"
void compileC(Node* n) {
if (n == NULL) {
return;
}
switch (n->type) {
case LOOP:
iprintfln("while(m[i]) {");
level++;
compileC(n->n[0].n);
level--;
iprintfln("}");
break;
case STMTS:
compileC(n->n[0].n);
compileC(n->n[1].n);
break;
case SUM: {
int off = n->n[1].i;
iprintf("m[i");
iprintAdd(off);
fprintf(outfile, "] += %d;\n", n->n[0].i);
}
break;
case SHIFT:
iprintfln("i += %d;", n->n[0].i);
break;
case OUT: {
int off = n->n[0].i;
iprintf("putchar(m[i");
iprintAdd(off);
fprintf(outfile, "]);\n");
iprintfln("fflush(stdout);");
}
break;
case IN: {
int off = n->n[0].i;
iprintf("readChar(&m[i");
iprintAdd(off);
fprintf(outfile, "]);\n");
}
break;
case SET: {
int off = n->n[0].i;
for (int i = 1; i < n->sz; i++) {
Point *p = n->n[i].p;
int x = p->x;
int y = p->y;
int scale = p->z;
//"m[i+%d] += (%d*m[i+%d])/%d;", x+off, y, off, scale
iprintf("m[i");
iprintAdd(x);
iprintAdd(off);
fprintf(outfile, "] += ");
iprintCoeff(y);
fprintf(outfile, "m[i");
iprintAdd(off);
fprintf(outfile, "]");
iprintDiv(scale);
fprintf(outfile, ";\n");
}
iprintf("m[i");
iprintAdd(off);
fprintf(outfile, "] = 0;\n");
}
break;
}
}
void compC() {
char* eofStr = "-1";
if (eofType == EOF_NC) {
eofStr = "*cell";
} else if (eofType == EOF_M1) {
eofStr = "-1";
} else if (eofType == EOF_0) {
eofStr = "0";
}
if (cell_t_str == NULL) {
cell_t_str = strdup("uint8_t");
}
iprintfln("#include <stdio.h>");
iprintfln("#include <stddef.h>");
iprintfln("#include <stdint.h>");
iprintfln("");
iprintfln("#ifndef CELL_T");
iprintfln("#define CELL_T %s", cell_t_str);
iprintfln("#endif");
iprintfln("");
iprintfln("#ifndef NUM_CELLS");
iprintfln("#define NUM_CELLS %d", numCells);
iprintfln("#endif");
iprintfln("");
iprintfln("void readChar(CELL_T* cell) {");
level++;
iprintfln("int x = getchar();");
iprintfln("*cell = (x == EOF) ? %s : x;", eofStr);
level--;
iprintfln("}");
iprintfln("");
iprintfln("int main() {");
level++;
iprintfln("size_t i = 0;");
iprintfln("CELL_T m[NUM_CELLS] = {0};");
compileC(root);
level--;
iprintfln("}");
}