def parseFloat(self, words):
        def pointFloat(words):
            m = re.search(r'(.*) point (.*)', words)
            if m:
                whole = m.group(1)
                frac = m.group(2)
                total = 0.0
                coeff = 0.10
                for digit in frac.split(' '):
                    total += coeff * self.parse(digit)
                    coeff /= 10.0
                return self.parseInt(whole) + total
            return None
        def fractionFloat(words):
            m = re.search(r'(.*) and (.*)', words)
            if m:
                whole = self.parseInt(m.group(1))
                frac = m.group(2)
                frac = re.sub(r'(\w+)s(\b)', '\g<1>\g<2>', frac)
                frac = re.sub(r'(\b)a(\b)', '\g<1>one\g<2>', frac)
                split = frac.split(' ')
                num = split[:1]
                denom = split[1:]
                while denom:
                    try:
                        num_value = self.parse(' '.join(num))
                        denom_value = self.parse(' '.join(denom))
                        return whole + float(num_value) / denom_value
                    except:
                        num += denom[:1]
                        denom = denom[1:]
            return None
        result = pointFloat(words)
        if result:
            return result
        result = fractionFloat(words)
        if result:
            return result
        return self.parseInt(words)