]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programparser.cpp
Refactor module and stage management
[libs/gl.git] / source / programparser.cpp
index d1826ad69e160a6b7aa30168d1daef3b02a58eb6..16299d20cf157f8281fc2face34d55a21712eee1 100644 (file)
@@ -58,11 +58,20 @@ ProgramParser::Operator ProgramParser::operators[] =
        { { 0 }, 18, NO_OPERATOR, LEFT_TO_RIGHT }
 };
 
+ProgramParser::ProgramParser():
+       module(0)
+{ }
+
+ProgramParser::~ProgramParser()
+{
+       delete module;
+}
+
 Module &ProgramParser::parse(const string &s)
 {
        source = s;
-       parse_source(main_module);
-       return main_module;
+       parse_source();
+       return *module;
 }
 
 Module &ProgramParser::parse(IO::Base &io)
@@ -74,37 +83,37 @@ Module &ProgramParser::parse(IO::Base &io)
                unsigned len = io.read(buffer, sizeof(buffer));
                source.append(buffer, len);
        }
-       parse_source(main_module);
-       return main_module;
+       parse_source();
+       return *module;
 }
 
-void ProgramParser::parse_source(Module &module)
+void ProgramParser::parse_source()
 {
-       cur_module = &module;
-       cur_stage = &module.shared;
+       delete module;
+       module = new Module;
+       cur_stage = &module->shared;
        iter = source.begin();
        while(1)
        {
                while(Node *statement = parse_global_declaration())
                        cur_stage->content.body.push_back(statement);
-               cur_stage->present = !cur_stage->content.body.empty();
 
-               Stage *prev_stage = cur_stage;
                parse_token();
                string token = parse_token();
                if(token.empty())
                        break;
-               else if(token=="global")
-                       cur_stage = &module.shared;
                else if(token=="vertex")
-                       cur_stage = &module.vertex_stage;
+                       module->stages.push_back(VERTEX);
                else if(token=="geometry")
-                       cur_stage = &module.geometry_stage;
+                       module->stages.push_back(GEOMETRY);
                else if(token=="fragment")
-                       cur_stage = &module.fragment_stage;
+                       module->stages.push_back(FRAGMENT);
                else
                        throw runtime_error(format("Parse error at '%s': expected stage identifier", token));
-               cur_stage->previous = prev_stage;
+
+               if(cur_stage->type!=SHARED)
+                       module->stages.back().previous = cur_stage;
+               cur_stage = &module->stages.back();
 
                for(; (iter!=source.end() && *iter!='\n'); ++iter) ;
        }