add reader syntax for []
Now [...] reads to (¤ ...) for easy semantic processing
This commit is contained in:
@@ -2,9 +2,15 @@
|
|||||||
|
|
||||||
(include "utils.macros.scm")
|
(include "utils.macros.scm")
|
||||||
|
|
||||||
(import (chicken pathname)
|
(import
|
||||||
brev-separate
|
(chicken base)
|
||||||
fmt)
|
(chicken io)
|
||||||
|
(chicken pathname)
|
||||||
|
(chicken port)
|
||||||
|
(chicken read-syntax)
|
||||||
|
(chicken string)
|
||||||
|
brev-separate
|
||||||
|
fmt)
|
||||||
|
|
||||||
(define (read-forms acc)
|
(define (read-forms acc)
|
||||||
(let ((r (read)))
|
(let ((r (read)))
|
||||||
@@ -16,7 +22,41 @@
|
|||||||
(with-input-from-file (pathname-strip-directory file)
|
(with-input-from-file (pathname-strip-directory file)
|
||||||
(fn (read-forms (list))))))
|
(fn (read-forms (list))))))
|
||||||
|
|
||||||
|
(define (read-bracket port)
|
||||||
|
(let loop ((c (read-char port))
|
||||||
|
(str (string)))
|
||||||
|
(cond ((char=? c #\])
|
||||||
|
(cons '¤
|
||||||
|
(with-input-from-string str
|
||||||
|
(fn (port-map identity read)))))
|
||||||
|
((char=? c #\[)
|
||||||
|
(loop port (conc )))
|
||||||
|
(else
|
||||||
|
(loop (read-char port)
|
||||||
|
(conc str c))))))
|
||||||
|
|
||||||
|
(define open-bracket-counter (make-parameter 0))
|
||||||
|
|
||||||
(define (read-raw-forms input-source)
|
(define (read-raw-forms input-source)
|
||||||
|
(let ((bracket-end (gensym)))
|
||||||
|
(set-read-syntax!
|
||||||
|
#\]
|
||||||
|
(lambda (port)
|
||||||
|
(when (= 0 (open-bracket-counter))
|
||||||
|
(error "Unmatched closing bracket"))
|
||||||
|
(open-bracket-counter (- (open-bracket-counter) 1))
|
||||||
|
bracket-end))
|
||||||
|
|
||||||
|
(set-read-syntax!
|
||||||
|
#\[
|
||||||
|
(lambda (port)
|
||||||
|
(open-bracket-counter (+ (open-bracket-counter) 1))
|
||||||
|
(let loop ((r (read port))
|
||||||
|
(acc (list)))
|
||||||
|
(if (eq? r bracket-end)
|
||||||
|
(cons '¤ (reverse acc))
|
||||||
|
(loop (read port)
|
||||||
|
(cons r acc)))))))
|
||||||
(if (eq? input-source 'stdin)
|
(if (eq? input-source 'stdin)
|
||||||
(read-forms (list))
|
(read-forms (list))
|
||||||
(read-from-file input-source)))
|
(read-from-file input-source)))
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
(test '%define (atom-to-fmt-c 'define))
|
(test '%define (atom-to-fmt-c 'define))
|
||||||
(test '%pointer (atom-to-fmt-c 'pointer))
|
(test '%pointer (atom-to-fmt-c 'pointer))
|
||||||
(test '%array (atom-to-fmt-c 'array))
|
(test '%array (atom-to-fmt-c 'array))
|
||||||
(test 'vector-ref (atom-to-fmt-c '@))
|
(test 'vector-ref (atom-to-fmt-c '¤))
|
||||||
(test '%include (atom-to-fmt-c 'include))
|
(test '%include (atom-to-fmt-c 'include))
|
||||||
(test '%cast (atom-to-fmt-c 'cast))
|
(test '%cast (atom-to-fmt-c 'cast))
|
||||||
|
|
||||||
|
|||||||
28
tests/reader.scm
Normal file
28
tests/reader.scm
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
(import (chicken port))
|
||||||
|
|
||||||
|
(test-group "reader"
|
||||||
|
;; []-syntax. For array types and array access expressions
|
||||||
|
(test '((¤ * char))
|
||||||
|
(with-input-from-string "[* char]"
|
||||||
|
(lambda ()
|
||||||
|
(read-raw-forms 'stdin))))
|
||||||
|
|
||||||
|
(test '((¤ * * char const 512))
|
||||||
|
(with-input-from-string "[* * char const 512]"
|
||||||
|
(lambda ()
|
||||||
|
(read-raw-forms 'stdin))))
|
||||||
|
|
||||||
|
(test '((¤))
|
||||||
|
(with-input-from-string "[]"
|
||||||
|
(lambda ()
|
||||||
|
(read-raw-forms 'stdin))))
|
||||||
|
|
||||||
|
(test '((¤ (¤)))
|
||||||
|
(with-input-from-string "[[]]"
|
||||||
|
(lambda ()
|
||||||
|
(read-raw-forms 'stdin))))
|
||||||
|
|
||||||
|
(test '((¤ (¤ const char)))
|
||||||
|
(with-input-from-string "[[const char]]"
|
||||||
|
(lambda ()
|
||||||
|
(read-raw-forms 'stdin)))))
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
(include "basic.scm")
|
(include "basic.scm")
|
||||||
(include "semen.scm")
|
(include "semen.scm")
|
||||||
|
(include "reader.scm")
|
||||||
(include "utils.scm")
|
(include "utils.scm")
|
||||||
|
|
||||||
;;; Should be the last in the test suite
|
;;; Should be the last in the test suite
|
||||||
|
|||||||
Reference in New Issue
Block a user