skeleton of the new parser
This commit is contained in:
parent
f9f212ffbf
commit
440ee35097
1 changed files with 43 additions and 0 deletions
43
src/marginalia/parser.clj
Normal file
43
src/marginalia/parser.clj
Normal file
|
@ -0,0 +1,43 @@
|
|||
(ns marginalia.parser
|
||||
"Provides the parsing facilities for Marginalia."
|
||||
(:require [clojure.java.io :as io]
|
||||
[clojure.string :as str])
|
||||
(:use clojure.contrib.reflect))
|
||||
|
||||
(defrecord CommentLine [line comment-str])
|
||||
|
||||
(defn- read-comment
|
||||
[reader semicolon]
|
||||
(let [sb (StringBuilder.)]
|
||||
(.append sb semicolon)
|
||||
(loop [ch (char (.read reader))]
|
||||
(if (or (= ch \newline)
|
||||
(= ch \return)
|
||||
(= ch -1))
|
||||
(CommentLine. (.getLineNumber reader) (.toString sb))
|
||||
(do
|
||||
(.append sb (Character/toString ch))
|
||||
(recur (char (.read reader))))))))
|
||||
|
||||
(defn make-parse-fn
|
||||
[src]
|
||||
(let [rdr (clojure.lang.LineNumberingPushbackReader. (java.io.StringReader. src))]
|
||||
(fn []
|
||||
(let [old-cmt-rdr (aget (get-field clojure.lang.LispReader :macros nil) (int \;))]
|
||||
(aset (get-field clojure.lang.LispReader :macros nil) (int \;) read-comment)
|
||||
(let [result (read rdr)]
|
||||
(aset (get-field clojure.lang.LispReader :macros nil) (int \;) old-cmt-rdr)
|
||||
result)))))
|
||||
|
||||
(comment
|
||||
(def R (make-parse-fn ";; Some Comment
|
||||
;; with two lines
|
||||
; maybe 3?
|
||||
;
|
||||
|
||||
(defn hello-world
|
||||
\"This is a docstring\"
|
||||
[name]
|
||||
(pritnln \"hello\" name \"!\"))"))
|
||||
|
||||
(R))
|
Loading…
Reference in a new issue