(defparameter *json-lexer-spec* '(json (:punctuators ("{" "}" "[" "]" "," ":" ("\"" :sublex string-contents)) :keywords (true false null) :keyword-case :lower :whitespace (#\Space #\Tab #\Return #\Linefeed #\Newline) :converter json-token-converter :allow-stream-eof t) string-contents (:punctuators (("\"" :eof nil) ; nil = don't include an eof token in token stream ("\\n" :token #\Newline) ("\\t" :token #\Tab) ("\\\\" :token #\\) "\\u" ;; lexer doesn't represent "next 4 chars" etc yet )))) (defparameter *json-parser-spec* '(json (:rules (value (:or object array string number :keyword) ;; string and number come from the lexer object (:token "{" (:until "}" (:seq string (:optional :no-ws ":" :no-ws value)) :separator ",")) array (:token "[" (:until "]" value :separator ","))) :ignore (:whitespace comment))))