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())
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) ;
}
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))
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");