X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FParsedSource.h;h=28aca131d0d4afccd4e9ad282e592f36e7a3f316;hb=092a2dd175a4001a495c84ee85211734fb928c83;hp=f78a49e7b66d402b11b46924ed2595d2c12ee366;hpb=4b3deb01b66307f5025938538d27e6ad86cfea13;p=l2e.git diff --git a/src/loader/ParsedSource.h b/src/loader/ParsedSource.h index f78a49e..28aca13 100644 --- a/src/loader/ParsedSource.h +++ b/src/loader/ParsedSource.h @@ -1,13 +1,12 @@ -/* - * ParsedSource.h - * - * Created on: Aug 26, 2012 - * Author: holy - */ - #ifndef LOADER_PARSEDSOURCE_H_ #define LOADER_PARSEDSOURCE_H_ +namespace loader { + class Literal; + class PropertyList; + class Value; +} + #include #include #include @@ -16,36 +15,115 @@ namespace loader { -class PropertyList; -class Value; +class ScriptToken { + +public: + enum Type { + COMMAND, + REGISTER, + IDENTIFIER, + LITERAL, + LABEL, + }; + + ScriptToken(const std::string &, Type); + explicit ScriptToken(Literal *); + ~ScriptToken(); +private: + ScriptToken(const ScriptToken &); + ScriptToken &operator =(const ScriptToken &); + +public: + Type GetType() const { return type; } + const std::string &RegisterName() const; + const std::string &CommandName() const; + const std::string &Identifier() const; + const std::string &Label() const; + const Literal *GetLiteral() const; + +private: + Literal *literal; + std::string str; + Type type; + +}; + class Literal { +public: enum Type { ARRAY_VALUES, ARRAY_PROPS, + ARRAY_IDENTS, BOOLEAN, COLOR, NUMBER, + PATH, STRING, VECTOR, - OBJECT + OBJECT, + SCRIPT, }; public: + /// array of values explicit Literal(const std::vector &); - explicit Literal(const std::vector &); + /// array of objects + Literal(const std::string &, const std::vector &); + /// array of identifiers + Literal(const std::string &, const std::vector &); + /// boolean explicit Literal(bool); + /// color Literal(int r, int g, int b, int a = 255); + /// number + explicit Literal(int number); + /// path string + Literal(const std::string &dir, const std::string &path); + /// string Literal(const std::string &); + /// vector Literal(int x, int y); + /// object Literal(const std::string &typeName, PropertyList *properties); + /// script + explicit Literal(const std::vector &); + ~Literal(); +private: + Literal(const Literal &); + Literal &operator =(const Literal &); + +public: + Type GetType() const { return type; } + bool IsArray() const { return GetType() == ARRAY_VALUES || GetType() == ARRAY_PROPS || GetType() == ARRAY_IDENTS; } + bool IsObject() const { return GetType() == OBJECT; } + int ArraySize() const { return GetType() == ARRAY_VALUES ? GetValues().size() + : (GetType() == ARRAY_PROPS ? GetPropertyLists().size() : GetIdentifiers().size()); } + + const std::vector &GetValues() const; + const std::vector &GetPropertyLists() const; + const std::vector &GetIdentifiers() const; + bool GetBoolean() const; + int GetRed() const; + int GetGreen() const; + int GetBlue() const; + int GetAlpha() const; + int GetNumber() const; + const std::string &GetString() const; + int GetX() const; + int GetY() const; + const std::string &GetTypeName() const; + const PropertyList *GetProperties() const; + const std::vector &GetScript() const; private: PropertyList *props; - std::string str; + std::string typeName, str; std::vector values; std::vector propertyLists; + std::vector identifiers; + std::vector script; int i1, i2, i3, i4; bool b; Type type; @@ -59,7 +137,16 @@ public: explicit Value(const std::string &identifier) : literal(0), identifier(identifier), isLiteral(false) { } explicit Value(Literal *literal) - : literal(literal), isLiteral(false) { } + : literal(literal), isLiteral(true) { } + ~Value(); +private: + Value(const Value &); + Value &operator =(const Value &); + +public: + bool IsLiteral() const { return isLiteral; } + const Literal &GetLiteral() const; + const std::string &GetIdentifier() const; private: Literal *literal; @@ -72,13 +159,24 @@ private: class PropertyList { public: + PropertyList() { } ~PropertyList(); +private: + PropertyList(const PropertyList &); + PropertyList &operator =(const PropertyList &); public: void SetProperty(const std::string &name, Value *value) { props[name] = value; } + typedef std::map::iterator Iterator; + typedef std::map::const_iterator ConstIterator; + Iterator Begin() { return props.begin(); } + ConstIterator Begin() const { return props.begin(); } + Iterator End() { return props.end(); } + ConstIterator End() const { return props.end(); } + private: std::map props; @@ -91,6 +189,9 @@ public: Declaration(const std::string &typeName, const std::string &identifier) : typeName(typeName), identifier(identifier) { } virtual ~Declaration() { } +private: + Declaration(const Declaration &); + Declaration &operator =(const Declaration &); public: const std::string &TypeName() const { return typeName; } @@ -109,6 +210,10 @@ class Definition public: Definition(const std::string &typeName, const std::string &identifier) : Declaration(typeName, identifier), value(0), isLiteral(false) { } + virtual ~Definition(); +private: + Definition(const Definition &); + Definition &operator =(const Definition &); public: void SetValue(Literal *); @@ -132,18 +237,34 @@ class ParsedSource { public: ParsedSource() { } - ~ParsedSource() { } + ~ParsedSource(); +private: + ParsedSource(const ParsedSource &); + ParsedSource &operator =(const ParsedSource &); public: void AddDeclaration(Declaration *); + void AddDefinition(Definition *); void ExportDeclaration(Declaration *); void ExportIdentifier(const std::string &); - const std::map Declarations() const { return declarations; } - const std::set Exports() const { return exports; } + bool IsDeclared(const std::string &) const; + Declaration &GetDeclaration(const std::string &); + const Declaration &GetDeclaration(const std::string &) const; + bool IsDefined(const std::string &) const; + Definition &GetDefinition(const std::string &); + const Definition &GetDefinition(const std::string &) const; + + const std::map &Declarations() const { return declarations; } + const std::map &Definitions() const { return definitions; } + const std::set &Exports() const { return exports; } + +public: + void WriteHeader(std::ostream &) const; private: std::map declarations; + std::map definitions; std::set exports; }; @@ -154,6 +275,7 @@ private: namespace std { ostream &operator <<(ostream &, const loader::ParsedSource &); +ostream &operator <<(ostream &, const loader::Literal &); }