In addition to ? + and *, a useful notation could be "list" of the form something like: E = S / T; which would mean E = T | E S T; This would produce two lists of Ss and Ts. This would automatically take care of what I think is one of the most frequent transforms of the parse tree. Processing the list from one end or the other would take care of associativity.