"git@developer.sourcefind.cn:gaoqiong/composable_kernel.git" did not exist on "151b6166c956815faf656c4e6f4ae25f9ecf8d38"
Commit 3405a6fe authored by Jesse Beder's avatar Jesse Beder
Browse files

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

parent d372729b
...@@ -65,7 +65,7 @@ namespace YAML ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 { ...@@ -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;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment