mirror of
https://github.com/jbeder/yaml-cpp.git
synced 2025-09-09 20:51:16 +00:00
Refactored the compact map notation, which made it easy to implement explicit keys for compact maps
This commit is contained in:
21
src/map.cpp
21
src/map.cpp
@@ -65,7 +65,7 @@ namespace YAML
|
|||||||
switch(pScanner->peek().type) {
|
switch(pScanner->peek().type) {
|
||||||
case Token::BLOCK_MAP_START: ParseBlock(pScanner, state); break;
|
case Token::BLOCK_MAP_START: ParseBlock(pScanner, state); break;
|
||||||
case Token::FLOW_MAP_START: ParseFlow(pScanner, state); break;
|
case Token::FLOW_MAP_START: ParseFlow(pScanner, state); break;
|
||||||
case Token::FLOW_MAP_COMPACT: ParseCompact(pScanner, state); break;
|
case Token::KEY: ParseCompact(pScanner, state); break;
|
||||||
case Token::VALUE: ParseCompactWithNoKey(pScanner, state); break;
|
case Token::VALUE: ParseCompactWithNoKey(pScanner, state); break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
@@ -151,23 +151,14 @@ namespace YAML
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ParseCompact
|
// ParseCompact
|
||||||
// . Single key: value pair in a flow sequence
|
// . Single "key: value" pair in a flow sequence
|
||||||
void Map::ParseCompact(Scanner *pScanner, const ParserState& state)
|
void Map::ParseCompact(Scanner *pScanner, const ParserState& state)
|
||||||
{
|
{
|
||||||
// eat start token
|
|
||||||
pScanner->pop();
|
|
||||||
|
|
||||||
if(pScanner->empty())
|
|
||||||
throw ParserException(Mark::null(), ErrorMsg::END_OF_MAP_FLOW);
|
|
||||||
|
|
||||||
Token& token = pScanner->peek();
|
|
||||||
std::auto_ptr <Node> pKey(new Node), pValue(new Node);
|
std::auto_ptr <Node> pKey(new Node), pValue(new Node);
|
||||||
|
|
||||||
// grab key (if non-null)
|
// grab key
|
||||||
if(token.type == Token::KEY) {
|
pScanner->pop();
|
||||||
pScanner->pop();
|
pKey->Parse(pScanner, state);
|
||||||
pKey->Parse(pScanner, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
// now grab value (optional)
|
// now grab value (optional)
|
||||||
if(!pScanner->empty() && pScanner->peek().type == Token::VALUE) {
|
if(!pScanner->empty() && pScanner->peek().type == Token::VALUE) {
|
||||||
@@ -180,7 +171,7 @@ namespace YAML
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ParseCompactWithNoKey
|
// ParseCompactWithNoKey
|
||||||
// . Single key: value pair in a flow sequence
|
// . Single ": value" pair in a flow sequence
|
||||||
void Map::ParseCompactWithNoKey(Scanner *pScanner, const ParserState& state)
|
void Map::ParseCompactWithNoKey(Scanner *pScanner, const ParserState& state)
|
||||||
{
|
{
|
||||||
std::auto_ptr <Node> pKey(new Node), pValue(new Node);
|
std::auto_ptr <Node> pKey(new Node), pValue(new Node);
|
||||||
|
@@ -104,7 +104,7 @@ namespace YAML
|
|||||||
break;
|
break;
|
||||||
case Token::FLOW_MAP_START:
|
case Token::FLOW_MAP_START:
|
||||||
case Token::BLOCK_MAP_START:
|
case Token::BLOCK_MAP_START:
|
||||||
case Token::FLOW_MAP_COMPACT:
|
case Token::KEY:
|
||||||
m_pContent = new Map;
|
m_pContent = new Map;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@@ -72,9 +72,6 @@ namespace YAML
|
|||||||
key.pMapStart = key.pIndent->pStartToken;
|
key.pMapStart = key.pIndent->pStartToken;
|
||||||
key.pMapStart->status = Token::UNVERIFIED;
|
key.pMapStart->status = Token::UNVERIFIED;
|
||||||
}
|
}
|
||||||
} else if(m_flows.top() == FLOW_SEQ) {
|
|
||||||
key.pMapStart = PushToken(Token::FLOW_MAP_COMPACT);
|
|
||||||
key.pMapStart->status = Token::UNVERIFIED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// then add the (now unverified) key
|
// then add the (now unverified) key
|
||||||
|
@@ -1781,7 +1781,7 @@ namespace Test {
|
|||||||
PARSE(doc, input);
|
PARSE(doc, input);
|
||||||
YAML_ASSERT(doc.size() == 1);
|
YAML_ASSERT(doc.size() == 1);
|
||||||
YAML_ASSERT(doc[0].size() == 1);
|
YAML_ASSERT(doc[0].size() == 1);
|
||||||
YAML_ASSERT(doc[0]["foo"] == "bar");
|
YAML_ASSERT(doc[0]["foo bar"] == "baz");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user