|
19 | 19 | (defmulti parse-next |
20 | 20 | "Parse the next element from the given reader. Dispatch is done using the first |
21 | 21 | available character. If the given delimiter is reached, nil shall be returned." |
22 | | - (fn [reader delimiter] |
| 22 | + (fn [reader delimiter] |
23 | 23 | (when-let [c (r/peek-char reader)] |
24 | 24 | (cond (whitespace? c) :whitespace |
25 | 25 | (= c delimiter) :matched |
|
29 | 29 | (defn- parse-prefixed |
30 | 30 | "Ignore the first available char and parse the next token of the given type." |
31 | 31 | [type reader delim] |
32 | | - (let [p (r/read-char reader)] |
| 32 | + (let [p (r/read-char reader)] |
33 | 33 | (if-let [t (parse-next reader delim)] |
34 | 34 | (token type t) |
35 | 35 | (throw-reader reader "'" type "' expects a value following the prefix '\\" p "'.")))) |
|
38 | 38 | "Parse until the given delimiter is reached." |
39 | 39 | [type delim reader] |
40 | 40 | (ignore reader) |
41 | | - (apply token |
42 | | - type |
| 41 | + (apply token |
| 42 | + type |
43 | 43 | (doall |
44 | | - (take-while |
45 | | - (complement nil?) |
| 44 | + (take-while |
| 45 | + (complement nil?) |
46 | 46 | (repeatedly #(parse-next reader delim)))))) |
47 | 47 |
|
48 | 48 | (defn- parse-whitespace |
|
51 | 51 | [reader] |
52 | 52 | (let [c (r/read-char reader) |
53 | 53 | [t p?] (if (linebreak? c) [:newline linebreak?] [:whitespace space?])] |
54 | | - (token t |
| 54 | + (token t |
55 | 55 | (loop [r [c]] |
56 | 56 | (if-not (p? (r/peek-char reader)) |
57 | 57 | (apply str r) |
|
77 | 77 | (let [buf (StringBuffer.)] |
78 | 78 | (loop [escape? false] |
79 | 79 | (if-let [c (r/read-char reader)] |
80 | | - (if (and (not escape?) (= c \")) |
| 80 | + (if (and (not escape?) (= c \")) |
81 | 81 | (token :token (re-pattern (.toString buf))) |
82 | | - (do |
| 82 | + (do |
83 | 83 | (.append buf c) |
84 | 84 | (recur (and (not escape?) (= c \\))))) |
85 | 85 | (throw-reader reader "Unexpected EOF while reading regular expression."))))) |
|
131 | 131 | (= c \newline) (let [s (.toString buf)] |
132 | 132 | (.setLength buf 0) |
133 | 133 | (recur escape? :multi-line (conj results s))) |
134 | | - :else (do |
| 134 | + :else (do |
135 | 135 | (.append buf c) |
136 | 136 | (recur (and (not escape?) (= c \\)) result-type results))) |
137 | 137 | (throw-reader reader "Unexpected EOF while reading regular expression."))))) |
138 | 138 |
|
139 | | -(defn- parse-keyword |
| 139 | +(defn- parse-keyword |
140 | 140 | "Parse keyword. Produces `:token` result with an optional map containing a |
141 | 141 | `:namespaced?`field for keywords like `::xyz`." |
142 | 142 | [reader] |
|
156 | 156 | (throw-reader reader "Cannot parse value starting with '" c "'.") |
157 | 157 | (when delim (throw-reader reader "Unexpected EOF (expected '" delim "')")))) |
158 | 158 |
|
159 | | -(defmethod parse-next :unmatched [reader _] |
| 159 | +(defmethod parse-next :unmatched [reader _] |
160 | 160 | (throw-reader reader "Unmatched delimiter '" (r/peek-char reader) "'.")) |
161 | 161 |
|
162 | 162 | (defmethod parse-next :token [reader _] (read-next :token edn/read reader)) |
|
169 | 169 | (defmethod parse-next :vector [reader _] (parse-delimited :vector \] reader) ) |
170 | 170 | (defmethod parse-next :map [reader _] (parse-delimited :map \} reader) ) |
171 | 171 | (defmethod parse-next :sharp [reader delim] (parse-reader-macro reader delim)) |
172 | | -(defmethod parse-next :unquote [reader delim] (parse-unquote reader delim)) |
| 172 | +(defmethod parse-next :unquote [reader delim] (parse-unquote reader delim)) |
173 | 173 | (defmethod parse-next :quote [reader delim] (parse-prefixed :quote reader delim)) |
174 | 174 | (defmethod parse-next :syntax-quote [reader d] (parse-prefixed :syntax-quote reader d)) |
175 | | -(defmethod parse-next :string [reader delim] (parse-string reader delim)) |
| 175 | +(defmethod parse-next :string [reader delim] (parse-string reader delim)) |
176 | 176 | (defmethod parse-next :keyword [reader delim] (parse-keyword reader)) |
0 commit comments