I think you're essentially right, but the "toy language" is often a subset of some real language. in my compilers course it was a subset of pascal, which targeted a very friendly IR. there's no inherent reason why the same couldn't be done for a subset of C, Java, or Scheme. in particular, Scheme has a relatively simple syntax to parse. C is fairly difficult to parse, not sure to what degree the grammar can be simplified by removing features.