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();
}
expect(")");
left = parexpr;
}
+ else if(isdigit(token[0]) || token=="true" || token=="false")
+ {
+ RefPtr<Literal> literal = new Literal;
+ literal->token = parse_token();
+ left = literal;
+ }
else if(is_identifier(token))
{
RefPtr<VariableReference> var = new VariableReference;
unary->expression = parse_expression(oper->precedence);
left = unary;
}
- else if(isdigit(token[0]))
- {
- RefPtr<Literal> literal = new Literal;
- literal->token = parse_token();
- left = literal;
- }
else
throw runtime_error(format("Parse error at '%s': expected an expression", token));
}
BinaryExpression *ProgramParser::parse_binary(Expression *left, const Operator *oper)
{
- RefPtr<BinaryExpression> binary = new BinaryExpression;
+ RefPtr<BinaryExpression> binary = (oper->precedence==16 ? new Assignment : new BinaryExpression);
binary->left = left;
binary->oper = parse_token();
if(binary->oper=="[")
}
else
binary->right = parse_expression(oper->precedence+(oper->assoc==RIGHT_TO_LEFT));
- binary->assignment = (oper->precedence==16);
return binary.release();
}
string token = peek_token();
if(token=="{")
{
- func->definition = true;
+ func->definition = func.get();
parse_block(func->body, true);
}
else if(token==";")