diff --git a/src/singledocparser.cpp b/src/singledocparser.cpp index 0431b4b..e9f3222 100644 --- a/src/singledocparser.cpp +++ b/src/singledocparser.cpp @@ -75,6 +75,12 @@ namespace YAML ParseProperties(tag, anchor); const Token& token = m_scanner.peek(); + + if(token.type == Token::PLAIN_SCALAR && token.value == "null") { + eventHandler.OnNull(mark, anchor); + m_scanner.pop(); + return; + } // add non-specific tags if(tag.empty()) @@ -256,6 +262,7 @@ namespace YAML throw ParserException(m_scanner.mark(), ErrorMsg::END_OF_MAP_FLOW); Token& token = m_scanner.peek(); + const Mark mark = token.mark; // first check for end if(token.type == Token::FLOW_MAP_END) { m_scanner.pop(); @@ -267,7 +274,7 @@ namespace YAML m_scanner.pop(); HandleNode(eventHandler); } else { - eventHandler.OnNull(token.mark, NullAnchor); + eventHandler.OnNull(mark, NullAnchor); } // now grab value (optional) @@ -275,7 +282,7 @@ namespace YAML m_scanner.pop(); HandleNode(eventHandler); } else { - eventHandler.OnNull(token.mark, NullAnchor); + eventHandler.OnNull(mark, NullAnchor); } if(m_scanner.empty()) diff --git a/test/core/parsertests.cpp b/test/core/parsertests.cpp index 2b8b5ef..5be7953 100644 --- a/test/core/parsertests.cpp +++ b/test/core/parsertests.cpp @@ -28,6 +28,18 @@ namespace Test EXPECT_DOC_END(); DONE(); } + + TEST NullStringScalar() + { + HANDLE("foo: null"); + EXPECT_DOC_START(); + EXPECT_MAP_START("?", 0); + EXPECT_SCALAR("?", 0, "foo"); + EXPECT_NULL(0); + EXPECT_MAP_END(); + EXPECT_DOC_END(); + DONE(); + } } namespace { @@ -57,6 +69,7 @@ namespace Test int total = 0; RunParserTest(&Parser::NoEndOfMapFlow, "No end of map flow", passed, total); RunParserTest(&Parser::PlainScalarStartingWithQuestionMark, "Plain scalar starting with question mark", passed, total); + RunParserTest(&Parser::NullStringScalar, "Null string scalar", passed, total); std::cout << "Parser tests: " << passed << "/" << total << " passed\n"; return passed == total;