copied from
Christophe Reutenauer home page