]> git.localhorst.tv Git - l2e.git/blobdiff - src/loader/ParsedSource.cpp
made high level parser errors a bit more expressive
[l2e.git] / src / loader / ParsedSource.cpp
index 13b1262f93410de52ce0f522bfb538f66531fa6a..c0d3a411782fea5e840b97720b2222c8d120a416 100644 (file)
@@ -7,6 +7,8 @@
 
 #include "ParsedSource.h"
 
+#include "utility.h"
+
 #include <ostream>
 #include <stdexcept>
 
@@ -88,7 +90,14 @@ Definition &ParsedSource::GetDefinition(const std::string &name) {
        if (i != definitions.end()) {
                return *i->second;
        } else {
-               throw runtime_error("undefined identifier " + name);
+               string msg("undefined identifier " + name);
+               map<string, Declaration *>::const_iterator i(declarations.find(name));
+               if (i != declarations.end()) {
+                       msg += ", declared as " + i->second->TypeName();
+               } else {
+                       msg += ", not declared";
+               }
+               throw runtime_error(msg);
        }
 }
 
@@ -97,7 +106,20 @@ const Definition &ParsedSource::GetDefinition(const std::string &name) const {
        if (i != definitions.end()) {
                return *i->second;
        } else {
-               throw runtime_error("undefined identifier " + name);
+               string msg("undefined identifier " + name);
+               map<string, Declaration *>::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<string>::const_iterator i(exports.begin()), end(exports.end()); i != end; ++i) {
+               out << GetDeclaration(*i).TypeName() << ' ' << *i << std::endl;
        }
 }
 
@@ -209,6 +231,16 @@ Literal::Literal(int number)
 
 }
 
+Literal::Literal(const string &dir, const string &path)
+: props(0)
+, str(CatPath(dir, path))
+, i1(0), i2(0)
+, i3(0), i4(0)
+, b(false)
+, type(STRING) {
+
+}
+
 Literal::Literal(const string &str)
 : props(0)
 , str(str)
@@ -428,6 +460,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;