From 8bf946ed8e60ab5f198de3072353e412bec812c0 Mon Sep 17 00:00:00 2001 From: "Mike D. Lowis" Date: Mon, 23 Jul 2012 13:10:42 -0400 Subject: [PATCH] Added an AST to Scheme translation layer. We can now convert DLang code to Scheme code --- source/main.scm | 10 +++--- source/scheme.scm | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 source/scheme.scm diff --git a/source/main.scm b/source/main.scm index 2bffe6f..99bd281 100644 --- a/source/main.scm +++ b/source/main.scm @@ -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 index 0000000..7e0b2a7 --- /dev/null +++ b/source/scheme.scm @@ -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))) + -- 2.52.0