--- /dev/null
+#include <sclpl.h>
+
+void codegen(FILE* file, AST* tree)
+{
+ switch(tree->type) {
+ case AST_STRING:
+ fprintf(file, "\"%s\"", string_value(tree));
+ break;
+
+ case AST_SYMBOL:
+ //fprintf(file, "__symbol(\"%s\")", symbol_value(tree));
+ break;
+
+ case AST_CHAR:
+ //fprintf(file, "'%s'", char_value(tree));
+ break;
+
+ case AST_INT:
+ fprintf(file, "%ld", integer_value(tree));
+ break;
+
+ case AST_FLOAT:
+ fprintf(file, "%f", float_value(tree));
+ break;
+
+ case AST_BOOL:
+ fprintf(file, "%s", bool_value(tree) ? "true" : "false");
+ break;
+
+ case AST_IDENT:
+ fprintf(file, "%s", ident_value(tree));
+ break;
+
+ case AST_TEMP:
+ fprintf(file, "_t%lu", temp_value(tree));
+ break;
+
+ case AST_DEF:
+ if (def_value(tree)->type == AST_FUNC) {
+ fprintf(file, "val %s", def_name(tree));
+ codegen(file, def_value(tree));
+ } else {
+ fprintf(file, "val %s", def_name(tree));
+ fprintf(file, " = ");
+ codegen(file, def_value(tree));
+ fprintf(file, ";");
+ }
+ break;
+
+ case AST_IF:
+ break;
+
+ case AST_FUNC:
+ fprintf(file,"(");
+ for (size_t i = 0; i < vec_size(func_args(tree)); i++) {
+ fprintf(file,"val ");
+ codegen(file, vec_at(func_args(tree), i));
+ if (i+1 < vec_size(func_args(tree)))
+ fprintf(file,", ");
+ }
+ fprintf(file,") {\n");
+ codegen(file, func_body(tree));
+ fprintf(file,"\n}\n");
+ break;
+
+ case AST_FNAPP:
+ codegen(file, fnapp_fn(tree));
+ fprintf(file,"(");
+ for (size_t i = 0; i < vec_size(fnapp_args(tree)); i++) {
+ codegen(file, vec_at(fnapp_args(tree), i));
+ if (i+1 < vec_size(fnapp_args(tree)))
+ fprintf(file,",");
+ }
+ fprintf(file,")");
+ break;
+
+ case AST_LET:
+ fprintf(file,"{val ");
+ codegen(file, let_var(tree));
+ fprintf(file," = ");
+ codegen(file, let_val(tree));
+ fprintf(file,";");
+ codegen(file, let_body(tree));
+ fprintf(file,"}");
+ break;
+
+ case AST_REQ:
+ default:
+ break;
+ }
+}
AST* let_body(AST* let);
void let_set_body(AST* let, AST* body);
+/* Pretty Printing
+ *****************************************************************************/
+void pprint_token_type(FILE* file, Tok* token);
+void pprint_token_value(FILE* file, Tok* token);
+void pprint_token(FILE* file, Tok* token, bool print_loc);
+void pprint_tree(FILE* file, AST* tree, int depth);
+
/* Lexer and Parser Types
*****************************************************************************/
typedef struct {
// Compiler Passes
AST* normalize(AST* tree);
-
-/* Pretty Printing
- *****************************************************************************/
-void pprint_token_type(FILE* file, Tok* token);
-void pprint_token_value(FILE* file, Tok* token);
-void pprint_token(FILE* file, Tok* token, bool print_loc);
-void pprint_tree(FILE* file, AST* tree, int depth);
+void codegen(FILE* file, AST* tree);
#endif /* SCLPL_H */