Actually I think I have seen a library for MzScheme that does it this way.
Sure, it's somewhat more verbose for this toy examples - but every intermediate expression (and the whole thing) is a Lisp-Object in its own right.
You would not even need macros.
Edit: There is a place for macros here to make things less verbose. Just write a macro that 'compiles': (* (+ a (* b))) into the form above.
For convenience you can offer a function that builds RegExps out of strings in the usual way.
Actually I think I have seen a library for MzScheme that does it this way.