diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-01-16 00:43:18 +0100 |
---|---|---|
committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-01-16 00:43:18 +0100 |
commit | fae1b7a4eafbd9872d2447eab011bdf9aab97645 (patch) | |
tree | d064da98dff6061bdd74c2734e4f9c7f2f4f51dd /src/plugins | |
parent | dbf59a218edd684f93f9cf74cdddd6bebefe15e7 (diff) |
Working on XMLParser (still lot work in progress)
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/xml/XmlParser.cpp | 118 |
1 files changed, 87 insertions, 31 deletions
diff --git a/src/plugins/xml/XmlParser.cpp b/src/plugins/xml/XmlParser.cpp index 46c978f..87a2016 100644 --- a/src/plugins/xml/XmlParser.cpp +++ b/src/plugins/xml/XmlParser.cpp @@ -24,6 +24,7 @@ #include <core/common/CharReader.hpp> #include <core/common/Utils.hpp> #include <core/parser/ParserStack.hpp> +#include <core/model/Typesystem.hpp> #include "XmlParser.hpp" @@ -48,68 +49,123 @@ static const State STATE_CONSTANTS = 202; static const State STATE_CONSTANT = 203; static const State STATE_ENUM = 204; static const State STATE_STRUCT = 205; +static const State STATE_FIELD = 206; -class TestHandler : public Handler { +class TypesystemHandler : public Handler { public: using Handler::Handler; - void start(const Variant::mapType &args) override + void start(Variant::mapType &args) override + { + scope().push(new model::Typesystem(manager(), args["name"].asString())); + } + + void end() override { scope().pop(); } + + static Handler *create(const HandlerData &handlerData) { - std::cout << this->name << ": start (isChild: " << (this->isChild) - << ", args: " << Variant(args) << ")" << std::endl; + return new TypesystemHandler{handlerData}; + } +}; + +class StructHandler : public Handler { +public: + using Handler::Handler; + + std::string name; + std::string parent; + + NodeVector<model::Attribute> attributes; + + void start(Variant::mapType &args) override + { + this->name = args["name"].asString(); + this->parent = args["parent"].asString(); } void end() override { - // TODO + // Try to resolve the specified parent structure + Rooted<model::StructType> parentStructure; + if (!parent.empty()) { + // TODO: What about (temporarily) unresolved nodes + // Idea: Provide constructor for empty node, store unresolved nodes + // in the scope, resolve later + parentStructure = + scope() + .resolve(Utils::split(parent, '.'), + (const RttiType &)RttiTypes::StructType, logger()) + .cast<model::StructType>(); + } + + Rooted<model::Typesystem> typesystem = + scope().getLeaf().cast<model::Typesystem>(); } - void data(const std::string &data, int field) override + void child(std::shared_ptr<Handler> handler) { - std::cout << this->name << ": data \"" << data << "\"" << std::endl; +/* std::shared_ptr<StructFieldHandler> structFieldHandler = + dynamic_cast<StructFieldHandler>(handler);*/ + + // Try to resolve } - void child(std::shared_ptr<Handler> handler) override + static Handler *create(const HandlerData &handlerData) { - // TODO + return new StructHandler{handlerData}; } }; -class TypesystemHandler : public Handler { +class StructFieldHandler : public Handler { public: using Handler::Handler; -}; -static Handler *createTestHandler(const ParserContext &ctx, std::string name, - State state, State parentState, bool isChild) -{ - return new TestHandler{ctx, name, state, parentState, isChild}; -} + Rooted<model::Attribute> attribute; + + void start(Variant::mapType &args) override + { +/* this->name = args["name"].asString(); + this->type = args["parent"].asString();*/ + } + + void end() override {} +}; static const std::multimap<std::string, HandlerDescriptor> XML_HANDLERS{ - /* Documents */ - {"document", {{STATE_NONE}, createTestHandler, STATE_DOCUMENT}}, - {"head", {{STATE_DOCUMENT}, createTestHandler, STATE_HEAD}}, - {"body", {{STATE_DOCUMENT}, createTestHandler, STATE_BODY, true}}, + /* Document tags */ + {"document", {{STATE_NONE}, nullptr, STATE_DOCUMENT}}, + {"head", {{STATE_DOCUMENT}, nullptr, STATE_HEAD}}, + {"body", {{STATE_DOCUMENT}, nullptr, STATE_BODY, true}}, /* Special commands */ - {"use", {{STATE_HEAD}, createTestHandler, STATE_USE}}, - {"include", {{STATE_ALL}, createTestHandler, STATE_INCLUDE}}, - {"inline", {{STATE_ALL}, createTestHandler, STATE_INLINE}}, + {"use", {{STATE_HEAD}, nullptr, STATE_USE}}, + {"include", {{STATE_ALL}, nullptr, STATE_INCLUDE}}, + {"inline", {{STATE_ALL}, nullptr, STATE_INLINE}}, - /* Typesystem definitions */ + /* Typesystem */ {"typesystem", {{STATE_NONE, STATE_HEAD}, - createTestHandler, + TypesystemHandler::create, STATE_TYPESYSTEM, false, {Argument::String("name")}}}, - - {"types", {{STATE_TYPESYSTEM}, createTestHandler, STATE_TYPES}}, - {"constants", {{STATE_TYPESYSTEM}, createTestHandler, STATE_CONSTANTS}}, - {"enum", {{STATE_TYPES}, createTestHandler, STATE_ENUM}}, - {"struct", {{STATE_TYPES}, createTestHandler, STATE_STRUCT}}, - {"constant", {{STATE_CONSTANTS}, createTestHandler, STATE_CONSTANT}}}; + {"types", {{STATE_TYPESYSTEM}, nullptr, STATE_TYPES}}, + {"enum", {{STATE_TYPES}, nullptr, STATE_ENUM}}, + {"struct", + {{STATE_TYPES}, + StructHandler::create, + STATE_STRUCT, + false, + {Argument::String("name"), Argument::String("parent", "")}}}, + {"field", + {{{STATE_STRUCT}}, + nullptr, + STATE_FIELD, + false, + {Argument::String("name"), Argument::String("type"), + Argument::Any("default", Variant::fromObject(nullptr))}}}, + {"constants", {{STATE_TYPESYSTEM}, nullptr, STATE_CONSTANTS}}, + {"constant", {{STATE_CONSTANTS}, nullptr, STATE_CONSTANT}}}; /** * Wrapper class around the XML_Parser pointer which safely frees it whenever |