Seconded, FWIW. However I'd suggest that peoples' background /can/ be important in this area: as an engineer (and one who predates most CS departments) I'm inclined to be dismissive of stuff that sounds like CS geekery: but in this case the concept of an Abstract Syntax Tree that can be manipulated systematically is deeply important.
One thing I would say though is that it might turn out to be necessary to store the original source text at each node for debugging/listing purposes, but this can obviously be difficult to manipulate. So one might perforce end up with both storage for a source fragment, plus a way of regenerating something that approximates source from a node where e.g. two leaves have been exchanged to bring it in line with others which might at a later stage be elided as common subexpressions.
MarkMLl