They did parse it, albeit indirectly, by Racket’s reader. Co2 is a language, not a bunch of function calls, so it’s not quite the same as building a library in your favorite language. The article even gives examples of new syntax they produced.
Parsing Lisp in Lisp is so easy because it’s free.
I'd say this depends of the complexity of the I/O system.
This was the original claim, which you supported:
'Parsing Lisp in Lisp is so easy because it’s free.'
The example you were pointing to is explicitly calling a parsing engine of Racket via 'read-syntax'. Actually more complicated than the usual s-expression reader - which does only read s-expressions, but has no further idea about Scheme syntax.
Check the usual Scheme report / Racket documentation for the definition of Scheme syntax, syntax objects and its extension mechanisms (macros, ...). I'd say the whole thing is non-trivial. There is a grammar of Scheme, but it is not fixed, because there are extension mechanisms, which make parsing challenging.
It's 'free' because it's a provided language facility - but not free in terms of complexity of the concepts to understand.
And no, the syntax of s-expressions (-> data) is not the syntax of Lisp. It's just the syntax of s-expressions. Search the Scheme report for 'syntax'...
Parsing Lisp in Lisp is so easy because it’s free.