Hi,

I would suggest to have a look at fnparse[1]. It's
really cool. A commit-log parser might look like
this:

(def linebreak
  (alt (conc (opt (lit \return)) (lit \newline))
       (lit \return)))

(def hex-digit
  (alt-lit-seq "0123456789abcdef"))

(def checksum
  (semantics (rep+ hex-digit) #(apply str %)))

(def commit
  (complex [_         (conc-lit-seq "commit ")
            commit-id checksum
            _         linebreak
            _         (conc-lit-seq "parent ")
            parent-id checksum
            _         (rep= 2 linebreak)
            msg       (semantics (rep* (except anything
                                               (conc linebreak
(conc-lit-seq "commit "))))
                                 #(apply str %))]
    {:id commit-id :parent parent-id :message msg}))

(def commit-log
  (rep* commit))

This should parse a log like:

commit a2b5927f24c
parent c726fe5211a

This is
the
message
commit 285abb36e12
parent 81f2e35bc61

Another
message.

The result would be:
[{:id a2b5927f24c :parent c726fe5211a :message "This is\nthe\nmessage"}
 {:id 285abb36e12 :parent 81f2e35bc61 :message "Another\nmessage."}]

Note, the code is not tested, but should be close.

Hope this helps.

Sincerely
Meikel

[1]: http://github.com/joshua-choi/fnparse/tree/master


Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to