-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcomp_go.c
More file actions
126 lines (115 loc) · 2.24 KB
/
comp_go.c
File metadata and controls
126 lines (115 loc) · 2.24 KB
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
#include "main.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "comp.h"
void compileGo(Node* n) {
if (n == NULL) {
return;
}
switch (n->type) {
case LOOP:
iprintfln("for m[i] != 0 {");
level++;
compileGo(n->n[0].n);
level--;
iprintfln("}");
break;
case STMTS:
compileGo(n->n[0].n);
compileGo(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("fmt.Printf(\"%%c\", m[i");
iprintAdd(off);
fprintf(outfile, "])\n");
}
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 compGo() {
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("int8");
}
iprintfln("package main");
iprintfln("import \"fmt\"");
iprintfln("//#include <stdio.h>");
iprintfln("import \"C\"");
iprintfln("");
iprintfln("type CELL_T %s", cell_t_str);
iprintfln("");
iprintfln("const NUM_CELLS = %d", numCells);
iprintfln("");
iprintfln("func readChar(cell* CELL_T) {");
level++;
iprintfln("x := C.getchar();");
iprintfln("if x == C.EOF {");
level++;
iprintfln("*cell = %s", eofStr);
level--;
iprintfln("} else {");
level++;
iprintfln("*cell = CELL_T(x)");
level--;
iprintfln("}");
level--;
iprintfln("}");
iprintfln("");
iprintfln("func main() {");
level++;
iprintfln("i := 0");
iprintfln("m := make([]CELL_T, NUM_CELLS)");
compileGo(root);
level--;
iprintfln("}");
}