Yet Another Parser Combinator Library with a modern DSL for writing custom parsers.
pchar parses a character pnumber parses a number pinteger parses an integer pbool parses a bool puppercase parses an uppercase letter plowercase parses a lowercase letter pletter parses any letter pword parses a string of letters pcommasep parses comma-separated values (like in json) pexactly parses the provided string exactly (and then coerces to string)
pconcat Parses and then concatenates the result into a list pchoice Returns the first parser that passes, otherwise fails p* Parses zero or more p+ Parses one or more pnoresult Parses and then returns nil in the result pbetween Takes 3 parsers, and returns the result of the second poptional parses but does not fail if there is a failure pfollowedby parses, ensuring the second parser passes but only returning the first result pprecededby parses, ensuring the first parser passes but only returning the second result palways parses anything except EOF pnot returns state unless the parser passes, which results in a fail pexcept parses a character unless the given parser passes puntil parses into a list (using palways) until the given parser passes preturn returns t-state with a given bit of data
prepare-string-for-parsing turns a string into a state that is ready for parsing
with-state anaphoric macro that provides a closure with a state variable for easy error railroading
defparser defines a function that puts your body into a with-state
plet* A macro that works like let* but each body of the binding is a parser-fn that is applied to the state subsequently, the body is what will be contained in the result (should all the parsers pass)
(asdf:test-system :combray)
- Add debugging middleware (add history and tags to state?)
- Add more primitives
- Add more combinators
- Provide more examples/docs