-(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."))
--- /dev/null
+(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)))
+