Great blog post! I did something very similar when I was working on an implementation of the Mustache templating language. If you haven't built a simple recursive descent parser already, I highly recommend doing so — it helped me get a lot better at programming.

Interesting extension of this exercise would be to replace your custom AST with the AST exposed by Python, then use the compile() builtin to compile said AST into a PyCodeObject ready for direct execution by the Python VM. :)