Creating a parser combinator library to parse JSON
Prev: many | Contents | Next: JSON numbers, implemented |
Now I get to try out my implementation of many1
:
(def many1 (parser) (seq parser (many parser)))
arc> (show-parse (many1 json-number-char) "123abc") returning: (#\1 (#\2 #\3)) remaining: abc nil
The matching part is working perfectly, but I’m getting (r (r ...))
for my return value instead of the (r ...)
that I want. That’s because seq
is returning a list of the return values of its parsers: the first match and the many
match. I’ll need to modify the return value to cons the two parts together:
(def many1 (parser) (fn (p) (iflet (p2 (r1 rs)) ((seq parser (many parser)) p) (return p2 (cons r1 rs)))))
Now I get the return value I’m looking for:
arc> (show-parse (many1 json-number-char) "123abc") returning: (#\1 #\2 #\3) remaining: abc nil
Prev: many | Contents | Next: JSON numbers, implemented |
Questions? Comments? Email me andrew.wilcox [at] gmail.com