]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
Started working on preliminary code generation
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 29 Dec 2015 01:44:00 +0000 (20:44 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 29 Dec 2015 01:44:00 +0000 (20:44 -0500)
Makefile
source/codegen.c [new file with mode: 0644]
source/main.c
source/sclpl.h

index 56d89fc002a581c9152cc4e5eea3ce55799c6d1d..5fe3b0a6844de9a8643d85d05855e926d66a9a89 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -17,13 +17,14 @@ LDFLAGS  += ${LIBS}
 # Build Targets and Rules
 #------------------------------------------------------------------------------
 OBJS = source/main.o    \
-       source/lexer.o   \
-       source/parser.o  \
-       source/pprint.o  \
        source/gc.o      \
        source/vec.o     \
+       source/pprint.o  \
+       source/lexer.o   \
+       source/parser.o  \
        source/ast.o     \
-       source/anf.o
+       source/anf.o     \
+       source/codegen.o
 
 all: options sclpl test
 
diff --git a/source/codegen.c b/source/codegen.c
new file mode 100644 (file)
index 0000000..9969850
--- /dev/null
@@ -0,0 +1,91 @@
+#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;
+    }
+}
index 8af8530cede41dfeb164aa47288edf74b086ad49..ffc00b7ca3a6be647f3fcb40e522d375245f472c 100644 (file)
@@ -31,6 +31,10 @@ static int emit_anf(void) {
 }
 
 static int emit_csource(void) {
+    AST* tree = NULL;
+    Parser* ctx = parser_new(NULL, stdin);
+    while(NULL != (tree = normalize(toplevel(ctx))))
+        codegen(stdout, tree);
     return 0;
 }
 
index 1a2282ee19dcd00532b798e08ec532bab2d771ee..730ccafafe4dcfd26548221ccdc825b66def965b 100644 (file)
@@ -191,6 +191,13 @@ AST* let_val(AST* let);
 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 {
@@ -214,12 +221,6 @@ AST* toplevel(Parser* p);
 
 // 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 */