---++ Introduction =sdf2parenthesize= generates a Stratego transformation tool that adds the necessary parentheses to an abstract syntax tree. The information is obtained from an SDF syntax definition. ---++ Example For example, if Plus is declared to left associative, then the following rule will be generated: ExpParenthesize : Plus(q_15, Plus(o_15, p_15)) -> Plus(q_15, Parenthetical(Plus(o_15, p_15))) A relative priority related example: ExpParenthesize : Mul(Plus(v_2, w_2), u_2) -> Mul(Parenthetical(Plus(v_2, w_2)), u_2) ExpParenthesize : Mul(t_2, Plus(v_2, w_2)) -> Mul(t_2, Parenthetical(Plus(v_2, w_2))) The tool supports: ---++++ Relative priorities Exp "&&" Exp -> Exp > Exp "||" Exp -> Exp ---++++ Groups of associative productions {left: Exp "*" Exp -> Exp Exp "/" Exp -> Exp } > {left: Exp "+" Exp -> Exp Exp "-" Exp -> Exp } ---++++ Associativity attributes: non-assoc, assoc, left, right. Exp "+" Exp -> Exp {left, cons("Plus")} ---++++ Kernel SDF associativities prod1 assoc prod2 ---++ Open Issues Does this solve all the parentheses related problems? No, unfortunately not. The tool does not support {prefer} attributes, which are for example used in the dangling else problem. So, if you want to make sure that IfThenElse(_, IfThen(_, _, _), _) is pretty-printed correctly as: if a then (if b then c) else d then you still need to implement this be hand. Notice that you can import the generated rules in this handwritten tool. I don't have a clue now I could automate these issues in the generator, since the ={prefer}= attributes are not really declarative.