mirror of
https://github.com/jbeder/yaml-cpp.git
synced 2025-09-09 20:51:16 +00:00
Fixed bug with omitted keys/values in a flow map
This commit is contained in:
@@ -37,7 +37,7 @@ namespace YAML
|
|||||||
const RegEx Key = RegEx('?'),
|
const RegEx Key = RegEx('?'),
|
||||||
KeyInFlow = RegEx('?') + BlankOrBreak;
|
KeyInFlow = RegEx('?') + BlankOrBreak;
|
||||||
const RegEx Value = RegEx(':') + (BlankOrBreak || RegEx()),
|
const RegEx Value = RegEx(':') + (BlankOrBreak || RegEx()),
|
||||||
ValueInFlow = RegEx(':') + BlankOrBreak;
|
ValueInFlow = RegEx(':') + (BlankOrBreak || RegEx(",}", REGEX_OR));
|
||||||
const RegEx Comment = RegEx('#');
|
const RegEx Comment = RegEx('#');
|
||||||
const RegEx AnchorEnd = RegEx("?:,]}%@`", REGEX_OR) || BlankOrBreak;
|
const RegEx AnchorEnd = RegEx("?:,]}%@`", REGEX_OR) || BlankOrBreak;
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ namespace YAML
|
|||||||
const RegEx PlainScalar = !(BlankOrBreak || RegEx(",[]{}#&*!|>\'\"%@`", REGEX_OR) || (RegEx("-?:", REGEX_OR) + Blank)),
|
const RegEx PlainScalar = !(BlankOrBreak || RegEx(",[]{}#&*!|>\'\"%@`", REGEX_OR) || (RegEx("-?:", REGEX_OR) + Blank)),
|
||||||
PlainScalarInFlow = !(BlankOrBreak || RegEx("?,[]{}#&*!|>\'\"%@`", REGEX_OR) || (RegEx("-:", REGEX_OR) + Blank));
|
PlainScalarInFlow = !(BlankOrBreak || RegEx("?,[]{}#&*!|>\'\"%@`", REGEX_OR) || (RegEx("-:", REGEX_OR) + Blank));
|
||||||
const RegEx EndScalar = RegEx(':') + (BlankOrBreak || RegEx()),
|
const RegEx EndScalar = RegEx(':') + (BlankOrBreak || RegEx()),
|
||||||
EndScalarInFlow = (RegEx(':') + BlankOrBreak) || RegEx(",?[]{}", REGEX_OR);
|
EndScalarInFlow = (RegEx(':') + (BlankOrBreak || RegEx(",]}", REGEX_OR))) || RegEx(",?[]{}", REGEX_OR);
|
||||||
|
|
||||||
const RegEx EscSingleQuote = RegEx("\'\'");
|
const RegEx EscSingleQuote = RegEx("\'\'");
|
||||||
const RegEx EscBreak = RegEx('\\') + Break;
|
const RegEx EscBreak = RegEx('\\') + Break;
|
||||||
|
@@ -104,7 +104,7 @@ namespace YAML
|
|||||||
// *****
|
// *****
|
||||||
// And now branch based on the next few characters!
|
// And now branch based on the next few characters!
|
||||||
// *****
|
// *****
|
||||||
|
|
||||||
// end of stream
|
// end of stream
|
||||||
if(!INPUT)
|
if(!INPUT)
|
||||||
return EndStream();
|
return EndStream();
|
||||||
|
@@ -181,6 +181,12 @@ namespace YAML
|
|||||||
throw ParserException(INPUT.mark(), ErrorMsg::MAP_VALUE);
|
throw ParserException(INPUT.mark(), ErrorMsg::MAP_VALUE);
|
||||||
|
|
||||||
PushIndentTo(INPUT.column(), IndentMarker::MAP);
|
PushIndentTo(INPUT.column(), IndentMarker::MAP);
|
||||||
|
} else {
|
||||||
|
// we might have an empty key, so we should add it (as a simple key)
|
||||||
|
if(m_simpleKeyAllowed) {
|
||||||
|
InsertSimpleKey();
|
||||||
|
VerifySimpleKey();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// can only put a simple key here if we're in block context
|
// can only put a simple key here if we're in block context
|
||||||
|
@@ -220,6 +220,42 @@ namespace Test
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FlowMapWithOmittedKey()
|
||||||
|
{
|
||||||
|
std::string input = "{: omitted key}";
|
||||||
|
std::stringstream stream(input);
|
||||||
|
YAML::Parser parser(stream);
|
||||||
|
YAML::Node doc;
|
||||||
|
parser.GetNextDocument(doc);
|
||||||
|
|
||||||
|
std::string output;
|
||||||
|
doc[YAML::Null] >> output;
|
||||||
|
if(output != "omitted key")
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FlowMapWithOmittedValue()
|
||||||
|
{
|
||||||
|
std::string input = "{a: b, c:, d:}";
|
||||||
|
std::stringstream stream(input);
|
||||||
|
YAML::Parser parser(stream);
|
||||||
|
YAML::Node doc;
|
||||||
|
parser.GetNextDocument(doc);
|
||||||
|
|
||||||
|
std::string output;
|
||||||
|
doc["a"] >> output;
|
||||||
|
if(output != "b")
|
||||||
|
return false;
|
||||||
|
if(!IsNull(doc["c"]))
|
||||||
|
return false;
|
||||||
|
if(!IsNull(doc["d"]))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool QuotedSimpleKeys()
|
bool QuotedSimpleKeys()
|
||||||
{
|
{
|
||||||
std::string KeyValue[3] = { "\"double\": double\n", "'single': single\n", "plain: plain\n" };
|
std::string KeyValue[3] = { "\"double\": double\n", "'single': single\n", "plain: plain\n" };
|
||||||
|
@@ -262,6 +262,8 @@ namespace Test
|
|||||||
RunParserTest(&Parser::SimpleMap, "simple map", passed);
|
RunParserTest(&Parser::SimpleMap, "simple map", passed);
|
||||||
RunParserTest(&Parser::FlowSeq, "flow seq", passed);
|
RunParserTest(&Parser::FlowSeq, "flow seq", passed);
|
||||||
RunParserTest(&Parser::FlowMap, "flow map", passed);
|
RunParserTest(&Parser::FlowMap, "flow map", passed);
|
||||||
|
RunParserTest(&Parser::FlowMapWithOmittedKey, "flow map with omitted key", passed);
|
||||||
|
RunParserTest(&Parser::FlowMapWithOmittedValue, "flow map with omitted value", passed);
|
||||||
RunParserTest(&Parser::QuotedSimpleKeys, "quoted simple keys", passed);
|
RunParserTest(&Parser::QuotedSimpleKeys, "quoted simple keys", passed);
|
||||||
RunParserTest(&Parser::CompressedMapAndSeq, "compressed map and seq", passed);
|
RunParserTest(&Parser::CompressedMapAndSeq, "compressed map and seq", passed);
|
||||||
RunParserTest(&Parser::NullBlockSeqEntry, "null block seq entry", passed);
|
RunParserTest(&Parser::NullBlockSeqEntry, "null block seq entry", passed);
|
||||||
|
@@ -33,6 +33,8 @@ namespace Test {
|
|||||||
bool SimpleMap();
|
bool SimpleMap();
|
||||||
bool FlowSeq();
|
bool FlowSeq();
|
||||||
bool FlowMap();
|
bool FlowMap();
|
||||||
|
bool FlowMapWithOmittedKey();
|
||||||
|
bool FlowMapWithOmittedValue();
|
||||||
bool QuotedSimpleKeys();
|
bool QuotedSimpleKeys();
|
||||||
bool CompressedMapAndSeq();
|
bool CompressedMapAndSeq();
|
||||||
bool NullBlockSeqEntry();
|
bool NullBlockSeqEntry();
|
||||||
|
Reference in New Issue
Block a user