X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramparser.cpp;h=16299d20cf157f8281fc2face34d55a21712eee1;hb=a29cc14162e911b36d18d1d1896216697c7dc0c1;hp=58649ec0d77cfb189aa352b003f65e6637109231;hpb=961715848c111907b5f443c5b545a429b40583e6;p=libs%2Fgl.git diff --git a/source/programparser.cpp b/source/programparser.cpp index 58649ec0..16299d20 100644 --- a/source/programparser.cpp +++ b/source/programparser.cpp @@ -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_context = &module.global_context; + delete module; + module = new Module; + cur_stage = &module->shared; iter = source.begin(); while(1) { while(Node *statement = parse_global_declaration()) - cur_context->content.body.push_back(statement); - cur_context->present = !cur_context->content.body.empty(); + cur_stage->content.body.push_back(statement); - Context *prev_context = cur_context; parse_token(); string token = parse_token(); if(token.empty()) break; - else if(token=="global") - cur_context = &module.global_context; else if(token=="vertex") - cur_context = &module.vertex_context; + module->stages.push_back(VERTEX); else if(token=="geometry") - cur_context = &module.geometry_context; + module->stages.push_back(GEOMETRY); else if(token=="fragment") - cur_context = &module.fragment_context; + module->stages.push_back(FRAGMENT); else - throw runtime_error(format("Parse error at '%s': expected context identifier", token)); - cur_context->previous = prev_context; + throw runtime_error(format("Parse error at '%s': expected stage identifier", token)); + + if(cur_stage->type!=SHARED) + module->stages.back().previous = cur_stage; + cur_stage = &module->stages.back(); for(; (iter!=source.end() && *iter!='\n'); ++iter) ; } @@ -701,7 +710,7 @@ Passthrough *ProgramParser::parse_passthrough() { expect("passthrough"); RefPtr pass = new Passthrough; - if(cur_context->type==GEOMETRY) + if(cur_stage->type==GEOMETRY) { expect("["); pass->subscript = parse_expression();