This commit is contained in:
msyds committed 2026-09-22 08:02:54 -06:00
1 parent 90526500c9
commit a4e068d09b
4 files changed
+51 -6

No files matched your search

+10 -2
View File
@@ -26,7 +26,8 @@ symbol = ordinary-symbol <intertoken-space>
(* number *)
number = num-10 <intertoken-space>
num-10 = sign #"[0-9]+"
num-10 = sign uinteger-10
<uinteger-10> = #"[0-9]+"
sign = ('+' | '-')?
exactness = ('#i' | '#e')?
@@ -42,4 +43,11 @@ intraline-whitespace = #"[ \t\f]"
line-ending = #"[\r\n]|\r\n"
comment = <semicolon> #"[^\n\r]*"
intertoken-space = atmosphere*
directive = #"#!(no-)?fold-case"
directive = #"#!(no-)?fold-case"
(* library *)
library-start = <intertoken-space> library
library = <left-paren> <"define-library">
<intertoken-space> library-name <right-paren>
library-name = <left-paren> library-name-part+ <intertoken-space> <right-paren>
<library-name-part> = symbol | uinteger-10
+12 -3
View File
@@ -121,20 +121,29 @@
(defn read
"`read` 작업의 결과로 생성된 콘텍스트 필드는 초기에 비어 있다. 이후
`expand/expand` 작업을 통해 콘택스트 필드를 패울 수 있다."
[text & {:keys [syntax? instaparse]
[text & {:keys [syntax? instaparse library? throw?]
:or {syntax? false
library? false
throw? false
instaparse {}}}]
(let [r (insta/parse r7rs-parser text
:start :datum-start
:start (if library? :library-start :datum-start)
instaparse)]
(if (insta/failure? r)
r
(if throw?
(throw (ex-info "reader error" {:err r}))
r)
(insta/transform
{:boolean (fn [x]
(match x
(:or "#t" "#true") true
(:or "#f" "#false") false))
:datum-start identity
:library-start identity
:library-name list
:library (fn [lib-name & decls]
#:library {:name lib-name
:declarations decls})
;; 그라머에 datum을 감추지 않은 고러서 대신 여기 모든 datum을
;; 과정할 수 있었더다. 작업 한 개만으로 syntax object들 다
;; 만들 수 있어서 이럼은 더 좋다.