예제 #1
0
NumberPtr Number::Read(Input &input)
{
	Integer ten(10);
	auto_ptr<Integer> intValue(new Integer);
	while(input.Current() >= '0' && input.Current() <= '9')
	{
		Integer digit(input.Current() - '0');
		intValue = intValue->Times(&ten)->Plus(&digit);
		input.Next();
	}

	// Process part after decimal separator
	if(input.Current() == '.')
	{
		// Cast the current value to float (just to prevent compiler warning)
		auto_ptr<MachineReal> realValue(new MachineReal(intValue));
		input.Next();
		auto_ptr<MachineReal> factor(new MachineReal(1.0));
		MachineReal tenth(0.1);
		while(input.Current() >= '0' && input.Current() <= '9')
		{
			MachineReal digit(input.Current() - '0');
			factor = factor->Times(&tenth);
			realValue = realValue->Plus(factor->Times(&digit).get());
			input.Next();
		}
		return NumberPtr(realValue);
	}
	else
		return NumberPtr(intValue);
}
예제 #2
0
NumberPtr Parser::parseNumber()
{
    Token numberValue = m_curToken;
    if (!match(TokenType::Number)) {
        reportError(ErrorCodes::ExpectedNumber);
        return NumberPtr();
    }

    NumberPtr number(new Number);
    number->value = numberValue;

    return number;
}
예제 #3
0
파일: parser.cpp 프로젝트: ghalib/scheme
NumberPtr make_number(double value)
{
  return NumberPtr(new Number(value));
}
예제 #4
0
NumberPtr NullFactory::createNumber() const {
    return NumberPtr(new Number(0));
}