From eb6ecdcc85ece4eb84b90f3c9bb920dc1ad2b6d1 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Tue, 27 Jan 2015 16:01:53 +0100 Subject: Parsers do no longer return the node they have parsed (as this may be ill-defined -- if a parser only parses a partial document via include, there may be many to no nodes that are returned). Parsers should just use the ParserScope.push funciton. All nodes pushed onto the top-level of the ParserScope are added treated as the nodes the parser has parsed. Adapted all code and all tests accordingly. --- src/plugins/css/CSSParser.cpp | 11 +++++++++-- src/plugins/css/CSSParser.hpp | 3 ++- src/plugins/xml/XmlParser.cpp | 3 +-- src/plugins/xml/XmlParser.hpp | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/css/CSSParser.cpp b/src/plugins/css/CSSParser.cpp index 40179bf..a09a69f 100644 --- a/src/plugins/css/CSSParser.cpp +++ b/src/plugins/css/CSSParser.cpp @@ -74,15 +74,22 @@ static const std::map CSS_DESCRIPTORS = { {ESCAPE, {CodeTokenMode::ESCAPE, ESCAPE}}, {LINEBREAK, {CodeTokenMode::LINEBREAK, LINEBREAK}}}; -Rooted CSSParser::doParse(CharReader &reader, ParserContext &ctx) +void CSSParser::doParse(CharReader &reader, ParserContext &ctx) { CodeTokenizer tokenizer{reader, CSS_ROOT, CSS_DESCRIPTORS}; tokenizer.ignoreComments = true; tokenizer.ignoreLinebreaks = true; + + // Create the root node and push it onto the parser scope Rooted root = { new model::SelectorNode{ctx.getManager(), "root"}}; + ctx.getScope().push(root); + + // Parse the document into the root node parseDocument(root, tokenizer, ctx); - return root; + + // Remove the element from the parser scope + ctx.getScope().pop(); } void CSSParser::parseDocument(Rooted root, diff --git a/src/plugins/css/CSSParser.hpp b/src/plugins/css/CSSParser.hpp index 2f37e6a..b2a760f 100644 --- a/src/plugins/css/CSSParser.hpp +++ b/src/plugins/css/CSSParser.hpp @@ -35,6 +35,7 @@ #include #include #include +#include namespace ousia { @@ -158,7 +159,7 @@ protected: * @return returns the root node of the resulting SelectorTree. For more * information on the return conventions consult the Parser.hpp. */ - Rooted doParse(CharReader &reader, ParserContext &ctx) override; + void doParse(CharReader &reader, ParserContext &ctx) override; }; } diff --git a/src/plugins/xml/XmlParser.cpp b/src/plugins/xml/XmlParser.cpp index bb9d678..51c52bc 100644 --- a/src/plugins/xml/XmlParser.cpp +++ b/src/plugins/xml/XmlParser.cpp @@ -289,7 +289,7 @@ static void xmlCharacterDataHandler(void *p, const XML_Char *s, int len) /* Class XmlParser */ -Rooted XmlParser::doParse(CharReader &reader, ParserContext &ctx) +void XmlParser::doParse(CharReader &reader, ParserContext &ctx) { // Create the parser object ScopedExpatXmlParser p{"UTF-8"}; @@ -335,7 +335,6 @@ Rooted XmlParser::doParse(CharReader &reader, ParserContext &ctx) break; } } - return nullptr; } } diff --git a/src/plugins/xml/XmlParser.hpp b/src/plugins/xml/XmlParser.hpp index 3c0ffb7..c8b6302 100644 --- a/src/plugins/xml/XmlParser.hpp +++ b/src/plugins/xml/XmlParser.hpp @@ -46,7 +46,7 @@ protected: * @param ctx is a reference to the ParserContext instance that should be * used. */ - Rooted doParse(CharReader &reader, ParserContext &ctx) override; + void doParse(CharReader &reader, ParserContext &ctx) override; }; } -- cgit v1.2.3