]> git.mdlowis.com Git - archive/dlang-scm.git/commitdiff
Added an AST to Scheme translation layer. We can now convert DLang code to Scheme...
authorMike D. Lowis <mike@mdlowis.com>
Mon, 23 Jul 2012 17:10:42 +0000 (13:10 -0400)
committerMike D. Lowis <mike@mdlowis.com>
Mon, 23 Jul 2012 17:10:42 +0000 (13:10 -0400)
source/main.scm
source/scheme.scm [new file with mode: 0644]

index 2bffe6fb9ea2bed43cc90440d1091acfa268d415..99bd28139fa6be35097ef6710562a87d4cc102e6 100644 (file)
@@ -1,12 +1,12 @@
-(declare (uses parser))
+(declare (uses lexer parser scheme))
 
 (define (parse-file fname)
-  (define result
-    (dlang/program (dlang/lexer (open-input-file fname))))
-  (print result))
+  (define result (dlang/program (dlang/lexer (open-input-file fname))))
+  (set! result (scheme-program result))
+  result)
 
 ; If we have a file, then parse it
 (if (= 1 (length (command-line-arguments)))
-  (parse-file (car (command-line-arguments)))
+  (map print (parse-file (car (command-line-arguments))))
   (print "No input file provided."))
 
diff --git a/source/scheme.scm b/source/scheme.scm
new file mode 100644 (file)
index 0000000..7e0b2a7
--- /dev/null
@@ -0,0 +1,77 @@
+(declare (unit scheme) (uses parse-utils))
+
+(define (scheme-program lst)
+  (if (null? lst) '()
+    (append
+      (list (scheme-expression (car lst)))
+      (scheme-program (cdr lst)))))
+
+(define (scheme-expression expr)
+  (define type (syntree-type expr))
+  (cond
+    ((equal? type 'id)        (scheme-id expr))
+    ((equal? type 'character) (scheme-character expr))
+    ((equal? type 'number)    (scheme-number expr))
+    ((equal? type 'symbol)    (scheme-symbol expr))
+    ((equal? type 'string)    (scheme-string expr))
+    ((equal? type 'define)    (scheme-define expr))
+    ((equal? type 'assign)    (scheme-assign expr))
+    ((equal? type 'if)        (scheme-if expr))
+    ((equal? type 'begin)     (scheme-begin expr))
+    ((equal? type 'func)      (scheme-func expr))
+    ((equal? type 'apply)     (scheme-apply expr))
+    (else "unknown")))
+
+(define (scheme-id expr)
+  (syntree-text expr))
+
+(define (scheme-character expr)
+  (string-ref (syntree-text expr) 1))
+
+(define (scheme-number expr)
+  (syntree-text expr))
+
+(define (scheme-symbol expr)
+  (string-append "'" (substring (syntree-text expr) 1)))
+
+(define (scheme-string expr)
+  (syntree-text expr))
+
+(define (scheme-define expr)
+  (string-append
+    "(define "
+    (scheme-expression (list-ref (syntree-children expr) 0))
+    " "
+    (scheme-expression (list-ref (syntree-children expr) 1))
+    ")"))
+
+(define (scheme-assign expr)
+  (string-append
+    "(set! "
+    (scheme-expression (list-ref (syntree-children expr) 0))
+    " "
+    (scheme-expression (list-ref (syntree-children expr) 1))
+    ")"))
+
+(define (scheme-if expr)
+  (append '("if")
+    (map scheme-expression (syntree-children expr))))
+
+(define (scheme-begin expr)
+  (append '("begin")
+    (map scheme-expression (syntree-children expr))))
+
+(define (scheme-func expr)
+  (append '("lambda")
+    (scheme-idlist (car (syntree-children expr)))
+    (scheme-block (cadr (syntree-children expr)))))
+
+(define (scheme-apply expr)
+  (map scheme-expression (syntree-children expr)))
+
+(define (scheme-idlist expr)
+  (list (map scheme-expression (syntree-children expr))))
+
+(define (scheme-block expr)
+  (map scheme-expression (syntree-children expr)))
+