示例#1
0
	Element* CXML::ParseBinary( std::istream& stream, Element* parent )
	{
		Element* pE = 0;
		int type = 0;
		stream.read( (char*)&type, sizeof(type) );

		switch( type )
		{
		case TYPE_ELEMENT:
			pE = new Element;
			break;
		case TYPE_CDATA_ELEMENT:
			pE = new DataElement;
			break;
		case TYPE_COMMENT:
			pE = new CommentElement;
			break;
		default:
			return 0;
		}
		pE->ParseBinary( stream );
		parent->AddSubElement( pE );

		int num = 0;
		//读子节点
		stream.read((char*)&num,sizeof(num));
		for( int i=0; i<num; i++ )
		{
			ParseBinary(stream, pE);
		}

		return pE;
	}
示例#2
0
	const Number IntegerLiteralParser::Parse()
	{
		// Assert( NotAtEnd() && InClass(CharClass::NUMBER_HEAD) )

		char c = GetChar();

		IntegerBuilder integerBuilder;

		if (c == '0')
		{
			Advance();
			if (AtEnd())
			{
				return Number::ZERO();
			}

			switch (GetChar())
			{
				case 'b' : return ParseBinary();
				case 'x' : return ParseHexadecimal();
			}

			if (NotInClass(CharClass::DECIMAL))
			{
				return Number::ZERO();
			}

			// if (config_.parse_octal)
			{
				return ParseOctal();
			}
		}
		else if (c == '-')
		{
			integerBuilder.SetNegative();
			Advance();
			if (AtEnd() || NotInClass(CharClass::DECIMAL))
			{
				ThrowError("Decimal digit expected");
			}
		}

		// Assert( NotAtEnd() && InClass(CharClass::DECIMAL) )
		do
		{
			integerBuilder.OnDecimalDigit(GetChar() - '0');

			Advance();
		}
		while (NotAtEnd() && InClass(CharClass::DECIMAL));

		return integerBuilder.Release();
	}
示例#3
0
	void CXML::ParseBinary( std::istream& stream )
	{
		this->Clear( );

		stream.seekg(0);
		std::streamsize len = 0;
		std::string value;

		stream.read((char*)&len,sizeof(std::streamsize));
		value.resize(len);
		stream.read(&value[0],len);

		m_head.attrib.push_back( Attribute("encoding",value) );

		if(stream.good())
			ParseBinary( stream, &m_root );
	}
示例#4
0
	const Number FloatLiteralParser::Parse()
	{
		// Assert( NotAtEnd() && InClass(CharClass::NUMBER_HEAD) )

		char c = GetChar();

		NumberBuilder numberBuilder;

		if (c == '0')
		{
			Advance();
			if (AtEnd())
			{
				return Number::ZERO();
			}

			switch (GetChar())
			{
				case '.' : return ParseFractional(numberBuilder);
				case 'e' :
				case 'E' : return ParseExponent(numberBuilder);
				case 'b' : return config_.parse_binary ? ParseBinary() : Number::ZERO();
				case 'x' : return config_.parse_hexadecimal ? ParseHexadecimal() : Number::ZERO();
			}

			if (NotInClass(CharClass::DECIMAL))
			{
				return Number::ZERO();
			}

			if (config_.parse_octal)
			{
				return ParseOctal();
			}
		}
		else if (c == '-')
		{
			numberBuilder.SetNegative();
			Advance();
			if (AtEnd() || NotInClass(CharClass::DECIMAL))
			{
				ThrowError("Decimal digit expected");
			}
		}

		// Assert( NotAtEnd() && InClass(CharClass::DECIMAL) )
		do
		{
			numberBuilder.OnIntegerDigit(GetChar() - '0');

			Advance();
			if (AtEnd())
			{
				return numberBuilder.Release();
			}
		}
		while (InClass(CharClass::DECIMAL));

		if (GetChar() == '.')
		{
			return ParseFractional(numberBuilder);
		}
		else if (GetChar() == 'e' || GetChar() == 'E')
		{
			return ParseExponent(numberBuilder);
		}

		return numberBuilder.Release();
	}