Sdf To Parenthesize
XT -- A Bundle of Program Transformation Tools
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.