let convert r =
  let e = {
    mantiss  = Buffer.create 64 ; sign = Positive ;
    exponent = Buffer.create 64 ;
    coma = 0 ; state = Integral ;
  } in
  String.iter
    (fun c ->
       let tk = token c in
       match e.state , tk with
         | _ , Dot -> e.state <- Fraction ;
         | _ , Exp -> e.state <- Exponent ;
         | (Integral|Fraction) , Plus -> e.sign <- Positive
         | (Integral|Fraction) , Minus -> e.sign <- Negative
         | Integral , Digit -> Buffer.add_char e.mantiss c
         | Fraction , Digit -> Buffer.add_char e.mantiss c ; e.coma <- succ e.coma
         | Exponent , (Plus|Minus|Digit-> Buffer.add_char e.exponent c
    ) r ;
  let m = Buffer.contents e.mantiss in
  begin
    match trail m with
      | None -> "0"
      | Some(a,b) ->
          let digits = String.sub m a (String.length m - a - b) in
          let exp =
            let ex = Buffer.contents e.exponent in
            if ex = "" then b - e.coma else int_of_string ex + b - e.coma
          in
          let size = 4 + String.length m + abs exp in
          let buffer = Buffer.create size in
          let parent = e.sign = Negative || exp <> 0 in
          if parent then Buffer.add_char buffer '(' ;
          if e.sign = Negative then Buffer.add_char buffer '-' ;
          Buffer.add_string buffer digits ;
          if exp > 0 then Buffer.add_string buffer (String.make exp '0') ;
          if exp < 0 then
            (Buffer.add_string buffer "/1" ;
             Buffer.add_string buffer (String.make (-exp) '0')) ;
          if parent then Buffer.add_char buffer ')' ;
          Buffer.contents buffer
  end