summaryrefslogtreecommitdiff
path: root/module/language/brainfuck/parse.scm
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-10-16 17:56:39 +0200
committerAndy Wingo <wingo@pobox.com>2009-10-23 15:10:25 +0200
commit8753fd537c4eadf7495f4ba867def99e77246dfc (patch)
tree75f3346261ae62909bc3d9776df0571990d44943 /module/language/brainfuck/parse.scm
parent8a4ca0ea3bd3e378fc63ef719ce828b7252b3985 (diff)
downloadguile-8753fd537c4eadf7495f4ba867def99e77246dfc.tar.gz
fix brainfuck for new tree-il, and add tests
* test-suite/Makefile.am: * test-suite/tests/brainfuck.test: Add a brainfuck test. * module/system/base/compile.scm: Also export read-and-compile. * module/language/tree-il/spec.scm (join): Fix the joiner in the 0-expression case. * module/language/tree-il/primitives.scm (+): Recognize (+ x -1) as 1-. * module/language/brainfuck/parse.scm (read-brainfuck): Return EOF if we actually received EOF, and there were no expressions read. * module/language/brainfuck/compile-tree-il.scm (compile-body): Fix the compiler for the new format of "lambda" in tree-il.
Diffstat (limited to 'module/language/brainfuck/parse.scm')
-rw-r--r--module/language/brainfuck/parse.scm13
1 files changed, 10 insertions, 3 deletions
diff --git a/module/language/brainfuck/parse.scm b/module/language/brainfuck/parse.scm
index 0a71638d8..81dbdd94a 100644
--- a/module/language/brainfuck/parse.scm
+++ b/module/language/brainfuck/parse.scm
@@ -66,9 +66,16 @@
(define (read-brainfuck p)
(let iterate ((parsed '()))
(let ((chr (read-char p)))
- (if (or (eof-object? chr) (eq? #\] chr))
- (reverse-without-nops parsed)
- (iterate (cons (process-input-char chr p) parsed))))))
+ (cond
+ ((eof-object? chr)
+ (let ((parsed (reverse-without-nops parsed)))
+ (if (null? parsed)
+ chr ;; pass on the EOF object
+ parsed)))
+ ((eqv? chr #\])
+ (reverse-without-nops parsed))
+ (else
+ (iterate (cons (process-input-char chr p) parsed)))))))
; This routine processes a single character of input and builds the