Пример #1
0
ssize_t
Reader::_parse ( const string& line )
{
	//PWTRACE("input line(%zu): <%s>", line.size(), line.c_str());
	if ( not m_status.empty() )
	{
		auto& top(m_status.top());
		if ( top.node.isBulkString() )
		{
			return _parseBulkString2(line);
		}
	}

	if ( line.size() < 2 ) RETURN_READER_ERROR("invalid line");

	ValueType c(static_cast<ValueType>(line[0]));
	switch(c)
	{
		case ValueType::INTEGER: return _parseInteger(line);
		case ValueType::SIMPLE_STRING: return _parseSimpleString(line);
		case ValueType::ERROR: return _parseError(line);
		case ValueType::BULK_STRING: return _parseBulkString(line);
		case ValueType::ARRAY: return _parseArray(line);
	}// switch

	RETURN_READER_ERROR("invalid identifier");
}
Пример #2
0
	int _parse(LPCWSTR jstr,int pos,int maxlen,Json* jv){
		int i = pos;
		for(;(uint)i<(uint)maxlen;i++){
			if(_isSpaceChar(jstr[i])){
				continue;
			}else if(jstr[i]=='{'){
				jv->_type = json_object;
				jv->_objectValue = new ObjectLink<Json::DICTION>;
				i = _parseObject(jstr,i+1,maxlen,jv->_objectValue);
			}else if(jstr[i]=='['){
				jv->_type = json_array;
				jv->_arrayValue = new ObjectLink<Json>;
				i = _parseArray(jstr,i+1,maxlen,jv->_arrayValue);
			}else if(jstr[i]=='\"'){
				jv->_type = json_string;
				jv->_strValue = new String;
				i = _parseString(jstr,i+1,maxlen,jv->_strValue);
			}else if(jstr[i]=='\''){
				jv->_type = json_binary;
				jv->_binaryValue = new Memory<char>;
				i = _parseBinary(jstr,i+1,maxlen,jv->_binaryValue);
			}else{
				int nextPos = _getNextWord(jstr,i,maxlen);
				if(_isTrue(jstr,i,nextPos)){
					jv->_type = json_boolean;
					jv->_boolValue = true;
				}else if(_isFalse(jstr,i,nextPos)){
					jv->_type = json_boolean;
					jv->_boolValue = false;
				}else if(_isNull(jstr,i,nextPos)){
				}else if(_isDouble(jstr,i,nextPos,jv->_doubleValue)){
					jv->_type = json_double;
				}else if(_isInteger(jstr,i,nextPos,jv->_intValue)){
					jv->_type = json_integer;
				}else
					return -1;
				i = nextPos;
			}
			break;
		}
		return i;
	}
Пример #3
0
	int _parseAll(LPCWSTR jstr,int pos,int maxlen,Json* jv){
		while(_isSpaceChar(jstr[pos])){
			pos++;
			if(pos==maxlen) return -1;
		}
		if(jstr[pos]=='\"'){
			jv->_type = json_string;
			jv->_strValue = new String;
			pos = _parseString(jstr,pos+1,maxlen,jv->_strValue);
		}else if(jstr[pos]=='\''){
			jv->_type = json_binary;
			jv->_binaryValue = new Memory<char>;
			pos = _parseBinary(jstr,pos+1,maxlen,jv->_binaryValue);
		}else if(jstr[pos]=='['){
			jv->_type = json_array;
			jv->_arrayValue = new ObjectLink<Json>;
			pos = _parseArray(jstr,pos+1,maxlen,jv->_arrayValue);
		}else if(jstr[pos]=='{'){
			jv->_type = json_object;
			jv->_objectValue = new ObjectLink<Json::DICTION>;
			pos = _parseObject(jstr,pos+1,maxlen,jv->_objectValue);
		}else{
			int nextPos = _getNextWord(jstr,pos,maxlen);
			if(_isTrue(jstr,pos,nextPos)){
				jv->_type = json_boolean;
				jv->_boolValue = true;
			}else if(_isFalse(jstr,pos,nextPos)){
				jv->_type = json_boolean;
				jv->_boolValue = false;
			}else if(_isNull(jstr,pos,nextPos)){
				//jv本来就是 null 。
			}else if(_isInteger(jstr,pos,nextPos,jv->_intValue)){
				jv->_type = json_integer;
			}else if(_isDouble(jstr,pos,nextPos,jv->_doubleValue)){
				jv->_type = json_double;
			}else return -1;
			pos = nextPos;
		}
		return pos;
	}
Пример #4
0
JValue* Parser::_parseValue() {
    switch(_cur_token.type()) {
        case TT_STRING:
            return _parseString();
        case TT_INTEGER:
            return _parseInt();
        case TT_REAL:
            return _parseReal();
        case TT_TRUE:
            return _parseTrue();
        case TT_FALSE:
            return _parseFalse();
        case TT_NULL:
            return _parseNull();
        case TT_ARRAY_OPEN_BRACE:
            return _parseArray();
        case TT_OBJECT_OPEN_BRACE:
            return _parseObject();
        default:
            _err = _instream->error();
            return NULL;
    }
}
Пример #5
0
ir::Type* TypeParser::_parseType()
{
	std::string nextToken = _lexer->peek();
	
	ir::Type* type = nullptr;
	
	if(isFunction(nextToken))
	{
		type = _parseFunction();
	}
	else if(isStructure(nextToken))
	{
		type = _parseStructure();
	}
	else if(isPrimitive(_compiler, nextToken))
	{
		type = _parsePrimitive();
		
		nextToken = _lexer->peek();
		
		if(isFunction(nextToken))
		{
			type = _parseFunction(type);
		}
	}
	else if(isArray(nextToken))
	{
		type = _parseArray();
	}
	else if(isVariadic(nextToken))
	{
		_lexer->scan("...");
		type = *_compiler->getOrInsertType(ir::VariadicType(_compiler));
	}
	else if(isTypeAlias(nextToken))
	{
		type = _parseTypeAlias();
	}
	else if(isOpaqueType(nextToken))
	{
		_lexer->scan("opaque");
		type = *_compiler->getOrInsertType(ir::OpaqueType(_compiler));
	}

	nextToken = _lexer->peek();

	while(isPointer(nextToken))
	{
		_lexer->scan("*");
		type = *_compiler->getOrInsertType(ir::PointerType(_compiler, type));
	
		nextToken = _lexer->peek();
	}
	
	if(type == nullptr)
	{
		throw std::runtime_error("Failed to parse type.");
	}
	
	hydrazine::log("TypeParser::Parser") << "Parsed type " << type->name
		<< ".\n";
	
	return type;
}