mirror of
https://github.com/jbeder/yaml-cpp.git
synced 2025-09-07 12:01:16 +00:00
@@ -34,7 +34,12 @@ class EventHandler {
|
||||
virtual void OnMapStart(const Mark& mark, const std::string& tag,
|
||||
anchor_t anchor, EmitterStyle::value style) = 0;
|
||||
virtual void OnMapEnd() = 0;
|
||||
|
||||
virtual void OnAnchor(const Mark& /*mark*/,
|
||||
const std::string& /*anchor_name*/) {
|
||||
// empty default implementation for compatibility
|
||||
}
|
||||
};
|
||||
}
|
||||
} // namespace YAML
|
||||
|
||||
#endif // EVENTHANDLER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
|
||||
|
@@ -71,8 +71,12 @@ void SingleDocParser::HandleNode(EventHandler& eventHandler) {
|
||||
}
|
||||
|
||||
std::string tag;
|
||||
std::string anchor_name;
|
||||
anchor_t anchor;
|
||||
ParseProperties(tag, anchor);
|
||||
ParseProperties(tag, anchor, anchor_name);
|
||||
|
||||
if (!anchor_name.empty())
|
||||
eventHandler.OnAnchor(mark, anchor_name);
|
||||
|
||||
const Token& token = m_scanner.peek();
|
||||
|
||||
@@ -356,8 +360,10 @@ void SingleDocParser::HandleCompactMapWithNoKey(EventHandler& eventHandler) {
|
||||
|
||||
// ParseProperties
|
||||
// . Grabs any tag or anchor tokens and deals with them.
|
||||
void SingleDocParser::ParseProperties(std::string& tag, anchor_t& anchor) {
|
||||
void SingleDocParser::ParseProperties(std::string& tag, anchor_t& anchor,
|
||||
std::string& anchor_name) {
|
||||
tag.clear();
|
||||
anchor_name.clear();
|
||||
anchor = NullAnchor;
|
||||
|
||||
while (1) {
|
||||
@@ -369,7 +375,7 @@ void SingleDocParser::ParseProperties(std::string& tag, anchor_t& anchor) {
|
||||
ParseTag(tag);
|
||||
break;
|
||||
case Token::ANCHOR:
|
||||
ParseAnchor(anchor);
|
||||
ParseAnchor(anchor, anchor_name);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
@@ -387,11 +393,12 @@ void SingleDocParser::ParseTag(std::string& tag) {
|
||||
m_scanner.pop();
|
||||
}
|
||||
|
||||
void SingleDocParser::ParseAnchor(anchor_t& anchor) {
|
||||
void SingleDocParser::ParseAnchor(anchor_t& anchor, std::string& anchor_name) {
|
||||
Token& token = m_scanner.peek();
|
||||
if (anchor)
|
||||
throw ParserException(token.mark, ErrorMsg::MULTIPLE_ANCHORS);
|
||||
|
||||
anchor_name = token.value;
|
||||
anchor = RegisterAnchor(token.value);
|
||||
m_scanner.pop();
|
||||
}
|
||||
@@ -411,4 +418,4 @@ anchor_t SingleDocParser::LookupAnchor(const Mark& mark,
|
||||
|
||||
return it->second;
|
||||
}
|
||||
}
|
||||
} // namespace YAML
|
||||
|
@@ -43,9 +43,10 @@ class SingleDocParser : private noncopyable {
|
||||
void HandleCompactMap(EventHandler& eventHandler);
|
||||
void HandleCompactMapWithNoKey(EventHandler& eventHandler);
|
||||
|
||||
void ParseProperties(std::string& tag, anchor_t& anchor);
|
||||
void ParseProperties(std::string& tag, anchor_t& anchor,
|
||||
std::string& anchor_name);
|
||||
void ParseTag(std::string& tag);
|
||||
void ParseAnchor(anchor_t& anchor);
|
||||
void ParseAnchor(anchor_t& anchor, std::string& anchor_name);
|
||||
|
||||
anchor_t RegisterAnchor(const std::string& name);
|
||||
anchor_t LookupAnchor(const Mark& mark, const std::string& name) const;
|
||||
@@ -60,6 +61,6 @@ class SingleDocParser : private noncopyable {
|
||||
|
||||
anchor_t m_curAnchor;
|
||||
};
|
||||
}
|
||||
} // namespace YAML
|
||||
|
||||
#endif // SINGLEDOCPARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
|
||||
|
@@ -35,10 +35,12 @@ def doc_end(implicit=False):
|
||||
|
||||
def scalar(value, tag='', anchor='', anchor_id=0):
|
||||
emit = []
|
||||
handle = []
|
||||
if tag:
|
||||
emit += ['VerbatimTag("%s")' % encode(tag)]
|
||||
if anchor:
|
||||
emit += ['Anchor("%s")' % encode(anchor)]
|
||||
handle += ['OnAnchor(_, "%s")' % encode(anchor)]
|
||||
if tag:
|
||||
out_tag = encode(tag)
|
||||
else:
|
||||
@@ -47,39 +49,46 @@ def scalar(value, tag='', anchor='', anchor_id=0):
|
||||
else:
|
||||
out_tag = '!'
|
||||
emit += ['"%s"' % encode(value)]
|
||||
return {'emit': emit, 'handle': 'OnScalar(_, "%s", %s, "%s")' % (out_tag, anchor_id, encode(value))}
|
||||
handle += ['OnScalar(_, "%s", %s, "%s")' % (out_tag, anchor_id, encode(value))]
|
||||
return {'emit': emit, 'handle': handle}
|
||||
|
||||
def comment(value):
|
||||
return {'emit': 'Comment("%s")' % value, 'handle': ''}
|
||||
|
||||
def seq_start(tag='', anchor='', anchor_id=0, style='_'):
|
||||
emit = []
|
||||
handle = []
|
||||
if tag:
|
||||
emit += ['VerbatimTag("%s")' % encode(tag)]
|
||||
if anchor:
|
||||
emit += ['Anchor("%s")' % encode(anchor)]
|
||||
handle += ['OnAnchor(_, "%s")' % encode(anchor)]
|
||||
if tag:
|
||||
out_tag = encode(tag)
|
||||
else:
|
||||
out_tag = '?'
|
||||
emit += ['BeginSeq']
|
||||
return {'emit': emit, 'handle': 'OnSequenceStart(_, "%s", %s, %s)' % (out_tag, anchor_id, style)}
|
||||
handle += ['OnSequenceStart(_, "%s", %s, %s)' % (out_tag, anchor_id, style)]
|
||||
return {'emit': emit, 'handle': handle}
|
||||
|
||||
def seq_end():
|
||||
return {'emit': 'EndSeq', 'handle': 'OnSequenceEnd()'}
|
||||
|
||||
def map_start(tag='', anchor='', anchor_id=0, style='_'):
|
||||
emit = []
|
||||
handle = []
|
||||
if tag:
|
||||
emit += ['VerbatimTag("%s")' % encode(tag)]
|
||||
if anchor:
|
||||
emit += ['Anchor("%s")' % encode(anchor)]
|
||||
handle += ['OnAnchor(_, "%s")' % encode(anchor)]
|
||||
if tag:
|
||||
out_tag = encode(tag)
|
||||
else:
|
||||
out_tag = '?'
|
||||
emit += ['BeginMap']
|
||||
return {'emit': emit, 'handle': 'OnMapStart(_, "%s", %s, %s)' % (out_tag, anchor_id, style)}
|
||||
handle += ['OnMapStart(_, "%s", %s, %s)' % (out_tag, anchor_id, style)]
|
||||
return {'emit': emit, 'handle': handle}
|
||||
|
||||
def map_end():
|
||||
return {'emit': 'EndMap', 'handle': 'OnMapEnd()'}
|
||||
@@ -202,7 +211,10 @@ def create_emitter_tests(out):
|
||||
out.writeln('')
|
||||
for event in test['events']:
|
||||
handle = event['handle']
|
||||
if handle:
|
||||
if isinstance(handle, list):
|
||||
for e in handle:
|
||||
out.writeln('EXPECT_CALL(handler, %s);' % e)
|
||||
elif handle:
|
||||
out.writeln('EXPECT_CALL(handler, %s);' % handle)
|
||||
out.writeln('Parse(out.c_str());')
|
||||
out.writeln('')
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -199,6 +199,7 @@ TEST_F(HandlerSpecTest, Ex2_10_SimpleAnchor) {
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "hr"));
|
||||
EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "Mark McGwire"));
|
||||
EXPECT_CALL(handler, OnAnchor(_, "SS"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 1, "Sammy Sosa"));
|
||||
EXPECT_CALL(handler, OnSequenceEnd());
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "rbi"));
|
||||
@@ -376,6 +377,7 @@ TEST_F(HandlerSpecTest, Ex2_24_GlobalTags) {
|
||||
EXPECT_CALL(handler, OnMapStart(_, "tag:clarkevans.com,2002:circle", 0,
|
||||
EmitterStyle::Block));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "center"));
|
||||
EXPECT_CALL(handler, OnAnchor(_, "ORIGIN"));
|
||||
EXPECT_CALL(handler, OnMapStart(_, "?", 1, EmitterStyle::Flow));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "x"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "73"));
|
||||
@@ -456,6 +458,7 @@ TEST_F(HandlerSpecTest, Ex2_27_Invoice) {
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "date"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "2001-01-23"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "bill-to"));
|
||||
EXPECT_CALL(handler, OnAnchor(_, "id001"));
|
||||
EXPECT_CALL(handler, OnMapStart(_, "?", 1, EmitterStyle::Block));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "given"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "Chris"));
|
||||
@@ -616,6 +619,7 @@ TEST_F(HandlerSpecTest, Ex5_6_NodePropertyIndicators) {
|
||||
EXPECT_CALL(handler, OnDocumentStart(_));
|
||||
EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "anchored"));
|
||||
EXPECT_CALL(handler, OnAnchor(_, "anchor"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "!local", 1, "value"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "alias"));
|
||||
EXPECT_CALL(handler, OnAlias(_, 1));
|
||||
@@ -909,8 +913,10 @@ TEST_F(HandlerSpecTest, Ex6_22_GlobalTagPrefix) {
|
||||
TEST_F(HandlerSpecTest, Ex6_23_NodeProperties) {
|
||||
EXPECT_CALL(handler, OnDocumentStart(_));
|
||||
EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
|
||||
EXPECT_CALL(handler, OnAnchor(_, "a1"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 1, "foo"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, "bar"));
|
||||
EXPECT_CALL(handler, OnAnchor(_, "a2"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 2, "baz"));
|
||||
EXPECT_CALL(handler, OnAlias(_, 1));
|
||||
EXPECT_CALL(handler, OnMapEnd());
|
||||
@@ -972,6 +978,7 @@ TEST_F(HandlerSpecTest, Ex6_29_NodeAnchors) {
|
||||
EXPECT_CALL(handler, OnDocumentStart(_));
|
||||
EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "First occurrence"));
|
||||
EXPECT_CALL(handler, OnAnchor(_, "anchor"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 1, "Value"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "Second occurrence"));
|
||||
EXPECT_CALL(handler, OnAlias(_, 1));
|
||||
@@ -984,10 +991,12 @@ TEST_F(HandlerSpecTest, Ex7_1_AliasNodes) {
|
||||
EXPECT_CALL(handler, OnDocumentStart(_));
|
||||
EXPECT_CALL(handler, OnMapStart(_, "?", 0, EmitterStyle::Block));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "First occurrence"));
|
||||
EXPECT_CALL(handler, OnAnchor(_, "anchor"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 1, "Foo"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "Second occurrence"));
|
||||
EXPECT_CALL(handler, OnAlias(_, 1));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "Override anchor"));
|
||||
EXPECT_CALL(handler, OnAnchor(_, "anchor"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 2, "Bar"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "?", 0, "Reuse anchor"));
|
||||
EXPECT_CALL(handler, OnAlias(_, 2));
|
||||
@@ -1307,6 +1316,7 @@ TEST_F(HandlerSpecTest, Ex7_24_FlowNodes) {
|
||||
EXPECT_CALL(handler, OnSequenceStart(_, "?", 0, EmitterStyle::Block));
|
||||
EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, "a"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "!", 0, "b"));
|
||||
EXPECT_CALL(handler, OnAnchor(_, "anchor"));
|
||||
EXPECT_CALL(handler, OnScalar(_, "!", 1, "c"));
|
||||
EXPECT_CALL(handler, OnAlias(_, 1));
|
||||
EXPECT_CALL(handler, OnScalar(_, "tag:yaml.org,2002:str", 0, ""));
|
||||
@@ -1607,5 +1617,5 @@ TEST_F(HandlerSpecTest, Ex8_22_BlockCollectionNodes) {
|
||||
EXPECT_CALL(handler, OnDocumentEnd());
|
||||
Parse(ex8_22);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
} // namespace YAML
|
||||
|
@@ -22,5 +22,6 @@ class MockEventHandler : public EventHandler {
|
||||
MOCK_METHOD4(OnMapStart, void(const Mark&, const std::string&, anchor_t,
|
||||
EmitterStyle::value));
|
||||
MOCK_METHOD0(OnMapEnd, void());
|
||||
MOCK_METHOD2(OnAnchor, void(const Mark&, const std::string&));
|
||||
};
|
||||
}
|
||||
} // namespace YAML
|
||||
|
Reference in New Issue
Block a user