Actually, it's not too hard to create a ReadOnlyString and ReadOnlyArray which have several methods overridden to produce errors. Overriding at: and basicAt: goes an awefully long way. Then, the Parser needs to be updated. I did this once, but it was in an image too divergent from the main Squeak image that it could really be useful. :|
Is it necessary to change the parser?
I had been thinking instead about changing the behavior of class String so that Strings are immutable (by redefining at:put:, replaceFrom:to:with:startingAt:, byteAt:put: and what else?), and creating a separate class MutableString for those few places where string mutation is really used. I wonder how common this behavior is.
One tricky thing is that string mutation is sometimes used to create a string that will then be treated as immutable. See, for example, Symbol asString. This could (and probably should) be changed to use String withAll: aSymbol. Mutating a string is OK while it is being constructed (how else could it be constructed?, but taboo once it has been handed off to the world.)
Andrew