Reader now reads from file, and ignores (some) comments
This commit is contained in:
parent
78f2cc39f0
commit
d049c7ec40
|
@ -0,0 +1,11 @@
|
|||
;; Test comment
|
||||
(DEFINE
|
||||
(APPEND
|
||||
(LAMBDA
|
||||
(X Y)
|
||||
(COND ((NULL X) Y) (T (CONS (CAR X) (APPEND (CDR X Y)))))))
|
||||
(CONC
|
||||
(LAMBDA
|
||||
(X Y)
|
||||
(COND ((NULL (CDR X)) (RPLACD X Y)) (T (CONC (CDR X) Y)))
|
||||
X)))
|
|
@ -14,11 +14,14 @@
|
|||
Both these extensions can be disabled by using the `--strict` command line
|
||||
switch."
|
||||
(:require [beowulf.bootstrap :refer [*options*]]
|
||||
[clojure.java.io :refer [file reader]]
|
||||
[clojure.math.numeric-tower :refer [expt]]
|
||||
[clojure.string :refer [starts-with? upper-case]]
|
||||
[instaparse.core :as i]
|
||||
[instaparse.failure :as f]
|
||||
[beowulf.cons-cell :refer [make-beowulf-list make-cons-cell NIL]]))
|
||||
[beowulf.cons-cell :refer [make-beowulf-list make-cons-cell NIL]])
|
||||
(:import [java.io InputStream PushbackReader]
|
||||
[instaparse.gll Failure]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;
|
||||
|
@ -35,6 +38,8 @@
|
|||
be operated upon further."
|
||||
(i/parser
|
||||
(str
|
||||
;; we tolerate whitespace and comments around legitimate input
|
||||
"raw := expr | opt-comment expr opt-comment;"
|
||||
;; top level: we accept mexprs as well as sexprs.
|
||||
"expr := mexpr | sexpr ;"
|
||||
|
||||
|
@ -58,7 +63,8 @@
|
|||
semi-colon := ';';"
|
||||
|
||||
;; comments. I'm pretty confident Lisp 1.5 did NOT have these.
|
||||
"comment := opt-space <';;'> #'[^\\n\\r]*';"
|
||||
"opt-comment := opt-space | comment;"
|
||||
"comment := opt-space <';;'> #'[^\\n\\r]*' opt-space;"
|
||||
|
||||
;; sexprs. Note it's not clear to me whether Lisp 1.5 had the quote macro,
|
||||
;; but I've included it on the basis that it can do little harm.
|
||||
|
@ -93,8 +99,9 @@
|
|||
an `ex-info`, with `p` as the value of its `:failure` key."
|
||||
([p]
|
||||
(if
|
||||
(instance? instaparse.gll.Failure p)
|
||||
(throw (ex-info (str "Ic ne behæfd: " (f/pprint-failure p)) {:cause :parse-failure :failure p}))
|
||||
(instance? Failure p)
|
||||
(throw (ex-info (str "Ic ne behæfd: " (f/pprint-failure p)) {:cause :parse-failure
|
||||
:failure p}))
|
||||
(simplify p :sexpr)))
|
||||
([p context]
|
||||
(if
|
||||
|
@ -114,7 +121,7 @@
|
|||
(= context :mexpr)
|
||||
[:quoted-expr p]
|
||||
p)
|
||||
:comment (if
|
||||
(:comment :opt-comment) (if
|
||||
(:strict *options*)
|
||||
(throw
|
||||
(ex-info "Cannot parse comments in strict mode"
|
||||
|
@ -139,6 +146,7 @@
|
|||
[:mvar "list"]
|
||||
[:args (apply vector (map simplify (rest p)))]]
|
||||
(map #(simplify % context) p))
|
||||
:raw (first (remove empty? (map simplify (rest p))))
|
||||
;;default
|
||||
p)))
|
||||
p)))
|
||||
|
@ -311,6 +319,10 @@
|
|||
|
||||
(defn READ
|
||||
"An implementation of a Lisp reader sufficient for bootstrapping; not necessarily
|
||||
the final Lisp reader."
|
||||
the final Lisp reader. `input` should be either a string representation of a LISP
|
||||
expression, or else an input stream. A single form will be read."
|
||||
[input]
|
||||
(gsp (or input (read-line))))
|
||||
(cond
|
||||
(string? input) (gsp (or input (read-line)))
|
||||
(instance? InputStream input) (READ (slurp input))
|
||||
:else (throw (ex-info "READ: `input` should be a string or an input stream" {}))))
|
||||
|
|
Loading…
Reference in a new issue