]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programparser.cpp
Streamline interface declarations
[libs/gl.git] / source / programparser.cpp
index c6cdfd06246f1c14683919fcfec637b8adf85058..58649ec0d77cfb189aa352b003f65e6637109231 100644 (file)
@@ -81,14 +81,15 @@ Module &ProgramParser::parse(IO::Base &io)
 void ProgramParser::parse_source(Module &module)
 {
        cur_module = &module;
+       cur_context = &module.global_context;
        iter = source.begin();
-       Context *cur_context = &module.global_context;
        while(1)
        {
                while(Node *statement = parse_global_declaration())
                        cur_context->content.body.push_back(statement);
                cur_context->present = !cur_context->content.body.empty();
 
+               Context *prev_context = cur_context;
                parse_token();
                string token = parse_token();
                if(token.empty())
@@ -103,6 +104,7 @@ void ProgramParser::parse_source(Module &module)
                        cur_context = &module.fragment_context;
                else
                        throw runtime_error(format("Parse error at '%s': expected context identifier", token));
+               cur_context->previous = prev_context;
 
                for(; (iter!=source.end() && *iter!='\n'); ++iter) ;
        }
@@ -355,6 +357,8 @@ Node *ProgramParser::parse_statement()
                return parse_conditional();
        else if(token=="for")
                return parse_iteration();
+       else if(token=="passthrough")
+               return parse_passthrough();
        else if(token=="return")
                return parse_return();
        else if(is_qualifier(token) || is_type(token))
@@ -693,6 +697,20 @@ Iteration *ProgramParser::parse_iteration()
        return loop.release();
 }
 
+Passthrough *ProgramParser::parse_passthrough()
+{
+       expect("passthrough");
+       RefPtr<Passthrough> pass = new Passthrough;
+       if(cur_context->type==GEOMETRY)
+       {
+               expect("[");
+               pass->subscript = parse_expression();
+               expect("]");
+       }
+       expect(";");
+       return pass.release();
+}
+
 Return *ProgramParser::parse_return()
 {
        expect("return");