Refactored the compact map notation, which made it easy to implement explicit keys for compact maps

This commit is contained in:
Jesse Beder
2009-10-29 22:09:50 +00:00
parent d372729b92
commit 3405a6fe01
4 changed files with 8 additions and 20 deletions

View File

@@ -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);

View File

@@ -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:

View File

@@ -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

View File

@@ -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;
} }