Creating a parser combinator library to parse JSON
| Prev: Displaying the parse result | Contents | Next: alt |
I’ll steal an image from json.org:

Matching a JSON “true” and returning t on a successful match is easy:
(def json-true (p)
(if (begins p (coerce "true" 'cons))
(return (nthcdr 4 p) t)))
arc> (show-parse json-true "true,1,2,3") returning: t remaining: ,1,2,3 nilarc> (show-parse json-true "1,2,3") no match nil
To match any literal string, I can factor out the string that’s being matched and the return value:
(def match-literal (pat val)
(with (patlist (coerce pat 'cons)
patlen len.pat)
(fn (p)
(if (begins p patlist)
(return (nthcdr patlen p) val)))))
and make parsers for the JSON literals:
(= json-true (match-literal "true" t)) (= json-false (match-literal "false" nil)) (= json-null (match-literal "null" nil))
arc> (show-parse json-false "false") returning: nil remaining: nil
| Prev: Displaying the parse result | Contents | Next: alt |
Questions? Comments? Email me andrew.wilcox [at] gmail.com