Node *ProgramParser::parse_global_declaration()
{
string token = peek_token();
- if(token=="layout")
- return parse_layout();
+ if(token=="import")
+ return parse_import();
+ else if(token=="layout")
+ {
+ RefPtr<Layout> layout = parse_layout();
+ token = peek_token();
+ if(is_interface_qualifier(token) && peek_token(1)==";")
+ {
+ RefPtr<InterfaceLayout> iface_lo = new InterfaceLayout;
+ iface_lo->layout.qualifiers = layout->qualifiers;
+ iface_lo->interface = parse_token();
+ expect(";");
+ return iface_lo.release();
+ }
+ else
+ {
+ VariableDeclaration *var = parse_variable_declaration();
+ var->layout = layout.release();
+ return var;
+ }
+ }
else if(token=="struct")
return parse_struct_declaration();
else if(is_sampling_qualifier(token) || token=="const")
throw runtime_error(format("Syntax error at '%s': expected a statement", token));
}
+Import *ProgramParser::parse_import()
+{
+ if(cur_stage->type!=SHARED)
+ throw runtime_error("Imports are only allowed in the shared section");
+
+ expect("import");
+ RefPtr<Import> import = new Import;
+ import->module = parse_token();
+ expect(";");
+ return import.release();
+}
+
Layout *ProgramParser::parse_layout()
{
expect("layout");
expect(",");
}
expect(")");
- layout->interface = parse_token();
- expect(";");
return layout.release();
}
string token = peek_token();
if(token=="{")
{
- func->definition = true;
+ func->definition = func.get();
parse_block(func->body, true);
}
else if(token==";")