Impressão bonita AST com parênteses mínimos

Estou implementando uma impressora bonita para um AST JavaScript e queria perguntar se alguém está ciente de um algoritmo "adequado" para automaticamente usar um parêntese entre parênteses com base na precedência do operador eassociatividade. Eu não encontrei nenhum material útil no google.

O que parece óbvio é que um operador cujo pai tenha uma precedência maior deve ser entre parênteses, por exemplo:

(x + y) * z // x + y has lower precedence

No entanto, existem também alguns operadores que não são associativos, caso em que os parênteses ainda são necessários, por exemplo:

x - (y - z) // both operators have the same precedence

Eu estou querendo saber qual seria a melhor regra para este último caso. Quer seja suficiente dizer que para divisão e subtração, a sub-expressão de rh deve ser entre parênteses se tiver menos deou igual precedência.