5 #define gdie(msg) { fprintf(stderr, "%s", msg); return 1; }
7 int expr_genc(struct expr
*expr
, FILE *cout
);
9 void binop_genc(char *fun
, struct expr
*l
, struct expr
*r
, FILE *cout
)
11 safe_fprintf(cout
, "%s(", fun
);
13 safe_fprintf(cout
, ", ");
15 safe_fprintf(cout
, ")");
18 int expr_genc(struct expr
*expr
, FILE *cout
)
26 if (expr
->type
== ebinop
&& expr
->data
.ebinop
.op
== cons
) {
27 binop_genc("splc_cons", expr
->data
.ebinop
.l
,
28 expr
->data
.ebinop
.r
, cout
);
29 } else if (expr
->type
== ebinop
&& expr
->data
.ebinop
.op
== power
) {
30 binop_genc("splc_power", expr
->data
.ebinop
.l
,
31 expr
->data
.ebinop
.r
, cout
);
33 safe_fprintf(cout
, "(");
34 expr_genc(expr
->data
.ebinop
.l
, cout
);
35 safe_fprintf(cout
, "%s", binop_str
[expr
->data
.ebinop
.op
]);
36 expr_genc(expr
->data
.ebinop
.r
, cout
);
37 safe_fprintf(cout
, ")");
41 safe_fprintf(cout
, "%s", expr
->data
.ebool
? "true" : "false");
44 safe_fprintf(cout
, "'%s'",
45 escape_char(expr
->data
.echar
, buf
, false));
48 safe_fprintf(cout
, "%s(", expr
->data
.efuncall
.ident
);
49 for(int i
= 0; i
<expr
->data
.efuncall
.nargs
; i
++) {
50 expr_genc(expr
->data
.efuncall
.args
[i
], cout
);
51 if (i
+1 < expr
->data
.efuncall
.nargs
)
52 safe_fprintf(cout
, ", ");
54 safe_fprintf(cout
, ")");
55 for (int i
= 0; i
<expr
->data
.efuncall
.nfields
; i
++)
57 fieldspec_str
[expr
->data
.efuncall
.fields
[i
]]);
60 safe_fprintf(cout
, "%d", expr
->data
.eint
);
63 fprintf(cout
, "%s", expr
->data
.eident
.ident
);
64 for (int i
= 0; i
<expr
->data
.eident
.nfields
; i
++)
66 fieldspec_str
[expr
->data
.eident
.fields
[i
]]);
69 safe_fprintf(cout
, "NULL");
72 binop_genc("splc_tuple", expr
->data
.etuple
.left
,
73 expr
->data
.etuple
.right
, cout
);
76 safe_fprintf(cout
, "\"");
77 for (int i
= 0; i
<expr
->data
.estring
.nchars
; i
++)
78 safe_fprintf(cout
, "%s", escape_char(
79 expr
->data
.estring
.chars
[i
], buf
, true));
80 safe_fprintf(cout
, "\"");
83 safe_fprintf(cout
, "(%s", unop_str
[expr
->data
.eunop
.op
]);
84 expr_genc(expr
->data
.eunop
.l
, cout
);
85 safe_fprintf(cout
, ")");
88 die("Unknown expression node\n");
93 int type_genc(struct type
*type
, FILE *cout
)
96 fprintf(cout
, "WORD ");
100 fprintf(cout
, "WORD ");
103 fprintf(cout
, "struct splc_list *");
106 fprintf(cout
, "struct splc_tuple *");
109 fprintf(cout
, "WORD ");
112 die("Unsupported type node\n");
118 int vardecl_genc(struct vardecl
*vardecl
, int indent
, FILE *cout
)
123 pindent(indent
, cout
);
124 type_genc(vardecl
->type
, cout
);
125 fprintf(cout
, "%s = ", vardecl
->ident
);
126 r
= expr_genc(vardecl
->expr
, cout
);
127 fprintf(cout
, ";\n");
131 void stmt_genc(struct stmt
*stmt
, int indent
, FILE *cout
)
137 pindent(indent
, cout
);
138 fprintf(cout
, "%s", stmt
->data
.sassign
.ident
);
139 for (int i
= 0; i
<stmt
->data
.sassign
.nfields
; i
++)
140 fprintf(cout
, "->%s", stmt
->data
.sassign
.fields
[i
]);
141 safe_fprintf(cout
, " = ");
142 expr_genc(stmt
->data
.sassign
.expr
, cout
);
143 safe_fprintf(cout
, ";\n");
146 pindent(indent
, cout
);
147 safe_fprintf(cout
, "if (");
148 expr_genc(stmt
->data
.sif
.pred
, cout
);
149 safe_fprintf(cout
, ") {\n");
150 for (int i
= 0; i
<stmt
->data
.sif
.nthen
; i
++)
151 stmt_genc(stmt
->data
.sif
.then
[i
], indent
+1, cout
);
152 pindent(indent
, cout
);
153 safe_fprintf(cout
, "} else {\n");
154 for (int i
= 0; i
<stmt
->data
.sif
.nels
; i
++)
155 stmt_genc(stmt
->data
.sif
.els
[i
], indent
+1, cout
);
156 pindent(indent
, cout
);
157 safe_fprintf(cout
, "}\n");
160 pindent(indent
, cout
);
161 safe_fprintf(cout
, "return ");
162 expr_genc(stmt
->data
.sreturn
, cout
);
163 safe_fprintf(cout
, ";\n");
166 pindent(indent
, cout
);
167 expr_genc(stmt
->data
.sexpr
, cout
);
168 safe_fprintf(cout
, ";\n");
171 vardecl_genc(stmt
->data
.svardecl
, indent
, cout
);
174 pindent(indent
, cout
);
175 safe_fprintf(cout
, "while (");
176 expr_genc(stmt
->data
.swhile
.pred
, cout
);
177 safe_fprintf(cout
, ") {\n");
178 for (int i
= 0; i
<stmt
->data
.swhile
.nbody
; i
++)
179 stmt_genc(stmt
->data
.swhile
.body
[i
], indent
+1, cout
);
180 pindent(indent
, cout
);
181 safe_fprintf(cout
, "}\n");
184 die("Unsupported stmt node\n");
188 int decl_genc(struct decl
*decl
, FILE *cout
)
190 switch (decl
->type
) {
192 type_genc(decl
->data
.dfun
.rtype
, cout
);
193 safe_fprintf(cout
, "%s (", decl
->data
.dfun
.ident
);
194 for (int i
= 0; i
<decl
->data
.dfun
.nargs
; i
++) {
195 if (i
< decl
->data
.dfun
.natypes
)
196 type_genc(decl
->data
.dfun
.atypes
[i
], cout
);
197 safe_fprintf(cout
, "%s", decl
->data
.dfun
.args
[i
]);
198 if (i
< decl
->data
.dfun
.nargs
- 1)
199 safe_fprintf(cout
, ", ");
201 safe_fprintf(cout
, ") /*");
202 if (decl
->data
.dfun
.rtype
!= NULL
) {
203 safe_fprintf(cout
, " :: ");
204 for (int i
= 0; i
<decl
->data
.dfun
.natypes
; i
++) {
205 type_print(decl
->data
.dfun
.atypes
[i
], cout
);
206 safe_fprintf(cout
, " ");
208 safe_fprintf(cout
, "-> ");
209 type_print(decl
->data
.dfun
.rtype
, cout
);
211 safe_fprintf(cout
, "*/ {\n");
212 for (int i
= 0; i
<decl
->data
.dfun
.nbody
; i
++)
213 stmt_genc(decl
->data
.dfun
.body
[i
], 1, cout
);
214 safe_fprintf(cout
, "}\n");
217 return vardecl_genc(decl
->data
.dvar
, 0, cout
);
222 int genc(struct ast
*ast
, FILE *cout
)
225 "#include <stdint.h>\n"
226 "#include <stdlib.h>\n"
227 "#define WORD intptr_t\n"
228 "struct splc_tuple { WORD fst; WORD snd; };\n"
229 "struct splc_list { WORD hd; struct splc_list *tl; };\n"
230 "struct splc_tuple *splc_tuple(WORD fst, WORD snd) {\n"
231 "\tstruct splc_tuple *res = malloc(sizeof(splc_tuple));\n"
232 "\tres->fst = fst;\n"
233 "\tres->snd = snd;\n"
236 "struct splc_list *splc_cons(WORD hd, struct splc_list *tl) {\n"
237 "\tstruct splc_list *res = malloc(sizeof(splc_tuple));\n"
242 "WORD splc_power(WORD l, WORD r) {\n"
244 "\twhile(l-- >= 0)\n"
250 for (int i
= 0; i
<ast
->ndecls
&& r
== 0; i
++) {
252 r
= decl_genc(ast
->decls
[i
], cout
);