From 08ac48518fc3f67365755880de9acf9d483eafb0 Mon Sep 17 00:00:00 2001 From: jbeder Date: Thu, 29 Oct 2009 22:09:50 +0000 Subject: [PATCH] Refactored the compact map notation, which made it easy to implement explicit keys for compact maps --- src/map.cpp | 21 ++++++--------------- src/node.cpp | 2 +- src/simplekey.cpp | 3 --- test/spectests.cpp | 2 +- 4 files changed, 8 insertions(+), 20 deletions(-) diff --git a/src/map.cpp b/src/map.cpp index b30d3f7..5d33385 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -65,7 +65,7 @@ namespace YAML switch(pScanner->peek().type) { case Token::BLOCK_MAP_START: ParseBlock(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; default: break; } @@ -151,23 +151,14 @@ namespace YAML } // 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) { - // eat start token - pScanner->pop(); - - if(pScanner->empty()) - throw ParserException(Mark::null(), ErrorMsg::END_OF_MAP_FLOW); - - Token& token = pScanner->peek(); std::auto_ptr pKey(new Node), pValue(new Node); - // grab key (if non-null) - if(token.type == Token::KEY) { - pScanner->pop(); - pKey->Parse(pScanner, state); - } + // grab key + pScanner->pop(); + pKey->Parse(pScanner, state); // now grab value (optional) if(!pScanner->empty() && pScanner->peek().type == Token::VALUE) { @@ -180,7 +171,7 @@ namespace YAML } // ParseCompactWithNoKey - // . Single key: value pair in a flow sequence + // . Single ": value" pair in a flow sequence void Map::ParseCompactWithNoKey(Scanner *pScanner, const ParserState& state) { std::auto_ptr pKey(new Node), pValue(new Node); diff --git a/src/node.cpp b/src/node.cpp index 0b547a3..8f66f3b 100644 --- a/src/node.cpp +++ b/src/node.cpp @@ -104,7 +104,7 @@ namespace YAML break; case Token::FLOW_MAP_START: case Token::BLOCK_MAP_START: - case Token::FLOW_MAP_COMPACT: + case Token::KEY: m_pContent = new Map; break; default: diff --git a/src/simplekey.cpp b/src/simplekey.cpp index fe308ed..d8d1932 100644 --- a/src/simplekey.cpp +++ b/src/simplekey.cpp @@ -72,9 +72,6 @@ namespace YAML key.pMapStart = key.pIndent->pStartToken; 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 diff --git a/test/spectests.cpp b/test/spectests.cpp index d2a8e64..4bd0e89 100644 --- a/test/spectests.cpp +++ b/test/spectests.cpp @@ -1781,7 +1781,7 @@ namespace Test { PARSE(doc, input); YAML_ASSERT(doc.size() == 1); YAML_ASSERT(doc[0].size() == 1); - YAML_ASSERT(doc[0]["foo"] == "bar"); + YAML_ASSERT(doc[0]["foo bar"] == "baz"); return true; }