Guest User

Untitled

a guest
Oct 24th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (defn parser [tokens template]
  2.   (loop [result-map (first template), temps  (rest template), tokens tokens]
  3.     (cond (= :end (first temps)) (do (println "reached :end") [result-map tokens])
  4.           (or (empty? temps ) (empty tokens) (do (println "either templates or tokens are empty") nil))
  5.           (let [pat   (first temps)
  6.                 tok (first tokens)]
  7.             (cond
  8.              
  9.              (or (and (= java.util.regex.Pattern (type pat)) ;do we match a pattern we should skip
  10.                       (re-matches pat tok))  
  11.                  (= pat tok))     ;or have a litteral match ?
  12.              (recur result-map (rest temps) (rest tokens)) ; we skip
  13.              
  14.              
  15.              (list? pat) ;we found a list expressing how to extract
  16.              (let [[kw re fu] pat
  17.                    match (re-matches re tok)]
  18.                (if match ; we could extract the value, continuing.
  19.                    (recur (conj result-map
  20.                                 [kw ((read-func fu) match)])
  21.                           (rest temps) (rest tokens))
  22.                    nil))
  23.              
  24.              (map? pat)
  25.              (let [{:keys [kw next-template type]} pat]
  26.                (cond (= type :1)
  27.                      (if-let [ [sub rem-tokens] (parser tokens next-template)]
  28.                        (recur (conj result-map [kw sub]) (rest temps) rem-tokens)
  29.                        (raise-excp pat tok tokens))
  30.                      
  31.                      (= type :*)
  32.                      (let [[res rem-tokens]
  33.                            (loop [result [] tokens tokens]
  34.                              (if-let [ [substruct rem-tokens] (parser tokens next-template)]
  35.                                (recur (conj result substruct) rem-tokens)
  36.                                [result tokens]))]
  37.                        (recur (conj result-map [kw res])
  38.                               (rest temps) rem-tokens))
  39.                      
  40.                      :else (raise-excp pat tok (rest tokens))))
  41.              
  42.              :else nil)))))
Add Comment
Please, Sign In to add comment