X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FParsedSource.cpp;h=042dd69c7f6aeca25003268f40da54672d7068d9;hb=cc3d698b8c1ad09d7a3f9e3f28bc84e0ac1735ea;hp=ec263042a68cdba8d7c9c27e43479ae9fee1455f;hpb=32b5ea1b0f05283eb588b2b069d667f7c36e84da;p=l2e.git diff --git a/src/loader/ParsedSource.cpp b/src/loader/ParsedSource.cpp index ec26304..042dd69 100644 --- a/src/loader/ParsedSource.cpp +++ b/src/loader/ParsedSource.cpp @@ -1,12 +1,7 @@ -/* - * ParsedSource.cpp - * - * Created on: Aug 26, 2012 - * Author: holy - */ - #include "ParsedSource.h" +#include "utility.h" + #include #include @@ -17,6 +12,12 @@ using std::vector; namespace loader { +ParsedSource::~ParsedSource() { + for (map::const_iterator i(declarations.begin()), end(declarations.end()); i != end; ++i) { + delete i->second; + } +} + void ParsedSource::AddDeclaration(Declaration *d) { map::iterator i(declarations.find(d->Identifier())); if (i != declarations.end()) { @@ -51,6 +52,79 @@ void ParsedSource::ExportIdentifier(const std::string &i) { } +bool ParsedSource::IsDeclared(const std::string &name) const { + return declarations.count(name); +} + +Declaration &ParsedSource::GetDeclaration(const std::string &name) { + map::const_iterator i(declarations.find(name)); + if (i != declarations.end()) { + return *i->second; + } else { + throw runtime_error("undeclared identifier " + name); + } +} + +const Declaration &ParsedSource::GetDeclaration(const std::string &name) const { + map::const_iterator i(declarations.find(name)); + if (i != declarations.end()) { + return *i->second; + } else { + throw runtime_error("undeclared identifier " + name); + } +} + +bool ParsedSource::IsDefined(const std::string &name) const { + return definitions.count(name); +} + +Definition &ParsedSource::GetDefinition(const std::string &name) { + map::const_iterator i(definitions.find(name)); + if (i != definitions.end()) { + return *i->second; + } else { + string msg("undefined identifier " + name); + map::const_iterator i(declarations.find(name)); + if (i != declarations.end()) { + msg += ", declared as " + i->second->TypeName(); + } else { + msg += ", not declared"; + } + throw runtime_error(msg); + } +} + +const Definition &ParsedSource::GetDefinition(const std::string &name) const { + map::const_iterator i(definitions.find(name)); + if (i != definitions.end()) { + return *i->second; + } else { + string msg("undefined identifier " + name); + map::const_iterator i(declarations.find(name)); + if (i != declarations.end()) { + msg += ", declared as " + i->second->TypeName(); + } else { + msg += ", not declared"; + } + throw runtime_error(msg); + } +} + +void ParsedSource::WriteHeader(std::ostream &out) const { + for (std::set::const_iterator i(exports.begin()), end(exports.end()); i != end; ++i) { + out << GetDeclaration(*i).TypeName() << ' ' << *i << std::endl; + } +} + + +Definition::~Definition() { + if (isLiteral) { + delete reinterpret_cast(value); + } else { + delete reinterpret_cast(value); + } +} + void Definition::SetValue(Literal *v) { value = v; isLiteral = true; @@ -63,7 +137,7 @@ void Definition::SetValue(PropertyList *v) { Literal *Definition::GetLiteral() { if (isLiteral) { - return (Literal *)value; + return reinterpret_cast(value); } else { throw runtime_error("tried to access properties as literal"); } @@ -71,7 +145,7 @@ Literal *Definition::GetLiteral() { const Literal *Definition::GetLiteral() const { if (isLiteral) { - return (Literal *)value; + return reinterpret_cast(value); } else { throw runtime_error("tried to access properties as literal"); } @@ -79,7 +153,7 @@ const Literal *Definition::GetLiteral() const { PropertyList *Definition::GetProperties() { if (!isLiteral) { - return (PropertyList *)value; + return reinterpret_cast(value); } else { throw runtime_error("tried to access literal value as property list"); } @@ -87,7 +161,9 @@ PropertyList *Definition::GetProperties() { const PropertyList *Definition::GetProperties() const { if (!isLiteral) { - return (PropertyList *)value; + return reinterpret_cast(value); + } else if (GetLiteral()->GetType() == Literal::OBJECT) { + return GetLiteral()->GetProperties(); } else { throw runtime_error("tried to access literal value as property list"); } @@ -108,11 +184,14 @@ Literal::Literal(const vector &v) , i3(0), i4(0) , b(false) , type(ARRAY_VALUES) { - + if (!v.empty()) { + typeName = v.front()->GetLiteral().GetTypeName(); + } } -Literal::Literal(const std::vector &pls) +Literal::Literal(const string &typeName, const vector &pls) : props(0) +, typeName(typeName) , propertyLists(pls) , i1(0), i2(0) , i3(0), i4(0) @@ -123,6 +202,7 @@ Literal::Literal(const std::vector &pls) Literal::Literal(bool b) : props(0) +, typeName("Boolean") , i1(0), i2(0) , i3(0), i4(0) , b(b) @@ -132,6 +212,7 @@ Literal::Literal(bool b) Literal::Literal(int r, int g, int b, int a) : props(0) +, typeName("Color") , i1(r), i2(g) , i3(b), i4(a) , b(false) @@ -141,6 +222,7 @@ Literal::Literal(int r, int g, int b, int a) Literal::Literal(int number) : props(0) +, typeName("Number") , i1(number), i2(0) , i3(0), i4(0) , b(false) @@ -148,8 +230,20 @@ Literal::Literal(int number) } +Literal::Literal(const string &dir, const string &path) +: props(0) +, typeName("Path") +, str(CatPath(dir, path)) +, i1(0), i2(0) +, i3(0), i4(0) +, b(false) +, type(STRING) { + +} + Literal::Literal(const string &str) : props(0) +, typeName("String") , str(str) , i1(0), i2(0) , i3(0), i4(0) @@ -160,6 +254,7 @@ Literal::Literal(const string &str) Literal::Literal(int x, int y) : props(0) +, typeName("Vector") , i1(x), i2(y) , i3(0), i4(0) , b(false) @@ -169,7 +264,7 @@ Literal::Literal(int x, int y) Literal::Literal(const string &typeName, PropertyList *properties) : props(properties) -, str(typeName) +, typeName(typeName) , i1(0), i2(0) , i3(0), i4(0) , b(false) @@ -177,6 +272,41 @@ Literal::Literal(const string &typeName, PropertyList *properties) } +Literal::Literal(const vector &s) +: props(0) +, script(s) +, i1(0), i2(0) +, i3(0), i4(0) +, b(false) +, type(SCRIPT) { + +} + +Literal::~Literal() { + switch (type) { + case ARRAY_VALUES: + for (vector::const_iterator i(values.begin()), end(values.end()); i != end; ++i) { + delete *i; + } + break; + case ARRAY_PROPS: + for (vector::const_iterator i(propertyLists.begin()), end(propertyLists.end()); i != end; ++i) { + delete *i; + } + break; + case OBJECT: + delete props; + break; + case SCRIPT: + for (vector::const_iterator i(script.begin()), end(script.end()); i != end; ++i) { + delete *i; + } + break; + default: + break; + } +} + const vector &Literal::GetValues() const { if (type == ARRAY_VALUES) { @@ -267,11 +397,7 @@ int Literal::GetY() const { } const string &Literal::GetTypeName() const { - if (type == OBJECT) { - return str; - } else { - throw runtime_error("tried to access type name of non-object literal"); - } + return typeName; } const PropertyList *Literal::GetProperties() const { @@ -282,6 +408,100 @@ const PropertyList *Literal::GetProperties() const { } } +const vector &Literal::GetScript() const { + if (type == SCRIPT) { + return script; + } else { + throw runtime_error("tried to access script of non-script literal"); + } +} + + +Value::~Value() { + if (isLiteral) { + delete literal; + } +} + +const Literal &Value::GetLiteral() const { + if (isLiteral) { + return *literal; + } else { + throw runtime_error("tried to access literal of identifier value"); + } +} + +const std::string &Value::GetIdentifier() const { + if (!isLiteral) { + return identifier; + } else { + throw runtime_error("tried to access identifier of literal value"); + } +} + + +ScriptToken::ScriptToken(const string &s, Type t) +: literal(0) +, str(s) +, type(t) { + if (type == LITERAL) { + throw runtime_error("cannot create script literal without literal"); + } +} + +ScriptToken::ScriptToken(Literal *l) +: literal(l) +, str() +, type(LITERAL) { + if (!literal) { + throw runtime_error("cannot create script literal without literal"); + } +} + +ScriptToken::~ScriptToken() { + delete literal; +} + +const string &ScriptToken::RegisterName() const { + if (type == REGISTER) { + return str; + } else { + throw runtime_error("access to register name of non-register script token"); + } +} + +const string &ScriptToken::CommandName() const { + if (type == COMMAND) { + return str; + } else { + throw runtime_error("access to command name of non-command script token"); + } +} + +const string &ScriptToken::Identifier() const { + if (type == IDENTIFIER) { + return str; + } else { + throw runtime_error("access to identifier of non-identifier script token"); + } +} + +const string &ScriptToken::Label() const { + if (type == LABEL) { + return str; + } else { + throw runtime_error("access to label of non-label script token"); + } +} + +const Literal *ScriptToken::GetLiteral() const { + if (type == LITERAL) { + return literal; + } else { + throw runtime_error("access to literal value of non-literal script token"); + } +} + } @@ -324,6 +544,9 @@ ostream &operator <<(ostream &out, const loader::Literal &l) { case loader::Literal::NUMBER: out << "number, " << l.GetNumber(); break; + case loader::Literal::PATH: + out << "path, \"" << l.GetString() << '"'; + break; case loader::Literal::STRING: out << "string, \"" << l.GetString() << '"'; break; @@ -333,6 +556,9 @@ ostream &operator <<(ostream &out, const loader::Literal &l) { case loader::Literal::OBJECT: out << "object of type " << l.GetTypeName(); break; + case loader::Literal::SCRIPT: + out << "script"; + break; } return out; }