Skip to content

Instantly share code, notes, and snippets.

@ray1729
Created December 6, 2012 21:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ray1729/4228815 to your computer and use it in GitHub Desktop.
Save ray1729/4228815 to your computer and use it in GitHub Desktop.
My first parsatron
(ns parsatron-play.core
(:refer-clojure :exclude [char])
(:require [the.parsatron :refer :all]))
;; Goal is to parse something like:
;; ##INFO=<ID=foo,Type=Integer,Number=1,Description="Some description, which may contain commas">
(defparser not-char [& cs]
(token (complement (set cs))))
(defparser info-tag []
(string "##INFO="))
(defparser key-name []
(let->> [k (many (not-char \=))]
(always (apply str k))))
(defparser simple-value []
(let->> [v (many (not-char \, \>))]
(always (apply str v))))
(defparser quoted-value []
(let->> [v (between (char \") (char \") (many (not-char \")))]
(always (apply str v))))
(defparser key-value-pair []
(let->> [k (key-name)
_ (char \=)
v (either (quoted-value) (simple-value))]
(always [k v])))
(defparser ws []
(either (char \space) (char \,)))
(defparser tok [token-parser]
(many (ws))
token-parser)
(defparser list-of-key-value-pairs []
(many (attempt (tok (key-value-pair)))))
(defparser eol []
(choice (>> (char \return) (char \newline))
(char \newline)
(char \return)
(eof)))
(defparser info-line []
(let->> [_ (info-tag)
kvs (between (char \<) (char \>) (list-of-key-value-pairs))
_ (eol)]
(always (into {} kvs))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment