J
Number of characters: 208
After Jeff Moser's comment, I realized that I had completely forgotten about this language... I'm no expert, but my first attempt went rather well.
e=:>@{:@f@;:
f=:''&(4 :0)
'y x'=.x g y
while.($y)*-.')'={.>{.y do.'y x'=.(x,>(-.'/'={.>{.y){('%';y))g}.y end.y;x
)
g=:4 :0
z=.>{.y
if.z='('do.'y z'=.f}.y else.if.z='-'do.z=.'_',>{.}.y end.end.(}.y);":".x,z
)
It's a bit annoying, having to map x/y and -z into J's x%y and _z. Without that, maybe 50% of this code could disappear.